背景
- システム権限が必要なアプリを作るという要件があった。
- 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つの方法が見つかりました。
- system領域をread/writeモードでマウントし直してインストールする方法
- system.imgをunpackし、apkファイルを格納、再度パッケージ化して起動する方法
結論として、後者の方法で制限付きですが確認できました。
詳細
system領域をread/writeモードでマウントし直してインストールする方法 の場合
- エミュレータ起動
- ターミナルで、adb shellで入る
- mount コマンドでマウント情報を確認
# 関係する場所のみ抜粋 /dev/block/vda /system ext4 ro,relatime,data=ordered 0 0
→read onlyであることを確認
- 以下のコマンドを実行
# mount -o rw,remount /system
- mountコマンドでマウント情報を確認
# 関係する場所のみ抜粋 /dev/block/vda /system ext4 rw,relatime,data=ordered 0 0
→read writeに変わっていることを確認
他のターミナルを開き、以下のコマンドを実行&結果
$ 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ファイルを格納、再度パッケージ化して起動する方法
- 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
- 念のため、ファイルシステムを確認
$ file system.img system.img: Linux rev 1.0 ext4 filesystem data, 〜〜〜うんたらかんたら〜〜〜
→ext4のファイルシステムですね。
- ext2 でマウント(ext4だとダメ?)
$ mkdir ~/temp_disk $ sudo fuse-ext2 -o force system.img ~/temp_disk
アプリを”/system/priv-app/”に相当する場所に格納
※他のアプリに習って、ディレクトリとかも適当に用意しました。
必要かどうかは未確認
参考:
https://takuya-1st.hatenablog.jp/entry/2016/06/07/232236このページだと、ext4fuseで行けるようになったと記載がありましたが、 自分の環境では、read onlyのままでした。
コメント