您的位置:首页 > 其它

应用程序无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. 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: