问题描述:
今天发布app版本升级,碰到华为手机8.0系统,安装升级的时候提示,解析包时出现问题。而其他手机都是正常的。而且当我的包没有经过360加固的时候,也是可以去升级新版本,加固过后就不行了。
这个导致这个问题的原因有很多,我先把我这边app的问题处理方案介绍给大家。
问题原因(360加固导致):
360加固会导致代码执行时间差异,我在startIntent后调用了killProcess(或者System.exit(0)),加固后killProcess可能提前执行了,导致安装进程请求应用验证fileprovider权限失败。so,去掉killProcess就行,但是我这里要强制升级,如果去掉这句话的后,我安装升级版本的时候点了取消就能还能进来,你可能会说检测升级放onResume(),应该也是可以,但是这样明显对增加了后台服务器的压力。
从这个博客知道的:http://bbs.360.cn/thread-15488054-1-1.html
我的处理方法:
直接上代码吧
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的,而对用户而言,跳转到应用安装器时间也足够。
WeakHandler来自github:https://github.com/lianzhan/weakHandler
PS:调试的时候,需要打包低版本来测试升级,因为问题是发生在低版本,而不是升级的版本,最后升级的版本也要使用修改后的包,以免下次再碰到
------------------------------------------------------------------分割线----------------------------------------------------------------------
以下再来讲讲这个问题的其它可能的原因
以下这行代码放在了setFlags的前面,导致flag被覆盖,建议都使用addFlags就不会覆盖。
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
博客:https://blog.csdn.net/qq_32452623/article/details/78924113
如果以上还解决不了你的问题,可以看下这篇博客:https://www.jianshu.com/p/04e14a1e957b