記錄兩個神奇的android bug

最近,收到兩家大客戶反饋的bug,都是咱們android版本sdk報的bug。既然大客戶給咱們報bug了,那必須十分重視對待。java

大客戶必須重點關照.jpg

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

初看一下覺得是網絡權限的問題,難道客戶沒有添加網絡的權限,這顯然不可能。android

從stackoverflow上搜到這篇文章頗有幫助。大體瞭解出現這個bug的緣由。緩存

首先,android.permission.INTERNET並非惟一的網絡相關權限,還須要聲明一下android.permission.ACCESS_NETWORK_STATE這個權限。這個權限對於sdk而言,我仍是很糾結地,由於不少客戶不必定會使用到這個權限。若是我多添加了這個權限的判斷會致使一些客戶沒法使用sdk。網絡

其次,在root過的設備上,用戶能夠經過工具來修改在運行時授予已安裝應用的權限。同時,在某些定製的rom上也能夠這麼作的。app

再次,Android 6.0之後引入了全新的權限管理機制,稱爲運行時權限。它容許用戶更多地控制授予的權限(也容許選擇性授予),或容許一個撤銷已授予的權限,無需應用程序刪除。框架

知道這個bug產生的緣由以後,那咱們來解決問題吧。svg

解決方案:

在調用網絡框架以前,把請求網絡的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);
    }

添加了完權限的判斷以後,能夠把影響降到最低。spa

第兩個bug,java.lang.RuntimeException: Package manager has died

這個bug也很奇葩,是這段代碼形成的.net

/** * 得到當前應用的版本號 * * @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了,讓我先去哭一下子去。固然這些是不可能的,寫代碼仍是必須嚴謹再嚴謹啊。

本文同步分享在 博客「fengzhizi715」(JianShu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索