小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Android cache目录下应用内更新失败
问题场景
前段时间发现了一个很神奇的问题,在安卓6.0的设备上,将apk下载到cache目录下,常规用代码进行更新的时候,却发现提示“解析错误-解析软件包时出现问题”。
刚开始怀疑是apk下载时损坏的问题。
我尝试获取cache目录下的apk文件与正常的apk文件进行对比,没有什么问题。
使用adb install 也可以正常安装。
然后我发现,在Android设备6.0上, getFilesDir().getAbsolutePath()
目录下的apk安装时提示 “解析错误-解析软件包时出现问题”;
Environment.getExternalStorageDirectory().getPath()
目录下却可以正常安装。
而在7.0及以上的设备中,无论在哪个目录下都可以正常安装。
问题原因
从错误日志中看出这些关键词,PermissonDenied,failed to open, Unable to read;说明软件是没有权限执行cache目录下的apk文件。
6.0 没有对该apk的运行权限。
具体我也不明白为什么会出现这种情况,看到资料说7.0对权限做出了变化,按说权限的变化会越来越严格才对,有知道原因的小伙伴可以回复下。
问题解决
方法一(尝试失败):
既然没有权限,那就是加权限,查到资料看到需要在安装apk方法前,添加chmod("777", apkFile.getAbsolutePath())
,我这里尝试了并没有成功。
chmod("777", apkFile.getAbsolutePath());//apk放在cache文件中,需要获取读写权限
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();
}
}
方法二:
换个目录,我尝试在外部存储apk时,就不会出现“应用安装包损坏”的提示,所以我们把目录改为外部存储。
使用 Environment.getExternalStorageDirectory().getPath()
目录。
参考链接: