工作中,客户要求对信号格显示偏弱不够友好为由,提出修改,要求使其显示信号强一些。
在此记录
一问题:
修改系统sim卡显示的信号格,在设备其他配置不变的情况下,使其信号格显示比原有的要优秀
二 分析
我们在Framework/base 下找到控制信号格显示的地方,修改阈值使其显示变更
涉及类如下:
/frameworks/base/telephony/java/android/telephony/CellSignalStrengthNr.java
/frameworks/base/telephony/java/android/telephony/SignalStrength.java
1 确定当前信号格显示的判断依据:
PS C:\Users\86186> adb shell dumpsys carrier_config | findStr parameters_use_for_5g_nr_signal_bar_int
parameters_use_for_5g_nr_signal_bar_int = 1
parameters_use_for_5g_nr_signal_bar_int = 1
执行如上指令,返回值是1
2 我们在CellSignalStrengthNr中发现如下:
/**
* Indicates SSRSRP is considered for {@link #getLevel()} and reporting from modem.
*
* @hide
*/
public static final int USE_SSRSRP = 1 << 0; //十进制 1
/**
* Indicates SSRSRQ is considered for {@link #getLevel()} and reporting from modem.
*
* @hide
*/
public static final int USE_SSRSRQ = 1 << 1;//十进制 2
/**
* Indicates SSSINR is considered for {@link #getLevel()} and reporting from modem.
*
* @hide
*/
public static final int USE_SSSINR = 1 << 2;//十进制 4
根据设备返回值是1,说明系统信号格使用的是SSRSRP属性判断
先解释下 这三个属性的意义
RSRP(Reference Signal Received Power,参考信号接收功率)
RSRQ(Reference Signal Received Quality,参考信号接收质量)
SINR(Signal to Interference plus Noise Ratio,信号干扰噪声比)
3 那么系统是在哪里设置的呢,
/androidDev/android_source/POCft18/frameworks/base/telephony/java/android/telephony/CarrierConfigManager.java
..............
public static final class Bsf {
............
sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY,
new int[] {
-128, /* SIGNAL_STRENGTH_POOR */
-118, /* SIGNAL_STRENGTH_MODERATE */
-108, /* SIGNAL_STRENGTH_GOOD */
-98, /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putIntArray(KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY,
new int[] {
-20, /* SIGNAL_STRENGTH_POOR */
-17, /* SIGNAL_STRENGTH_MODERATE */
-14, /* SIGNAL_STRENGTH_GOOD */
-11 /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putIntArray(KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY,
new int[] {
-3, /* SIGNAL_STRENGTH_POOR */
1, /* SIGNAL_STRENGTH_MODERATE */
5, /* SIGNAL_STRENGTH_GOOD */
13 /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putIntArray(KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY,
new int[] {
-115, /* SIGNAL_STRENGTH_POOR */
-105, /* SIGNAL_STRENGTH_MODERATE */
-95, /* SIGNAL_STRENGTH_GOOD */
-85 /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putIntArray(KEY_5G_NR_SSRSRP_THRESHOLDS_INT_ARRAY,
// Boundaries: [-140 dB, -44 dB]
new int[] {
-110, /* SIGNAL_STRENGTH_POOR */
-90, /* SIGNAL_STRENGTH_MODERATE */
-80, /* SIGNAL_STRENGTH_GOOD */
-65, /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putIntArray(KEY_5G_NR_SSRSRQ_THRESHOLDS_INT_ARRAY,
// Boundaries: [-43 dB, 20 dB]
new int[] {
-31, /* SIGNAL_STRENGTH_POOR */
-19, /* SIGNAL_STRENGTH_MODERATE */
-7, /* SIGNAL_STRENGTH_GOOD */
6 /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putIntArray(KEY_5G_NR_SSSINR_THRESHOLDS_INT_ARRAY,
// Boundaries: [-23 dB, 40 dB]
new int[] {
-5, /* SIGNAL_STRENGTH_POOR */
5, /* SIGNAL_STRENGTH_MODERATE */
15, /* SIGNAL_STRENGTH_GOOD */
30 /* SIGNAL_STRENGTH_GREAT */
});
sDefaults.putInt(KEY_PARAMETERS_USE_FOR_5G_NR_SIGNAL_BAR_INT,
CellSignalStrengthNr.USE_SSRSRP);//5g信号控制类型设置
...........
三 方案:
/androidDev/android_source/POCft18/frameworks/base/telephony/java/android/telephony/CellSignalStrengthNr.java 下
。。。。。。。。。。。。。。。。
/** @hide */
@Override
public void updateLevel(PersistableBundle cc, ServiceState ss) {
if (cc == null) {
mParametersUseForLevel = USE_SSRSRP;
} else {
mParametersUseForLevel = cc.getInt(
CarrierConfigManager.KEY_PARAMETERS_USE_FOR_5G_NR_SIGNAL_BAR_INT, USE_SSRSRP);
mSsRsrpThresholds = cc.getIntArray(
CarrierConfigManager.KEY_5G_NR_SSRSRP_THRESHOLDS_INT_ARRAY);
if (VDBG) {
Rlog.i(TAG, "Applying 5G NR SSRSRP Thresholds: "
+ Arrays.toString(mSsRsrpThresholds));
}
mSsRsrqThresholds = cc.getIntArray(
CarrierConfigManager.KEY_5G_NR_SSRSRQ_THRESHOLDS_INT_ARRAY);
if (VDBG) {
Rlog.i(TAG, "Applying 5G NR SSRSRQ Thresholds: "
+ Arrays.toString(mSsRsrqThresholds));
}
mSsSinrThresholds = cc.getIntArray(
CarrierConfigManager.KEY_5G_NR_SSSINR_THRESHOLDS_INT_ARRAY);
if (VDBG) {
Rlog.i(TAG, "Applying 5G NR SSSINR Thresholds: "
+ Arrays.toString(mSsSinrThresholds));
}
}
int ssRsrpLevel = SignalStrength.INVALID;
int ssRsrqLevel = SignalStrength.INVALID;
int ssSinrLevel = SignalStrength.INVALID;
if (isLevelForParameter(USE_SSRSRP)) {
int rsrpBoost = 0;
if (ss != null) {
rsrpBoost = ss.getArfcnRsrpBoost();
}
ssRsrpLevel = updateLevelWithMeasure(mSsRsrp + rsrpBoost, mSsRsrpThresholds);
if (VDBG) {
Rlog.i(TAG, "Updated 5G NR SSRSRP Level: " + ssRsrpLevel);
}
}
if (isLevelForParameter(USE_SSRSRQ)) {
ssRsrqLevel = updateLevelWithMeasure(mSsRsrq, mSsRsrqThresholds);
if (VDBG) {
Rlog.i(TAG, "Updated 5G NR SSRSRQ Level: " + ssRsrqLevel);
}
}
if (isLevelForParameter(USE_SSSINR)) {
ssSinrLevel = updateLevelWithMeasure(mSsSinr, mSsSinrThresholds);
if (VDBG) {
Rlog.i(TAG, "Updated 5G NR SSSINR fff Level: " + ssSinrLevel);
}
}
// Apply the smaller value among three levels of three measures.
- // mLevel = Math.min(Math.min(ssRsrpLevel, ssRsrqLevel), ssSinrLevel);
+ int rsrpLevel;
+ if (mSsRsrp >= -98) {
+ rsrpLevel = SIGNAL_STRENGTH_GREAT; // 满格
+ } else if (mSsRsrp >= -108) {
+ rsrpLevel = SIGNAL_STRENGTH_GOOD;
+ } else if (mSsRsrp >= -118) {
+ rsrpLevel = SIGNAL_STRENGTH_MODERATE;
+ } else if (mSsRsrp >= -128) {
+ rsrpLevel = SIGNAL_STRENGTH_POOR;
+ } else {
+ rsrpLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ }
+ Rlog.i(TAG, "Updated 5G mSsRsrp: " + mSsRsrp + " ;rsrpLevel:" + rsrpLevel);
+ mLevel = rsrpLevel;
}
。。。。。。。