2017-06-01 118 views
12

我們有一個由第三方庫(altbeacon),本地構建的Android庫和應用程序組件組成的應用程序。所有這三個組件都有一個AndroidManifest.xml,它們在構建期間被合併。該應用程序使用gradle構建。Android Manifest重複權限

該應用長期以來一直在Google Play商店上發佈。在最後一次迭代中,我們將API級別從22級升級到了25級。所有內容都沒有錯誤地構建,APK安裝並在真實設備上測試,沒有錯誤,但是當我們在Google Play上更新應用時,APK上傳失敗錯誤:

Upload failed
Duplicate declarations of permission android.permission.ACCESS_COARSE_LOCATION with different maxSdkVersions.

Anaylyzing的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設置爲25的build.gradle和AndroidManifest.xml包含:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

在app模塊中,targetSdkVersion在build.gradle中設置爲25。

應用模塊中的產生的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庫chamge的權限,或者它在未來移除時不能令人滿意,該ACCESS_COARSE_PERMISSION將從我們的應用程序中丟失。

有關如何正確解決此問題的任何建議?

+0

我有完全相同的問題。 – green0range

+2

我已經向Google提交了一個缺陷 - https://issuetracker.google.com/issues/62267639 – BitByteDog

+0

夠搞笑的是,我們現在正面對與這個完全相同的庫完全相同的問題! –

回答

7

在您的應用清單文件中添加下面的合併規則。

<uses-permission-sdk-23 
     tools:node="removeAll" /> 

確保您已添加位置權限。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+2

這有效,但帶有警告。在所有清單中刪除了所有使用權限-sdk-23標記,因此請確保您在AndroidManifest.xml文件中刪除的每個uses-permission-sdk-23標記在主應用AndroidManifest.xml中添加了uses-permission標記。庫組件。 – BitByteDog

+0

Android Studio說,名稱屬性丟失: '' 但是,當我構建它時,一切正常。 – egmontr

4

只需將下面的行替換爲您現有的使用權限即可解決問題。

這是什麼原因造成的,因爲您在清單中添加了重複權限,但是在行下分割了權限。

<uses-permission 
 
     android:name="android.permission.ACCESS_COARSE_LOCATION" 
 
     android:maxSdkVersion="22"/>

+0

這爲我修好了!謝謝! – green0range

+2

這對我不起作用。在合併的AndroidManifest.xml文件中,兩行仍然保留。我明白了你想達到的目標,但是我們庫的許可權將被用於API級別22,然後API級別23將使用來自altbeacon的許可權限。即使它起作用了,它也不會解決我的擔憂,即如果沒有警告,altbeacon的更改現在可能會影響我們的應用程序。 – BitByteDog