[Android]シミュレータでシステムアプリとして起動する

■やろうとしたこと
・Androidにシステムアプリとしてアプリをインストールする

■前提
・システム権限が必要なアプリを作るという要件があった。
・検証、動作確認の段階では、署名とか必要なものは渡せませんという縛りがあった。
  →実機ではできないと思われ、シミュレータで確認する方法を探しました。

***署名なし!***

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

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

2つの方法が見つかりました。
・system領域をread/writeモードでマウントし直してインストール
・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/”に相当する場所に格納
 ※他のアプリに習って、ディレクトリとかも適当に用意しました。
  必要かどうかは未確認

参考

 このページだと、ext4fuseで行けるようになったと記載がありましたが、
 自分の環境では、read onlyのままでした。

a

スポンサーリンク







シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク