web-dev-qa-db-ja.com

Android studioは、実際のデバイスでアプリケーションを実行した後、不要な権限を追加します

デバイスアプリケーションでアプリケーションを実行した後、マニフェストファイルに記載されていない不要な場所のアクセス許可が必要でした。友人から同じコードを実行しているとき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" />

enter image description here

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'
    }

そのため、なぜ場所の許可が必要なのか理解できません。このロケーション権限はアプリにどのように追加されましたか?

21
Nikhil
compile 'com.google.Android.gms:play-services:+'

Play開発者サービスのいくつかの部分がそれを必要とするので、このライブラリは場所の許可を要求します。

まず、+は絶対に使用しないでください。浮動パッチレベル(例:22.0.+)を許可したい場合、それは完全に狂気ではありませんが、バージョン+を使用することは狂気です。

次に、完全なPlay開発者サービスSDKではなく、より焦点を絞った依存関係の1つ(または複数)を使用することを検討してください。これにより、不要な権限がなくなるだけでなく、APKが大幅に小さくなります。 ドキュメント 使用可能なオプションについて説明します(「APIを実行可能ファイルに選択的にコンパイルする」セクションを参照)。

それでも不要なアクセス許可が発生する場合は、アクセス許可の取得元を特定する必要があります。モジュールのbuild/outputs/logs/にマニフェスト合併レポートがあるはずです。理解するのは少し難しいでしょうが、うまくいけば、この許可を提供しているライブラリを特定できます。また、Android Studio 2.2+では、マニフェストを編集すると、マージされたマニフェストがサブタブに表示されます。UPDATE 2020-03-24:最新バージョンのAndroid Studioは、マニフェストエディターの[マージされたマニフェスト]サブタブにもこのようなものを表示し、どの権限が付与されたかを示すために色分けされていますどのライブラリから。

その時点で、どのように進めるかを決定する必要があります。

  • 権限を削除する最も安全な答えは、そのライブラリを使用しないことですが、代わりに、そのライブラリで解決しようとしている問題に対する他の解決策を見つけることです。

  • または、許可を得て生活する

  • または、アプリのマニフェストに次を追加してみてください。

    <uses-permission
         Android:name="Android.permission.ACCESS_COARSE_LOCATION"
         tools:node="remove" />
    

これには、ルートxmlns:tools="http://schemas.Android.com/tools"要素がまだ存在しない場合は、<manifest>を追加する必要があります。これにより、ライブラリがこの権限を提供している場合でも、ビルドツールにこの権限を明示的に除外するように指示されます。ただし、これらのライブラリの使用は中断する可能性があります。これを行うのは、この権限をブロックする決定がユーザーに影響を与えるクラッシュやその他の動作を引き起こさないことを確認するために必要な時間を費やすことができる専用のテストチームがある場合のみです。

37
CommonsWare

Google Play開発者サービスライブラリの新しいバージョンでは、ライブラリの必要な部分のみを依存関係として追加する必要があります。たとえば、Admobからの広告を表示するためだけにGoogle Play開発者サービスライブラリを使用している場合は、

compile 'com.google.Android.gms:play-services:+'

compile 'com.google.Android.gms:play-services-ads:7.5.0'

これにより、他の不要な権限が削除されます。

4
eyeslave

マージされたマニフェストを確認する必要があります。

使用するライブラリは、権限を要求することもできます。

それがその許可の源です。

enter image description here

3