依存ライブラリ経由でREAD_PHONE_STATE権限が紛れ込んでた、tools:node="remove"で消せる

  • Android
  • Gradle

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何が起きたか

アプリ本体ではREAD_PHONE_STATEなんて一切使っていないのに、マージ後のAndroidManifestを覗いたらこの権限が入っていた。

原因は依存しているライブラリ(広告SDKやアナリティクス系)側のマニフェストに、この権限の宣言があったこと。Android Gradle PluginのManifest Mergerはデフォルトで依存先のマニフェストも合わせてマージするので、アプリ側で明示的に要求していなくても混入する。

対処

アプリ側のAndroidManifest.xmlに以下を書けば除外できる。

<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>

tools:node="remove" はManifest Mergerのマージルール指定の一つで、該当のノードをマージ結果から取り除く指示になる。似たようなオプションで tools:node="replace"(置き換え)もある。

原因ライブラリの特定

どのライブラリがこの権限を要求しているかは、以下で確認できる。

ターミナル
./gradlew :app:processDebugManifest --info

Android Studioの Merged Manifest タブでも、どのマニフェストソースから来ているか追える。

注意点

除外して問題ないかはライブラリの実際の挙動次第。そのライブラリの機能の一部が内部でREAD_PHONE_STATEに依存している場合、除外すると実行時に SecurityException が出たり、機能が動かなくなったりする可能性がある。

今回のケースでは該当ライブラリの機能自体を使っていなかったので実害は無さそうだが、除外した後に全機能を実機で網羅的に確認したわけではないので、そこは未確認のまま。