7

Javaコードからシステムアプリをインストールしようとしていますが、これまでのところ成功していません。

これまでに行ったことは次のとおりです。

  1. 私のデバイスはルート化されています。
  2. 私の「インストーラー」アプリはシステムアプリとしてインストールされます。(手動で/ system / appにコピーしました)
  3. プラットフォームキーを使用してインストーラーapkに署名android:sharedUserId="android.uid.system"し、マニフェストにあります。
  4. 私はのために試みてきました(そして試み、そしてさらにいくつか)Runtime.getRuntime.exec("su")。システムパーティションをとしてマウントし、apkに対してrwaを実行してから、システムパーティションを作成します。コマンドのリストは次のとおりです。catro

    mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system<br>
    cat /sdcard/application.apk > /system/app/application.apk<br>
    mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system<br><br>The application.apk here is the app being installed from the installer app. This app is also signed with platform key, and has the sharedUserId configured.
    
  5. INSTALL_PACKAGESマニフェストで許可を求めました。

'su -c'すべてのコマンドでの使用を含め、exec( "")形式のさまざまなバリエーションを試しました。壊れたパイプの例外とセキュリティの例外が発生しました。例外が発生しない場合もありますが、ファイルはコピーされません。


ここで欠けているものを教えてください。誰かがこれを機能させましたか?

ありがとう!

4

1 に答える 1

4

私は掘り続けました、そしてここに結果があります:

  • Androidのsu.cには次のチェックがあります:["Androidソースのルート"/system/extras/su/su.c]
/* Until we have something better, only root and the shell can use su.*/
myuid = getuid();
if (myuid != AID_ROOT && myuid != AID_SHELL) {
    fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
    return 1;
}

ChainsDD(SuperUser)とcyanogen modは、独自のsu.cを実装することでこれを回避します:https ://github.com/CyanogenMod/android_system_su/blob/master/su.c

  • 何が特別なの/system/appですか?ルート権限を取得されていないデバイスではパーティションが読み取り専用であり、そこに配置されたアプリケーションの変更/アンインストールが妨げられているのは事実のようです。https://android.stackexchange.com/questions/17871/what-are-the-differences-between-a-system-app-and-user-app

  • プラットフォームキーとで署名されたアプリはsharedUserId = system、私の目的には「十分」です。特に/ system/appにコピーする必要はありません。

私は今のところこれを答えとして受け入れています。

于 2012-05-23T01:43:09.263 に答える