问题描述:
测试提了一个bug:
不插SIM卡开机,状态栏SIM卡图标偏大,请改为与其他图标显示大小一致
bug重现:
我们看了一下,在手机状态栏中没有sim卡的图标有一点确实是有一点大。
初步分析:
这是一个非常细节的bug,根据开发经验,这应该就是一张图片,我们只要找到这张图片,将其改小,就OK了。
哈哈,应该非常简单。
bug解决:
根据开发经验,此图片应该就是在/frameworks/base/packages/SystemUI目录下,我直接到此目录下res/drawable-hdpi,查看图片。啊噢,找遍目录,没有找到此图片。
难道目录不对。
好,我再去frameworks/base/packages/Keyguard目录下查找,还是没有找到。好吧,我再去frameworks/base/core/res/res/drawable-hdpi,见鬼了,还是没有。
不对啊,此图片只有可能在此三个地方,但是都没有找到。
怎么办,我猜此张图片可能是被项目覆盖了,我在整个工程中查找SystemUI:
find ./ -name “SystemUI”
再把所有的SystemUI目录下查找此张图片,还是没有找到此宝宝。
见鬼了………
最后,我问了一下旁边的一位同事,和他说了一下当前的情况,他猜测这张图片可能不是一张图片,应该是一张矢量图片,他找了一下,猜测可能是这张图片:
frameworks/base/packages/SystemUI/res/drawable/ic_qs_no_sim.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="28.0"
android:viewportHeight="28.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19.0,5.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0l-7.0,0.0L7.7,5.3L19.0,16.7L19.0,5.0zM3.7,3.9L2.4,5.2L5.0,7.8L5.0,19.0c0.0,1.1 0.9,2.0 2.0,2.0l10.0,0.0c0.4,0.0 0.7,-0.1 1.0,-0.3l1.9,1.9l1.3,-1.3L3.7,3.9z"/>
</vector>
我试了一下,修改此文件:
android:width="20dp"
android:height="20dp"
确实是此文件,并且大小改小了,效果如下:
代码分析
那么为什么此xml就是我们要找的图片:
在./frameworks/base/packages/SystemUI/res/values/arrays.xml文件,我们定义了一个没有sim卡图片的数组:
<string-array name="multi_no_sim">
<item>drawable/ic_qs_no_sim</item>
<item>drawable/ic_qs_no_sim</item>
<item>drawable/ic_qs_no_sim</item>
</string-array>
在./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java文件中:
mNoSimArray = mRes.getStringArray(
R.array.multi_no_sim);
再查找到mNoSimArray:
static int getNoSimIcon(int sub){
if (mNoSimArray == null) {
return 0;
}
String resName = mNoSimArray[sub];
log(TAG, "no sim icon name: " + resName);
int resId = mRes.getIdentifier(resName, null, NS);
return resId;
}
再查找getNoSimIcon:
在./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java文件:
private final void updateSimIcon() {
if (DEBUG) Log.d(TAG,"In updateSimIcon simState= " + mSimState);
if (mSimState == IccCardConstants.State.ABSENT) {
mNoSimIconId = TelephonyIcons.getNoSimIcon();
} else {
mNoSimIconId = 0;
}
refreshViews();
}
再查找:mNoSimIconId
cluster.setMobileDataIndicators(
mHasMobileDataFeature,
mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId,
mMobileActivityIconId,
mDataTypeIconId,
mContentDescriptionPhoneSignal,
mContentDescriptionDataType,
mDataTypeIconId == TelephonyIcons.ROAMING_ICON,
isTypeIconWide(mDataTypeIconId),
mNoSimIconId);
再查找方法:setMobileDataIndicators
在./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java文件中:
public void setMobileDataIndicators(boolean visible, int strengthIcon,
int activityIcon, int typeIcon, String contentDescription,
String typeContentDescription, boolean roaming,
boolean isTypeIconWide, int noSimIcon) {
mMobileVisible = visible;
mMobileStrengthId = strengthIcon;
mMobileActivityId = activityIcon;
mMobileTypeId = typeIcon;
mMobileDescription = contentDescription;
mMobileTypeDescription = typeContentDescription;
mRoaming = roaming;
mIsMobileTypeIconWide = isTypeIconWide;
mNoSimIconId = noSimIcon;
再查找mNoSimIconId:
private void updateMobile() {
mMobile.setImageResource(mMobileStrengthId);
mMobileType.setImageResource(mMobileTypeId);
mMobileActivity.setImageResource(mMobileActivityId);
mNoSimSlot.setImageResource(mNoSimIconId);
在查找mNoSimSlot:
mNoSimSlot = (ImageView) findViewById(R.id.no_sim);
mNoSimSlot就是显示没有sim卡图片的控件。
总结:
再回首此问题解决的过程,用无奈的口吻自我调侃一下:“有点意思”。
为什么会有这么多波折,其实非常简单,方向不对!
根据开发验证,我以为会是一张实实在在的图片,但是最后的结果告诉我们,这是一张矢量图片。
方向的不对,导致了缘木求鱼,当然是空折腾,竹篮打水一场空。
所以,开发经验是一个双面的东东,平时好好的利用有事半功倍的效果,但是如果被开发经验束缚了,那会导致了死循环。
还有一个就是对于这些具体细节的bug,我们只要根据代码一步一步分析,是可以查找问题所在,一般都可以解决的。
这要求开发者要以代码为基本出发点,借助开发经验,综合自己的逻辑分析能力,对其实施一次精准的“外科手术”。