应用程序无SDCard安装APK
2011-08-18 16:49
525 查看
摘要: 安装存储于SDCard的APK包很顺利,但如果恰巧手机没SDCard,将APK包下载到/data/data/app_package/下后,再用之前的方式安装,一直提示There is a problem parsing the package。好吧,悲剧的程序员在需求至上的原则下 ...
安装存储于SDCard的APK包很顺利,但如果恰巧手机没SDCard,将APK包下载到/data/data/<app_package>/下后,再用之前的方式安装,一直提示"There is a problem parsing the package"。好吧,悲剧的程序员在需求至上的原则下又要解决此问题了。
1.准备
以上次写过的断点续传的代码 [DEVDIV]为例,将APK包下载存放路径改为"/data/data/<app_packages>/apps/":
public static final String RES_LOAD_FOLDER = File.separator + "data" + File.separator + "data"
+ File.separator + "lab.sodino.downloadbreak" + File.separator + "apps"
+ File.separator;
复制代码
为方便,将"微信.apk"也改为"file.apk"。
下载后,点击"安装",出错了。
2.找原因
这时进入adb shell,查看apps和file.apk的文件系统权限详情如下:
不可安装
# cd /data/data/lab.sodino.downloadbreak
cd /data/data/lab.sodino.downloadbreak
# ls -l
ls -l
drwx------ app_38 app_38 2011-06-16 08:42 apps
drwxr-xr-x system system 2011-06-16 08:40 lib
# ls -l apps
ls -l apps
-rw------- app_38 app_38 2708419 2011-06-16 08:42 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详解(用户组区分))。
读权限是必须的,但有一点要特别注意:仅对文件夹分配读权限时,仍然无法读取该文件夹下的内容。原因为文件夹在不具备执行权限时,是无法执行"cd"命令进入该文件夹,也无法执行"ls"命令读取文件夹下的文件详情。所以对apps和file.apk最精简(当然直接设置为rwxrwxrwx是最不需要耗费脑细胞的)的权限分配详情如下为:
可安装
# cd /data/data/lab.sodino.downloadbreak
cd /data/data/lab.sodino.downloadbreak
# ls -l
ls -l
drwx---r-x app_38 app_38 2011-06-16 08:33 apps
drwxr-xr-x system system 2011-06-16 08:31 lib
# ls -l apps
ls -l apps
-rw----r-- app_38 app_38 2708419 2011-06-16 08:33 file.apk
复制代码
4.修改权限的方法
apps :drwx---r-x → (4+2+1) + (0+0+0) + (4+0+1) → 705
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()开头处新增如下代码:
// [文件夹705:drwx---r-x]
String[] args1 = { "chmod", "705", RES_LOAD_FOLDER };
exec(args1);
// [文件604:-rw----r--]
String[] args2 = { "chmod", "604", RES_LOAD_FOLDER + bean.name };
exec(args2);
复制代码
执行Linux命令的exec()方法实现如下:
/** 执行Linux命令,并返回执行结果。 */
public static String exec(String[] args) {
String result = "";
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = null;
InputStream errIs = null;
InputStream inIs = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
}
baos.write('\n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
}
byte[] data = baos.toByteArray();
result = new String(data);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (errIs != null) {
errIs.close();
}
if (inIs != null) {
inIs.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return result;
}
复制代码
OK,Sodino Done it.
安装存储于SDCard的APK包很顺利,但如果恰巧手机没SDCard,将APK包下载到/data/data/<app_package>/下后,再用之前的方式安装,一直提示"There is a problem parsing the package"。好吧,悲剧的程序员在需求至上的原则下又要解决此问题了。
1.准备
以上次写过的断点续传的代码 [DEVDIV]为例,将APK包下载存放路径改为"/data/data/<app_packages>/apps/":
public static final String RES_LOAD_FOLDER = File.separator + "data" + File.separator + "data"
+ File.separator + "lab.sodino.downloadbreak" + File.separator + "apps"
+ File.separator;
复制代码
为方便,将"微信.apk"也改为"file.apk"。
下载后,点击"安装",出错了。
2.找原因
这时进入adb shell,查看apps和file.apk的文件系统权限详情如下:
不可安装
# cd /data/data/lab.sodino.downloadbreak
cd /data/data/lab.sodino.downloadbreak
# ls -l
ls -l
drwx------ app_38 app_38 2011-06-16 08:42 apps
drwxr-xr-x system system 2011-06-16 08:40 lib
# ls -l apps
ls -l apps
-rw------- app_38 app_38 2708419 2011-06-16 08:42 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详解(用户组区分))。
读权限是必须的,但有一点要特别注意:仅对文件夹分配读权限时,仍然无法读取该文件夹下的内容。原因为文件夹在不具备执行权限时,是无法执行"cd"命令进入该文件夹,也无法执行"ls"命令读取文件夹下的文件详情。所以对apps和file.apk最精简(当然直接设置为rwxrwxrwx是最不需要耗费脑细胞的)的权限分配详情如下为:
可安装
# cd /data/data/lab.sodino.downloadbreak
cd /data/data/lab.sodino.downloadbreak
# ls -l
ls -l
drwx---r-x app_38 app_38 2011-06-16 08:33 apps
drwxr-xr-x system system 2011-06-16 08:31 lib
# ls -l apps
ls -l apps
-rw----r-- app_38 app_38 2708419 2011-06-16 08:33 file.apk
复制代码
4.修改权限的方法
apps :drwx---r-x → (4+2+1) + (0+0+0) + (4+0+1) → 705
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()开头处新增如下代码:
// [文件夹705:drwx---r-x]
String[] args1 = { "chmod", "705", RES_LOAD_FOLDER };
exec(args1);
// [文件604:-rw----r--]
String[] args2 = { "chmod", "604", RES_LOAD_FOLDER + bean.name };
exec(args2);
复制代码
执行Linux命令的exec()方法实现如下:
/** 执行Linux命令,并返回执行结果。 */
public static String exec(String[] args) {
String result = "";
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = null;
InputStream errIs = null;
InputStream inIs = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
}
baos.write('\n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
}
byte[] data = baos.toByteArray();
result = new String(data);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (errIs != null) {
errIs.close();
}
if (inIs != null) {
inIs.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return result;
}
复制代码
OK,Sodino Done it.
相关文章推荐
- [Android]应用程序无SDCard安装APK
- [Android]应用程序无SDCard安装APK
- APK安装时如何拷贝apk里的文件到sdcard
- android 设置apk文件默认安装sdcard中
- android模拟器添加文件到虚拟sdcard,以及安装外部apk
- 获取SDCard上未安装的apk文件的信息
- 双击运行Android模拟器、创建SDcard、AVD、安装APK文件、上传文件到模拟器
- Android中让应用程序自动安装到手机内存及判断应用程序是否安装在SDCard中
- Android2.2中的APK安装到SdCard上
- 双击运行Android模拟器、创建SDcard、AVD、安装APK文件、上传文件到模拟器
- 安装APK文件到Android模拟器和Android sdcard的使用
- 在Android模拟器上安装.apk软件,使用管理sdcard
- 如何使用adb命令将应用程序安装到sdCard中
- android 从sdcard安装apk,点击home键,出现问题
- 安装APK文件到Android模拟器和Android sdcard的使用
- 控制台ADB 命令安装apk到手机sdcard及安装qq过程中问题:: to '/sdcard/tmp/': Is a directory解决
- 安装APK文件到Android模拟器和Android sdcard的使用
- android 设置apk文件默认安装sdcard中
- 把apk安装到Android模拟器中、把文件拷贝进sdcard
- Android中让应用程序自动安装到手机内存及判断应用程序是否安装在SDCard中