[Android]Permission is only granted to system apps

スポンサーリンク

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の方も追加していました。

公式リファレンス

Manifest.permission  |  Android Developers

ビルドが通らない

ひとまずビルドしようとすると、ビルドができませんでした。

まあ、単純な話、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

Attention Required! | Cloudflare

補足

共に、signatureOrSystemレベルのパーミッション(Android6.0から名称が違うっぽいけど、要はサードパーティ製アプリには付与できない、プリインアプリのようなベンダー署名がある場合に可能らしい)

permissionの公式ガイド

コメント

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