まめージェント

Android, GAE, AngularJSの技術ネタ中心。Twitter: @mame01112

Androidで不要な(意図しない)ストレージと連絡先のパーミッションが要求される

発端

去年作っていたAppをGoogle Playにあげようとした際、
何故かストレージと連絡先のパーミッションが要求されていることに気づきました。
でもAndroidManifestに書いているパーミッション
・INTERNET
ACCESS_NETWORK_STATE
・WAKE_LOCK
C2D_MESSAGE
あたりなので、ストレージとか連絡先の情報を取得しているわけではなさそう・・・でした。

わかったこと

・こうなってしまう原因不明は2つありそうです。

○ありうる原因その1
・targetSdkVersionが古い場合
下記によると、targetSdkVersionが古い場合は暗黙的にストレージや連絡先のパーミッションが追加されるそうです。
参考にしたのは下記。
android - AndroidStudio アクセス許可に、求めた覚えのない権限を求める - スタック・オーバーフロー

ただ、僕の場合、build.gradleに下記のように記載していたので問題ないハズ。

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 23
    }

AndroidManifestに記載していなくても、build.gradleに書いていればいいそうです。

○ありうる原因その2
・build.gradleは、使っているライブラリが古い場合であってもそのアプリで取得したパーミッションとみなされるそうです。
・ということで、対応としてはそのライブラリをどうにかする(使わないようにする or 新しいものに更新するなど)か、
 AndroidManifestのuses-permissionでremoveを指定してあげること。具体的には:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" tools:node="remove" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" tools:node="remove" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />

とやることでPermissionを上書きすることができるそうです。

僕の場合、この2つ目のケースに当てはまっていたようで、この対応をすることで
無事に不要なパーミッションを取得しないようにすることができました。