【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);