どもです、TRILLのAndroid担当してます永井です。
この記事は「dely #2 Advent Calendar 2020」の17日目の記事です。 adventar.org
「dely #1 Advent Calendar 2020」はこちら↓ adventar.org
昨日は @MeilCli さんの C# 9.0時代のnull判定解剖 という記事でした。 様々なnull判定の比較検証がまとまってますので、こちらもぜひ御覧ください!
さて
今回は APK で要求している uses-permission の手軽な解析方法について話したいと思います。
先日、新しく広告SDKを実装したAPKをビルドしていたところ、心当たりのない uses-permission が付与されていることに気づき、要求元を調査していました。
そこで直近実装したものを一つづつ外して追いかけようとしていたところ、メンバーに Merged Manifest 使うと便利ですよーってアドバイスをもらい即解決できたのでこの感動と Tips を忘れないうちにまとめました。
やったこと
は超簡単で、まず AndroidStudio 内でプロジェクトの AndroidManifest.xml を開きます。 下タブに [Text] [Merged Manifest] とあり、[Text] には開いたマニフェストで宣言している定義値が並んでいますが、今回使うのは [Merged Manifest] の方です。
Android の APK に含めることのできる AndroidManifest は一つだけなので、外部ライブラリや Flavor などのマニフェストはビルド時に一つにマージされます。
[Merged Manifest] ではその一つにマージされたマニフェストの定義値を確認することができます。
少しみづらいですが色が使ってるライブラリと対応していて、uses-permission をクリックすると使用しているライブラリのマニフェストを表示することができます。 例えば選択行の READ_EXTERNAL_STORAGE および WRITE_EXTERNAL_STORAGE は leakcanary (デバッグ時のリーク検出ライブラリ)で定義されていることがわかります。
参考リンク developer.android.com
解析結果
今回謎だった uses-permission は
android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_PHONE_STATE
の3つで、今回広告を実装するにあたってデバッグ用に追加した AdMob のテストスイートの消し忘れによるもので、呼び出しコードを削除していたが build.gradle に依存が残っていて権限要求されていました。
また開発用デバッグ Flavor で有効になる leakcanary も
android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE
を要求していることがわかりました。
なのでテストスイートを外し改めてリリースビルドすることで無事不要な権限を要求することのないAPKをビルドすることができました。めでたしめでたし。
まとめ
出処不明な uses-permission やその他定義は AndroidManifest.xml の[Merged Manifest] から簡単に追える。 使わないコードは依存も忘れず削除しよう。 以上です!
おわりに
明日はプロダクトマネージャーの Rice さんの 初心者PdMに贈る「"伝書鳩"が意思を持つために意識すべきこと」です。ぜってぇ見てくれよな!
delyでは一緒にサービス成長させるエンジニアを積極採用中です。 興味のある方は気軽にお話しましょう〜! join-us.dely.jp
delyについて詳しく知りたいよって方は、TechTalk という社内のメンバーがテーマ毎に話すイベントもあるのでこちらも是非ご参加ください! bethesun.connpass.com