[Android Q]
信号强度客制化代码位置:
NR(5G) | CellSignalStrengthNr.java updateLevel() |
LTE | MtkSignalStrength.java updateMtkLteLevel() |
WCDMA/UMTS | CellSignalStrengthWcdma.java updateLevel() |
TDSCDMA | CellSignalStrengthTdscdma.java updateLevel() |
GSM | CellSignalStrengthGsm.java updateLevel() |
CDMA | CellSignalStrengthCdma.java updateLevel() |
[信号上报过程简介]
modem底层信号数据 → modem L4中转化为Asu并上报信号强度dbm值 → 在AP端将Asu或dbm值映射成信号格数从底层物理信号参数,到上层信号格显示的流程大致是:
Asu与信号强度的对应关系由modem L4决定,此部分的代码建议不要做任何的修改。
[信号强度AT命令格式说明]
Modem上报信号强度的格式:
3G modem:
+ECSQ: <asu>, <ber>, <rssi> (2G网络)
+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no> (3G网络)
4G modem:
+ECSQ: <asu>, <ber>, <rssi>, <rscp>,1,1,1,<act> (2G网络)
+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>,1,1, <act> (3G网络)
+ECSQ: <rsrq>, <rsrp>,1,1,1,<rsrq_qdbm >,<rsrp_qdbm> <act> (4G网络)
L版本、以及以后版本
NetworkControllerImpl.java (frameworks\base\packages\systemui\src\com\android\systemui\statusbar\policy)的updateTelephonySignalStrength()函数会根据获取到的信号强度来设置状态栏信号格的图标。里面会执行mLastSignalLevel = iconLevel = mSignalStrength[slotId].getLevel(); 语句。
这个 getLevel() 函数定义在SignalStrength.java (frameworks\base\telephony\java\android\telephony)中,用于划分信号格区间。在这个函数里面:
(1)LTE会执行 getLteLevel() 函数; getLteLevel()函数会执行 rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);语句,并返回 rsrpIconLevel 的值,作为信号格图标的level,即1格、2格之类。
(2)2G、3G会执行getGsmLevel()函数; getGsmLevel()函数会执行 level = ssExt.mapGsmSignalLevel(asu, mGsmRscpQdbm); 语句,并返回 level 的值,作为信号格图标的level。
上面的 ssExt 对象涉及到当前项目配置的是OM版本、OP01版本等。 不同版本的实现有所不同。
请根据实际项目配置的版本,查看对应的代码文件。
CMCC版本的代码文件是:/vendor/mediatek/proprietary/operator/OP01/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP01.java
CU版本的代码文件是:/vendor/mediatek/proprietary/operator/OP02/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP02.java
Open market版本的代码文件是: /vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java
JB/JB2/JB3/JB5/KK1MP1
1、 信号的物理参数会通过AT+ECSQ上报给AP端,格式为:
AT< +ECSQ: <asu>, <ber>, <rssi> (2G网络)
AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no> (3G网络)
其中<rssi>, <rscp>, <ec/no>这几个物理参数上报时单位为qdbm,换算为dbm的公式为:dbm=qdbm/4
2、SignalStrength.java中使用IServiceStateExt作为不同运营商客制化的接口。
Ø 对于普通版本:IServiceStateExt的实现为ServiceStateExt.java
Ø 对于中国移动(OP01)版本:IServiceStateExt的实现为ServiceStateExtOP01.java
步骤1:请修改ServiceStateExtXXX.java中的mapGsmSignalDbm(int GsmRscpQdbm,int asu)接口为以下形式,以方便我们接下来的客制化。
public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){
int dBm;
//mtk add (这部分在KK版本中已经包含)
if(mGsmRscpQdbm < 0 && mGsmRscpQdbm ! = -1)
dBm = GsmRscpQdbm / 4; // Return raw value for 3G network.
else
//mtk add end
dBm = -113 + (2 * asu);
return dBm;
}
KK1MP3--4G(mtk 对4G部分只使用到了Rsrp的部分来计算信号强度)
mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength){
......
if(mLteRsrp > -44) rsrpIconLevel = -1;
else if(mLteRsrp >= -85) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GREAT;
else if(mLteRsrp >= -95) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GOOD;
else if(mLteRsrp >= -105) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_MODERATE;
else if(mLteRsrp >= -115) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_POOR;
else if(mLteRsrp >= -140) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
步骤2:SignalStrength.java中修改getGsmLevel():
public int getGsmLevel() {
int level;
// ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
// asu = 0 (-113dB or less) is very weak
// signal, its better to show 0 bars to the user in such cases.
// asu = 99 is a special case, where the signal strength is unknown.
int asu = getGsmSignalStrength();
int dBm = getGsmDbm(); //mtk add
boolean is3G = (mGsmRscpQdbm < 0 && mGsmRscpQdbm ! = -1) ? true : false; //mtk add (这部分在KK版本中已经包含)
try{
//mtk add (这部分在KK版本中已经包含)
//level = mServiceStateExt.mapGsmSignalLevel(asu);
level = mServiceStateExt.mapGsmSignalLevel(is3G, dBm, asu);
//mtk add end
} catch (Exception e){
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD;
else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE;
else level = SIGNAL_STRENGTH_POOR;
}
if (DBG) log("getGsmLevel=" + level);
return level;
}
步骤3:在ServiceStateExtXXX.java中添加mapGsmSignalLevel (boolean is3G, int dBm,int asu),做信号格mapping:
a.区分3G网络与2G网络
可以通过判断函数参数is3G是否是3G网络,若是3G网络的话为true,反之则是2G网络。
b.使用asu与icon level来匹配
利用传入的asu参数,根据自己信号格标准修改代码。
c.使用dbm与icon level来匹配
利用传入的dBm参数,根据自己信号格标准修改代码。
Example:使用asu作为参数计算WCDMA/GSM信号