Androidアプリ開発で、他のアプリをサイレントインストールするアプリを作って欲しいという、なかなかレアな要件がありました。
閉じたネットワーク内で別に用意したAPKファイルをダウンロードして、インストールさせたいというような内容です。
その時に調べた内容です。
結論
- Systemアプリでないと無理
- third-partyアプリ(一般的なアプリ)は無理
要は、Googleやキャリア、ベンダ(例:ドコモやソニー)側が用意してくれたシステムアプリ用の署名キーがないと不可ということ
機能を試すだけなら、
実機ならroot化してシステムアプリとしてインストール、
エミュレータならsystem.imgファイルをいじってインストールする方法があります。
参考:[Android]エミュレータでシステムアプリとして起動する
https://blog.integrityworks.co.jp/2018/01/android-how-to-install-app-as-system-app-on-emulator/
行ったことと起きたこと
アプリに他のアプリのインストールを許可するには以下のパーミッション許可が必要です。
そのため、以下のようにパーミッションを追加しました。
AndroidManifest.xml
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
話では、削除もできるようにということで、DELETE_PACKAGESの方も追加していました。
公式リファレンス
ビルドが通らない
ひとまずビルドしようとすると、ビルドができませんでした。
まあ、単純な話、Android Studioで警告が出ていました。
Permission is only granted to system apps
システムアプリにのみ認められたパーミッションだよという話。
普通のアプリでは、このパーミッションは使えないため、Android Studio側で弾くようになっていました。
セキュリティ的に考えても当たり前ですが。
対策
Android Lintの設定を変えることで、ビルドできるようになります。
設定場所(MacとWindowsで少し名称が異なります)
File -> Settings -> Editor ->Inspections
"Using system app permission"のチェックをオフにする
※項目が多いので、最初からpermissionで検索した方が早いです。
参考
Permission is only granted to system app
補足
共に、signatureOrSystemレベルのパーミッション(Android6.0から名称が違うっぽいけど、要はサードパーティ製アプリには付与できない、プリインアプリのようなベンダー署名がある場合に可能らしい)
permissionの公式ガイド
コメント