サードパーティのライブラリ(altbeacon)、ローカルでビルドされたAndroidライブラリ、アプリコンポーネントで構成されるアプリがあります。3つのコンポーネントすべてにAndroidManifest.xmlがあり、ビルド中にマージされます。アプリはgradleを使用して構築されています。
このアプリは、GooglePlayストアで長い間公開されています。前回の反復では、APIレベル22から25にアップグレードしました。すべてエラーなしでビルドされ、APKは実際のデバイスにインストールされ、エラーなしでテストされましたが、Google Playでアプリを更新すると、APKのアップロードが失敗しました。エラー:
アップロードに失敗しました
異なるmaxSdkVersionsを使用したAndroid.permission.ACCESS_COARSE_LOCATIONの権限の重複宣言。
AndroidManaifest.xmlを分析すると、org.altbeacon.beaconには次の権限があることがわかりました。
<uses-sdk
Android:minSdkVersion="7"
Android:targetSdkVersion="23" />
<uses-permission-sdk-23 Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
ローカルのAndroidライブラリモジュールtargetSdkVersionはbuild.gradleで25に設定されており、AndroidManifest.xmlには次のものが含まれています。
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
アプリモジュールでは、build.gradleでtargetSdkVersionが25に設定されています。
Appモジュールで生成されたAndroidManifest.xmlには、次のものが含まれています。
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
確認するために、APK自体を調べて、バイナリマニフェストを抽出します。
~/.Android-sdk/build-tools/25.0.3/aapt l -a app-release.apk | grep -B1 COARSE
E: uses-permission (line=62)
A: Android:name(0x01010003)="Android.permission.ACCESS_COARSE_LOCATION" (Raw: "Android.permission.ACCESS_COARSE_LOCATION")
--
E: uses-permission-sdk-23 (line=76)
A: Android:name(0x01010003)="Android.permission.ACCESS_COARSE_LOCATION" (Raw: "Android.permission.ACCESS_COARSE_LOCATION")
したがって、重複するタグがあり、マニフェストのマージによってそれが認識され、altbeaconライブラリからタグが削除されたはずです。私の質問は、altbeaconライブラリから権限を削除するにはどうすればよいですか?
アプリモジュールAndroidManifest.xmlで次のことを試しました。
<uses-permission-sdk-23
Android:name="Android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove"
tools:selector="org.altbeacon.beacon"/>
その結果、次のようになります。
AndroidManifest.xml:12:5-15:48 Warning:
uses-permission-sdk-23 was tagged at AndroidManifest.xml:12 to remove other declarations but no other declaration present
そして
<uses-permission
Android:name="Android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove"
tools:selector="org.altbeacon.beacon"/>
その結果、次のようになります。
AndroidManifest.xml:12:5-15:48 Warning:
uses-permission was tagged at AndroidManifest.xml:12 to remove other declarations but no other declaration present
以下は機能しますが、間違ったタグを削除し、アプリの一部として構築したローカルAndroidライブラリ内のタグを削除します。
<uses-permission
Android:name="Android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove"/>
Org.altbeacon.beacon権限が残っています:
~/.Android-sdk/build-tools/25.0.3/aapt l -a app-release.apk | grep -B1 COARSE
E: uses-permission-sdk-23 (line=72)
A: Android:name(0x01010003)="Android.permission.ACCESS_COARSE_LOCATION" (Raw: "Android.permission.ACCESS_COARSE_LOCATION")
Org.altbeacon.beaconライブラリの権限が変更されたり、将来削除されたりすると、ACCESS_COARSE_PERMISSIONがアプリから失われるため、これは満足のいくものではありません。
これを適切に修正する方法について何か提案はありますか?
アプリのマニフェストファイルに、以下のマージルールを追加します。
<uses-permission-sdk-23
tools:node="removeAll" />
位置情報のアクセス許可がすでに追加されていることを確認してください。
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
以下の行を既存の使用許可に置き換えるだけで問題が解決します。
マニフェストに重複したアクセス許可を追加したが、行の下でアクセス許可を分割したため、これが原因です。
<uses-permission
Android:name="Android.permission.ACCESS_COARSE_LOCATION"
Android:maxSdkVersion="22"/>
この post で説明されているように、マニフェストがアクセス許可を処理する方法を指定する必要があります。おそらく、READ_PHONE_STATEのように、推移的にすでにこの権限を必要とするライブラリを含めました。
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
マニフェストでこのアクセス許可を再宣言すると、警告が表示されます。これは、これら2つの宣言の処理方法がわからないためです(おそらく同じように記述されているだけですが)。
アプリでこの権限を転送する場合は、次のように修正できます。
<uses-permission tools:node="merge" Android:name="Android.permission.READ_PHONE_STATE" />
アプリでその権限を転送したくない場合は、次の権限を明示的に削除できます。
<uses-permission tools:node="remove" Android:name="Android.permission.READ_PHONE_STATE" />