1

我正在为私人发行做一个小型应用程序,这样我就不会使用 google play 来安装和更新应用程序。

在我的 MainActivity 中,我将通过 api 检查是否找到了应用更新。如果发现任何更新,我的应用程序将更新后的 apk 文件下载到 SDCard 上的下载文件夹中并通过以下方式安装:

intent.setDataAndType(Uri.fromFile(new File(destination)), "application/vnd.android.package-archive");

它工作正常,但我的问题是用户可以在下载文件夹中获取 apk 文件。所以我决定将文件下载到/data/data/com.xxx.aaa。这个思路,把文件下载到/data...路径下。但是我无法安装apk文件。download folder我通过以下代码确保 apk 文件存在于其中:

if(new File(destination).exists()){
  // apk file is present into download folder.
}

我的方法显示解析错误如下:

在此处输入图像描述

我的问题是:

如何从 /data.... 路径安装更新的 apk 文件?

我猜root权限是安装apk的问题。
请帮我。

已编辑的问题:- 要获得根访问我的应用程序,我运行以下命令:

try {
  Runtime.getRuntime().exec("su");
}

执行此命令后,我可以列出 /data/data/com.xxx.aaa 路径。并且我已经验证了我下载的 apk 文件显示在此处。

要安装 apk,如评论中所述,我在各种选项中运行mount命令,但没有运气。如图所示,我得到解析错误。

我已经 通过以下方式尝试了安装:

1) mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
2) mount -o rw,remount -t yaffs2 /data/data.com.xxx.aaa/appinfo.apk
3) mount
4) mount /system

我不知道挂载 /data/data/.... 路径的正确方法。如何挂载 /data/data/.... 路径。
请帮我。

4

1 回答 1

1

列出 /data/app/ 中的文件

[1] su

[2] ls /data/app/

从“/data/app/”文件夹中获取 apk

# ls /data/app/

我正在关注 apk 列表

com.android.vending-1.apk

com.google.android.gms-1.apk

com.noshufou.android.su-1.apk

com.corusen.accupedo.te-1.zip

com.microsoft.office.lync-1.apk

com.okythoos.android.tdmpro-1.apk

com.devindia.acr-1.apk

例如,我想将“com.android.vending-1.apk”输出到 /sdcard

[1] su

[2] cat /data/app/com.android.vending-1.apk > /sdcard/com.android.vending-1.apk

[3] adb pull /sdcard/com.android.vending-1.apk /path-to-your-folder/

将应用程序作为系统应用程序运行

[1] adb push your-app.apk /sdcard/

[2] adb shell

[3] su

[4] mount -o remount,rw /system

[5] cat /sdcard/your-app.apk > /system/app/your-app.apk

[6] chmod 0644 /system/app/your-app.apk

从您的 Android 代码以 Root 用户身份运行命令:

例如,如果您想以 root 用户的形式运行命令“chmod 0644 /system/app/your-app.apk”

示例步骤:

[1] Execute From Computer
adb push your-app.apk /sdcard/

[2] Execute From Android Code
Exec_SU("mount -o remount,rw /system");
Exec_SU("cat /sdcard/your-app.apk > /system/app/your-app.apk");
Exec_SU("chmod 0644 /system/app/your-app.apk");

这是上述函数“Exec_SU”的实现:

    public static void Exec_SU(String str_command) 
    { 
        // working well
        Runtime runtime = Runtime.getRuntime(); 
        Process proc = null; 
        OutputStreamWriter osw = null;    
        StringBuilder sbstdOut = new StringBuilder();   
        sbstdErr = new StringBuilder();

        String command=str_command;

        try { 
            // Run Script    
            proc = runtime.exec("su");   
            osw = new OutputStreamWriter(proc.getOutputStream());  
            osw.write(command);   
            osw.flush();     
            osw.close();     
            } catch (IOException ex) { 
                ex.printStackTrace();   
                } finally {       
                    if (osw != null) {     
                        try {      
                            osw.close();   
                            } catch (IOException e) { 
                                e.printStackTrace(); 
                                }      
                            }    
                    }   
                try {     
                    if (proc != null)    
                        proc.waitFor();  
                    } catch (InterruptedException e) {  
                        e.printStackTrace(); 
                        }   

    }

我认为这会对你有所帮助。谢谢。

于 2012-10-16T08:29:57.490 回答