安装存储于SDCard的APK包很顺利,但如果恰巧手机没SDCard,将APK包下载到/data/data/<app_package>/下后,再用之前的方式安装,一直提示"There is a problem parsing the package"。好吧,悲剧的程序员在需求至上的原则下又要解决此问题了。
1.准备
以上次写过的断点续传的代码 [CSDN]为例,将APK包下载存放路径改为"/data/data/<app_packages>/apps/":
为方便,将"微信.apk"也改为"file.apk"。
下载后,点击"安装",出错了。
2.找原因
这时进入adb shell,查看apps和file.apk的文件系统权限详情如下:
可见文件夹apps仅对其拥有者app_38开放了读、写、执行权限,file.apk也仅仅是app_38有读、写权限。好了,问题找到了。即系统的应用程序安装器无法读取到file.apk导致的。
3.文件夹、文件的权限分配
系统的应用程序安装器与app_38不同组,所以对apps和file.apk的文件系统权限修改应为修改其[other]组权限。(分为user/group/other三组,详解请自行google或访问:http://blog.csdn.net/sodino/archive/2011/03/09/6234713.aspx中的12.chmod详解(用户组区分))。
文件夹的读权限是指可以读取该文件目录结构信息,写权限是指可以更改文件目录结构信息,位于其[other]组的用户能否读取该文件夹下的文件与文件夹是否开放读权限无关,只与文件夹开放的执行权限有关。原因为文件夹在不具备执行权限时,是无法执行"cd"命令进入该文件夹(也无法执行"ls"命令读取文件夹下的文件详情)。所以对apps和file.apk最精简(当然直接设置为rwxrwxrwx是最不需要耗费脑细胞的)的权限分配详情如下为:
4.修改权限的方法
apps :drwx-----x → (4+2+1) + (0+0+0) + (0+0+1) → 701
files.apk :-rw----r-- → (4+2+0) + (0+0+0) + (4+0+0) → 604
即对apps执行:chmod 705 /data/data/<app_package>/apps
对file.apk执行:chmod 604 /data/data/<app_package>/apps/file.apk
具体代码为在lab.sodino.downloadbreak.ActDownload类中的installDownload()开头处新增如下代码:
执行Linux命令的exec()方法实现如下:
OK,Sodino Done it.
本文内容归CSDN博客博主Sodino 所有
转载请注明出处:http://blog.csdn.net/sodino/archive/2011/06/16/6549082.aspx