记录两个神奇的android bug

简介: 记录两个神奇的android bug

最近,收到两家大客户反馈的bug,都是我们android版本sdk报的bug。既然大客户给我们报bug了,那必须十分重视对待。

image.png

第一个bug,SecurityException: Permission denied (missing INTERNET permission?)



初看一下以为是网络权限的问题,难道客户没有添加网络的权限,这显然不可能。

从stackoverflow上搜到这篇文章很有帮助。大致了解出现这个bug的原因。


首先,android.permission.INTERNET并不是唯一的网络相关权限,还需要声明一下android.permission.ACCESS_NETWORK_STATE这个权限。这个权限对于sdk而言,我还是很纠结地,因为很多客户不一定会使用到这个权限。如果我多添加了这个权限的判断会导致一些客户无法使用sdk。


其次,在root过的设备上,用户可以通过工具来修改在运行时授予已安装应用的权限。同时,在某些定制的rom上也可以这么做的。


再次,Android 6.0以后引入了全新的权限管理机制,称为运行时权限。它允许用户更多地控制授予的权限(也允许选择性授予),或允许一个撤销已授予的权限,无需应用程序删除。


知道这个bug产生的原因之后,那我们来解决问题吧。


解决方案:



在调用网络框架之前,把请求网络的request放入框架中http请求的队列之前,先判断一下权限是否已经添加:


<uses-permission android:name="android.permission.INTERNET" />

public void addToRequestQueue(Request req) {
        if (!Util.checkPermission(MWConfiguration.getContext(), "android.permission.INTERNET")) {
            return;
        }
        getRequestQueue().addRequest(req);
    }


添加了完权限的判断之后,可以把影响降到最低。


第两个bug,java.lang.RuntimeException: Package manager has died



这个bug也很奇葩,是这段代码造成的

/**
     * 获得当前应用的版本号
     *
     * @param context context
     * @return App Version
     */
    public static String getAppVersion(Context context) {
        String result = "1.0";
        PackageInfo info = null;
        try {
            info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        } catch (NameNotFoundException ignored) {
        }
        if (info != null) {
            result = info.versionName;
        }
        return result;
    }


初看一下,没有任何问题。但为何会引起了异常呢?


它是一个Binder调用,造成这个的原因是因为发生了RemoteException。


如果Binder的使用超出了一个进程的限制就会抛TransactionTooLargeException这个异常。


通过查看源码发现,在一个进程中Binder的大小大约是1M。如果这时候恰巧在用getPackageManager()做其他事情,就会提示Package manager has died。


解决方案:



第一种办法,在getAppVersion()方法前加上synchronized。其他用到context.getPackageManager()的地方也尽量加上synchronized


第二种办法,第一次获取完appVersion这种数据后放在一个地方缓存起来。以后每次直接读取缓存中的数据。


总结



写sdk的上辈子都是折翼天使,希望以后再也不要写sdk了,让我先去哭一会儿去。当然这些是不可能的,写代码还是必须严谨再严谨啊。

相关文章
|
7月前
|
Android开发
【Bug】Android resource linking failed和error: failed linking references.
【Bug】Android resource linking failed和error: failed linking references.
|
缓存 安全 开发工具
Android 解决bug:Android studio 运行、编译项目时导致电脑死机
Android 解决bug:Android studio 运行、编译项目时导致电脑死机
930 0
|
Android开发
Bug日志(四)——Android 防止多次点击(另解决多个列表子项点击)
在用户使用 应用的时候,经常会出现点击过快且多次点击同一控件的情况, 一方面这是因为应用或手机当前有些卡顿,网络卡啥的 另一方面也可能是由于很多应用并没有设置按钮点击时的 selector 或者其它按钮响应方式(例如点击按钮时按钮放大,常见于游戏),导致用户误认为没有点击到当前按钮。(比如使用selector再点击后更换背景颜色,图片等等)
|
XML Android开发 数据格式
Bug日志(二)-Android网路请求图片地址图片不显示
Bug日志(二)-Android网路请求图片地址图片不显示
|
算法 Java Android开发
Android 以太网子网掩码长度 bug 修复
Android 以太网子网掩码长度 bug 修复
175 0
|
前端开发 JavaScript 小程序
印象最深的一个bug——使用uinapp做混合开发静态图片在安卓端不显示
这几天一直在做混合开发,使用的是uni-app开发的,一套代码,多端使用,适用于各个平台。听起来很完美,使用过程不可多说,不知道是因为我们的需求变态还是我们团队两端技术水平太差。总之,开发联调过程十分痛苦,加上uniapp的调试十分困难,一度让我们两端互怼。这其中我印象最深的一个bug就是在对接联调总出现的
1665183 33
印象最深的一个bug——使用uinapp做混合开发静态图片在安卓端不显示
|
API Android开发
MIUI 系统 BUG,Android 调用相机崩溃?将拍照适配方案进行到底!
写在前面 昨天也是为大家分享了 7.0 相机适配,今天就来为大家讲讲 Android 之相机适配。 提起 Android 调用系统相机拍照上传图片或者是显示图片,想必任何一位开发 Android 的朋友都不会陌生,基本这个功能已经涵盖各个应用了,今天,我就来给大家聊聊网上并不多见却有经常听到大家吐槽的问题。
2043 0
|
Android开发
Android 解决bug:异常提示"ListView cannot be cast to android.widget.BaseAdapter "
Android 解决bug:异常提示"ListView cannot be cast to android.widget.BaseAdapter "
504 0
Android 解决bug:异常提示"ListView cannot be cast to android.widget.BaseAdapter "
|
开发工具 Android开发 git
解决Bug:Android Studio类名误报红问题
解决Bug:Android Studio类名误报红问题
702 0
解决Bug:Android Studio类名误报红问题
|
Android开发 Kotlin
解决Bug:win10升级AndroidStudio4.1时出现“Missing essential plugin: org.jetbrains.android……”
解决Bug:win10升级AndroidStudio4.1时出现“Missing essential plugin: org.jetbrains.android……”
514 0
解决Bug:win10升级AndroidStudio4.1时出现“Missing essential plugin: org.jetbrains.android……”