25
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidのライブラリでminSdkVersionとtargetSdkVersionをライブラリで指定していない場合にアプリに勝手にパーミッションが追加される

Last updated at Posted at 2019-07-30

概要

いろんな理由で社内などでライブラリを作ってmavenサーバーで公開して、それをアプリで参照したりとかってよくありますよね?
最初に結論ですが、そのときにライブラリ側でtargetSdkVersionが指定されていないと勝手にREAD_PHONE_STATEREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEが追加されてしまいます
リリース前にGoogle Playで気づいたりすると再アップロードして確認などでリリースが翌日になったり、面倒なことになりがちです。(パーミッション変更がプルリクで検知できるともっといいですね)

どう調べたか

通常、mafniestに追加されているPermissionはAndroidManifest.xmlにあるMerged Manfiestという項目をみて、そこで右クリックして Go to Declarationすることで、ライブラリを特定できます。

image.png

しかし、今回はメインのManfiest.xmlに飛ばされるのみで、原因がわかりませんでした。

ドキュメントより、ビルド中に生成される anifest-merger-[バリアント名]-report.txtという項目を見れば良いことが分かったので、それを見てみました。
find . -name "manifest-merger*txt"
./app/build/outputs/logs/manifest-merger-[バリアント名]-report.txt

そこで以下のように吐き出されていました。
reason: library has a targetSdkVersion < 4

IMPLIED from .../src/main/AndroidManifest.xml:2:1-550:12 reason: library has a targetSdkVersion < 4
uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from .../src/main/AndroidManifest.xml:2:1-550:12 reason: library has a targetSdkVersion < 4
uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from .../src/main/AndroidManifest.xml:2:1-550:12 reason: library requested WRITE_EXTERNAL_STORAGE

で以下のスタックオーバーフローにたどり着きました。

原因はなにか

ここからはちょっと興味の話なのですが、なぜtargetSdkVersion < 4だとパーミッションが追加されるのでしょうか?
ここにドキュメントがあります
https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE
image.png

コードをたどっていくと、以下にたどり着きます。
https://android.googlesource.com/platform/tools/base/+/5521274ec220aea3f2b38d77dd34aeb463666da2

When importing libraries targeting past versions of the SDK with some
implied permissions (and possible other element types) into an
application targeting a newer SDK, we must explicitely declare those
implied permissions for the application to run correctly.

正しくアプリが動くために、新しいOSでは明示的に指定する必要があるパーミッションを全部追加しちゃうっぽいです。

そのパーミッションを追加するmergerのコードはここにあるようです
https://android.googlesource.com/platform/tools/base/+/2343d80f0fed536331249d0190294de0a9660358/build-system/manifest-merger/src/main/java/com/android/manifmerger/XmlDocument.java

25
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?