どこぞのバカタレAndroidライブラリが使ってもないREAD_PHONE_STATEを勝手に付与するのでライブラリからマージされるパーミッションを取り除く方法を調べてみた。
もちろんマージするAndroidライブラリを好き勝手にいじれるのならそっちを変える方が簡単やねんけど世の中そう都合よくいかんことがあるやろ?
ネットをウロウロするとStackoverflowでAndroidManifest.xmlのヘッダーに
1 2 3 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> |
のようにしてtoolsネームスペースを追加しておいて
1 |
tools:merge="remove" |
を付与しろと書いてありました。
まぁこんな感じですね。
1 2 3 4 5 6 7 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> ...省略 <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:merge="remove" /> ...省略 </manifest > |
しかぁーしこれではREAD_PHONE_STATEを除去できるどころか
1 |
Invalid instruction 'merge', valid instructions are : REMOVE,REPLACE,STRICT |
という役に立たないエラーを吐いてビルドすら通りません。ガーン😨 既に役に立たなくなったworkaroundでした(T_T)
しょうがないのでAOSPのマニフェストマージャー(カタカナで書くと少し間抜けな気がする😁)のソースを見てきました。たぶんXmlElement.javaです。
じゃじゃぁーん。
その結果、
1 |
tools:node="remove" |
をくっつけると良さそうです。試してみるとうまくいきました\(^o^)/
Android Studio 2.2.1
Gradle plugin 2.2.1
Android SDK: Build Tool: 24.0.3, Compiler: 24
で確認しました。まぁ将来また仕様が変わるかもしれへんけど。
という事でマージしているAndroidライブラリからパーミッションを除去するにはこんな風にしましょう(^o^)/
1 2 3 4 5 6 7 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> ...省略 <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" /> ...省略 </manifest > |
ちなみにtools:nodeの後ろは
- merge(マージする, デフォルト)
- remove(除去する)
- replace(すげ替える)
- strict(全く同じじゃない時はエラーにする)
の4つらしいです。
マニフェストマージャーのソース(XmlElement.java)のコメントにはこんな風に書いてありました。
Handle 2 elements (of same identity) merging.
higher priority one has a tools:node=”remove”, remove the low priority one
higher priority one has a tools:node=”replace”, replace the low priority one
higher priority one has a tools:node=”strict”, flag the error if not equals.
default or tools:node=”merge”, merge the two elements.
別にパーミッションでなくてもService, Activity, BroadcastReceiver等でもいけるみたいです。
まぁ今のところパーミッション以外に使う用途を思いつかんけど。
と言うかさぁAndroidライブラリにDangerous Permission入れんなよって(。・_・。) ドキュメントに書けばええやん。特にAndroid6以降は動的パーミッションの処理せなあかんねんやし。
お疲れ様でした^^/~