1

私は、アプリのインストールと更新にgoogle playを使用しないように、プライベート循環用の小さなアプリケーションを実行しています。

MainActivityでは、APIを介してアプリの更新が見つかったかどうかを確認します。更新によってアプリが見つかった場合は、更新されたapkファイルをSDカードのダウンロードフォルダーにダウンロードし、次の方法でインストールします。

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をインストールするための問題だと思います。
私を助けてください。

編集された質問:- アプリケーションにrootアクセスを取得するには、次のコマンドを実行します。

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 に答える