1、问题描述
客户apk升级时,会概率性的遇到升级apk升级失败的问题,抓log发现错误提示如下图:我看到错误以为是apk下载的有问题,但是当我把apk pull出来后,使用adb安装是可以直接安装的,那说明下载的资源是没有问题的,这看来还是系统有问题(android 7)。
12-04 08:27:27.926 D/ ( 2619): Zip: EOCD not found, /storage/emulated/0/Download/test.apk is not zip
12-04 08:27:27.926 W/zipro ( 2619): Error opening archive /storage/emulated/0/Download/test.apk: Invalid file
12-04 08:27:27.926 D/asset ( 2619): failed to open Zip archive '/storage/emulated/0/Download/test.apk'
12-04 08:27:27.929 W/PackageInstaller( 2619): Parse error when parsing manifest. Discontinuing installation
2、问题分析
搜索系统关键字Zip: EOCD not found, 怀疑是apk解析出现问题,但是apk解析流程都是一样的。咨询了其他大神,建议可以手动释放下系统缓存试试,使用/proc/sys/vm/drop_caches 这个值可以释放缓存,echo 3 >/proc/sys/vm/drop_caches 输入了提示无权限,drop_caches权限修改后,再次遇到安装apk提示失败后,执行echo 3 >/proc/sys/vm/drop_caches,后重新安装,安装成功,找不到解析出问题的原因,只能用这种方法。
3、解决方法
3.1、修改/proc/sys/vm/drop_caches权限
kernel/kernel/sysctl.c文件下
{
.procname = "drop_caches",
.data = &sysctl_drop_caches,
.maxlen = sizeof(int),
.mode = 0666,
.proc_handler = drop_caches_sysctl_handler,
.extra1 = &one,
.extra2 = &four,
},
mode 从0644 改为0666即可
3.2 代码实现
apk安装时调用PackageInstallerActivity.java,所以执行echo 3 >/proc/sys/vm/drop_caches可以添加到这个文件中,如果解析失败,可以先执行清除缓存操作后再重新解析一遍。
case SCHEME_FILE: {
File sourceFile = new File(packageUri.getPath());
PackageParser.Package parsed = PackageUtil.getPackageInfo(sourceFile);
+//if parsed error try again
+if(parsed == null) {
+ Slog.d(TAG,"drop cached ,try again");
+ File dropCached=new File("/proc/sys/vm/drop_caches");
+ try {
+ RandomAccessFile rdf = null;
+ rdf = new RandomAccessFile(dropCached, "rw");
+ rdf.writeBytes("3");
+ rdf.close();
+ } catch (IOException re) {
+ Log.e(TAG, "IO Exception");
+ re.printStackTrace();
+ }
+ parsed = PackageUtil.getPackageInfo(sourceFile);
+}
// Check for parse errors
if (parsed == null) {