应用更新时apk包解析错误
bug场景:
应用内升级下载apk完成后安装,6.0及以下的手机会报解析包错误,7.0及以上的手机是没问题的。开始以为是v1,v2签名问题导致的,但是我用浏览器下载下来的安装包是能够正确安装的。排除v1,v2签名的问题。研究半天终于发现问题所在:
原来我把下载的apk文件放在了getCacheDir().getAbsolutePath()的目录下,而不是sd中,这就导致apk文件没有相应的权限,不能被正确解析。
参考:解决APK下载到Cache目录安装提示“解析安装包失败”的问题
解决方案1:
调用安装的时候给文件授权:
public static void install(Context context, File apkFile) { try { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setDataAndType(FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apkFile), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); chmod("777", apkFile.getAbsolutePath());//apk放在cache文件中,需要获取读写权限 } App.getApp().startActivity(intent); } catch (Exception e) { HbLogger.log("---> install apk fail :" + e.getMessage()); } } public static void chmod(String permission, String path) { try { String command = "chmod " + permission + " " + path; Runtime runtime = Runtime.getRuntime(); runtime.exec(command); } catch (IOException e) { e.printStackTrace(); } }
解决方案2:
将下载的apk放在sd文件中:Environment.getExternalStorageDirectory().getAbsolutePath()
亲测两种方案均能解决问题。
补充:
可能有的小伙伴有疑惑了:为什么7.0以上的手机没有文件授权也能正确解析安装呢?这就涉及到7.0以上文件权限的变更了,查看以上代码可知,在安装的时候我做了版本判断,如果是7.0以上的手机,会采用新的权限机制安装。所以不会出现解析错误的bug,在此再贴一下代码: