1. 程式人生 > >【Android開發】app升級報錯,解析包時出現錯誤(華為手機8.0系統)

【Android開發】app升級報錯,解析包時出現錯誤(華為手機8.0系統)

問題描述:

今天釋出app版本升級,碰到華為手機8.0系統,安裝升級的時候提示,解析包時出現問題。而其他手機都是正常的。而且當我的包沒有經過360加固的時候,也是可以去升級新版本,加固過後就不行了。

這個導致這個問題的原因有很多,我先把我這邊app的問題處理方案介紹給大家。

問題原因(360加固導致):

360加固會導致程式碼執行時間差異,我在startIntent後呼叫了killProcess(或者System.exit(0)),加固後killProcess可能提前執行了,導致安裝程序請求應用驗證fileprovider許可權失敗。so,去掉killProcess就行,但是我這裡要強制升級,如果去掉這句話的後,我安裝升級版本的時候點了取消就能還能進來,你可能會說檢測升級放onResume(),應該也是可以,但是這樣明顯對增加了後臺伺服器的壓力。

我的處理方法:

直接上程式碼吧

public static void install(Context context, File file, boolean force) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        } else {
            Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".updatefileprovider", file);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
        context.startActivity(intent);
        if (force) {
            //360加固後導致華為8.0系統,升級提示包解析報錯
            weakHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    System.exit(0);
                }
            },500);
        }
    }

主要是使用weakHandler(防止記憶體洩露的handler,優秀的工具)延遲System.exit(0)的呼叫時機,這樣System.exit(0)的呼叫時機被延遲了,系統安裝程序就有時間請求應用驗證fileprovider的許可權,這裡設定500毫秒,對計算機來說是完全足夠了,親測也是ok的,而對使用者而言,跳轉到應用安裝器時間也足夠。

PS:除錯的時候,需要打包低版本來測試升級,因為問題是發生在低版本,而不是升級的版本,最後升級的版本也要使用修改後的包,以免下次再碰到

------------------------------------------------------------------分割線----------------------------------------------------------------------

以下再來講講這個問題的其它可能的原因

以下這行程式碼放在了setFlags的前面,導致flag被覆蓋,建議都使用addFlags就不會覆蓋。

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);