先日、個人で公開しているアプリで広告を表示するために導入していたGoogle Play Serviceをバージョンアップしたところ、AndroidManifestに書かれていないにも関わらず位置情報やらアカウント情報へのアクセスのパーミッションが追加されてしまいました。
公開後にユーザからの指摘で気が付き、慌てて対応したので同じ失敗をする人が少しでも減るようにメモ。
起こったこと
個人で公開しているアプリがもともと持っていたパーミッションはネットワーク通信とシステムオーバーレイ、バイブレーションにアプリ内課金だけでした。
しかし、Google Play Serviceを7.0.0から7.5.0にアップデートしたところ位置情報とアカウント、ストレージへのアクセスのパーミションが勝手に追加されました。
もちろんAndroidManifestには自分では何も追記していません。
7.0.0以降のバージョンを幾つか試してみましたが、どうやら7.5.0からこの仕様になったようです。
調べてみる
app/build/output/logs/
にmanifest-merger-[flavor]-report.txt
というファイルが生成されています。
こいつの中に↓のようなログが幾つか吐かれているはずです。お前か、勝手にAndroidManifestに追加したやつは...
uses-permission#android.permission.ACCESS_NETWORK_STATE
ADDED from AndroidManifest.xml:8:5
MERGED from com.google.android.gms:play-services-ads:7.5.0:21:5
MERGED from com.google.android.gms:play-services-analytics:7.5.0:22:5
MERGED from com.google.android.gms:play-services-analytics:7.5.0:22:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:20:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:20:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:20:5
MERGED from com.google.android.gms:play-services-nearby:7.5.0:19:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:20:5
今度はapp/build/intermediates/manifets/full/[flavor]/
の中にあるマージ後のAndroidManifestを見てみます。
なにが追加されたかわかりやすくするために、一旦元々のAndroidManifestからはすべての権限を削除しておきます。
以下が生成されたAndroidManifestに書かれていたパーミッション。盛り盛りですね。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<android:uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
自分のアプリに一切権限を追加していなくてもGoogle Play Serviceを導入しただけでこれだけのパーミッションが追加されることになります。
また、パーミッションだけでなくOpenGLの機能まで要求しています。
回避方法
Google Play Service 6.5.0から可能になった部分導入で使う機能のみ追加することで不要なパーミッション追加を避ける事が出来ます。
例えば、今回自分の場合だとAdmob関連の機能だけ追加できればいいので
compile 'com.google.android.gms:play-services:7.5.0'
ではなく
compile 'com.google.android.gms:play-services-ads:7.5.0'
とすることで広告の表示に必要な権限だけに抑えることができます。
その他、指定できるモジュールは公式のドキュメントを参照してください。
まとめ
Google Play Service 7.5.0から、今回書いたように必要なパーミッションが自動で追加されるようになったようです。
導入時に必要なパーミッションを気にする必要がなくなった反面、なんでもかんでも追加しているとアプリに必要ないパーミッションまで要求してしまうことになります。
Google Play Serviceの導入時や、既存アプリでのバージョンアップ時には気をつけるようにしましょう。
参考
Setting Up Google Play Services | Google APIs for Android | Google Developers