那些我们解过的bug之换状态栏没有sim卡的图标

这里写图片描述

问题描述:

测试提了一个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,我们只要根据代码一步一步分析,是可以查找问题所在,一般都可以解决的。

这要求开发者要以代码为基本出发点,借助开发经验,综合自己的逻辑分析能力,对其实施一次精准的“外科手术”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值