デバイス上でアプリケーションを実行した後、アプリケーションはマニフェスト ファイルに記載されていない不要な位置情報の許可を要求しました。友人の Android Studio から同じコードを実行すると、追加の許可を必要とせずに通常どおり実行されます。
マニフェストファイル
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "xxxxxxx"
}
dexOptions {
javaMaxHeapSize "4g"
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
lintOptions{
abortOnError false
}
}
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:multidex:1.0.0'
compile 'com.android.support:appcompat-v7:21.0.3'
}
それで、なぜ位置情報の許可が必要なのか理解できません。この位置情報の許可はどのようにしてアプリに追加されるのでしょうか?
ベストアンサー1
compile 'com.google.android.gms:play-services:+'
このライブラリは、Play サービスのいくつかの部分で位置情報の許可が必要なため、位置情報の許可を要求します。
まず、 は絶対に使用しないでください+
。自由に変更できるパッチレベル( など)を許可したい場合22.0.+
、それはまったくおかしなことではありませんが、+
バージョンに を使用することはは非常識な。
次に、完全な Play Services SDK ではなく、より焦点を絞った依存関係の 1 つ (または複数) を使用することを検討してください。これにより、不要な権限が削除されるだけでなく、APK のサイズが大幅に小さくなります。ドキュメント利用可能なオプションについて説明します (「実行可能ファイルへの API の選択的コンパイル」セクションを参照)。
それでも不要な権限が付与されてしまう場合は、権限の付与元を特定する必要があります。build/outputs/logs/
モジュールにマニフェスト マージ レポートがあるはずです。少しわかりにくいかもしれませんが、この権限を提供しているライブラリを特定できるはずです。また、Android Studio 2.2 以降では、マニフェストを編集するときに、マージされたマニフェストがサブタブに表示されます。2020年3月24日更新: Android Studio の最新バージョンでは、マニフェスト エディターの [マージされたマニフェスト] サブタブにもこの内容が表示され、どの権限がどのライブラリから取得されたかが色分けされて表示されます。
その時点で、どのように進めるかを決定する必要があります。
権限を削除する最も安全な答えは、そのライブラリをもう使用せず、代わりにそのライブラリで解決しようとしている問題に対する他の解決策を見つけることです。
あるいは、許可を得て生きる
または、アプリのマニフェストに次のコードを追加してみてください。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove" />
xmlns:tools="http://schemas.android.com/tools"
ルート要素にまだ追加されていない場合は、ルート要素に追加する必要があります<manifest>
。これにより、ライブラリがこの権限を提供しているにもかかわらず、ビルドツールにこの権限を明示的に除外するように指示します。ただし、これらのライブラリを使用すると、この権限をブロックする決定によってクラッシュやユーザーに影響を与えるその他の動作が発生しないことを時間をかけて確認できる専用のテスト チームがある場合にのみ、これを実行してください。