[Android]エミュレータにシステムアプリとしてアプリをインストールする方法

背景

  • システム権限が必要なアプリを作るという要件があった。
  • Androidにシステムアプリとしてアプリをインストールする方法を調べた。

前提

  • 検証、動作確認の段階では、システム署名用のキーとか必要なものは渡せませんという縛りがあった。
  • でも、機能やアプリの挙動は確認してという依頼があった。
    →実機ではできないと思われ、エミュレータで確認する方法を探しました。

***システムキーの署名なしでやれってさ!***

環境

  • macS Sierra 10.12.6
  • Android Studio 3.0
  • Android 4.0〜5.1
    ※Android6.0以降はエラーも発生したため最後まで確認できておりません。

調べた内容

どうやらAndroidの以下の場所にあれば、良さげ。
/system/priv-app/

/system/app/という話もありましたが、自分が確認したケースでは、priv-appで大丈夫でした。
Android OSバージョンによるのかな。

2つの方法が見つかりました。

  1. system領域をread/writeモードでマウントし直してインストールする方法
  2. system.imgをunpackし、apkファイルを格納、再度パッケージ化して起動する方法

結論として、後者の方法で制限付きですが確認できました。

詳細

system領域をread/writeモードでマウントし直してインストールする方法 の場合

  1. エミュレータ起動
  2. ターミナルで、adb shellで入る
  3. mount コマンドでマウント情報を確認
    # 関係する場所のみ抜粋
    /dev/block/vda /system ext4 ro,relatime,data=ordered 0 0

    →read onlyであることを確認

  4. 以下のコマンドを実行
    # mount -o rw,remount /system
  5. mountコマンドでマウント情報を確認
    # 関係する場所のみ抜粋
    /dev/block/vda /system ext4 rw,relatime,data=ordered 0 0

    →read writeに変わっていることを確認

  6. 他のターミナルを開き、以下のコマンドを実行&結果

    $ adb -s emulator-5554 push test_app.apk /system/priv-app/
    adb: error: failed to copy \'test_app.apk\' to \'/system/priv-app/test_app.apk\': remote Read-only file system
    test_app.apk: 0 files pushed. 240.1 MB/s (982920 bytes in 0.004s)
    • ”emulator-5554”は起動しているエミュレータのID(adb devicesで確認できる)
    • “test_app.apk”は動作確認しようとしているアプリ名(必要ならばパスも) rwになっているのに、Read-only file systemと言われた。

    再度、mountコマンドを実行して確認すると、”ro”に変わっているし、 再度、”rw”でリマウントしようとすると今度は、以下のように怒られる。

    # mount -o rw,remount /system mount: Read-only file system

    謎。。。

    以下のように一気にすれば、いけました。(android4.4まで?)

    $ adb root && add shell mount -o rw,remount /system && adb push test_app.apk /system/priv-app/

    ※Android5.0のエミュレータまでは、すでにrootなので最初のコマンドは不要です。
    ※エミュレータを再起動すると消えます。
    ※しかし、Android5.0以降は、ファイルのプッシュはできているものの インストールはできていない(アプリ一覧に表示されない)ようです。

    格納先の仕様の変化とかあるのかもです。(未調査)

system.imgをunpackし、apkファイルを格納、再度パッケージ化して起動する方法

  1. system.imgの場所を確認
    $ vi ~/.android/avd/5.1_WVGA_API_24.avd/hardware-qemu.ini

    →自分の環境では以下でした。多分一般的には同じ場所のはず。

    /Users/User/Library/Android/sdk/system-images/android-24/google_apis/x86/system.img
  2. 念のため、ファイルシステムを確認
    $ file system.img system.img: Linux rev 1.0 ext4 filesystem data, 〜〜〜うんたらかんたら〜〜〜

    →ext4のファイルシステムですね。

  3. ext2 でマウント(ext4だとダメ?)
    $ mkdir ~/temp_disk $ sudo fuse-ext2 -o force system.img ~/temp_disk
  4. アプリを”/system/priv-app/”に相当する場所に格納

    ※他のアプリに習って、ディレクトリとかも適当に用意しました。
    必要かどうかは未確認

コメント

タイトルとURLをコピーしました