Режимы дублирования Android-манифеста

У нас есть приложение, состоящее из сторонней библиотеки (altbeacon), локальной библиотеки Android и компонента приложения. Все три компонента имеют AndroidManifest.xml, которые объединены во время сборки. Приложение построено с помощью gradle.

Это приложение давно опубликовано в Google Play Store. На последней итерации мы обновили уровень API с 22 по 25. Все построено без ошибок, APK был установлен и протестирован на реальных устройствах без ошибок, но когда мы пришли, чтобы обновить приложение в Google Play, загрузка APK не удалась ошибка:

Ошибка загрузки
Повторяющиеся объявления разрешения android.permission.ACCESS_COARSE_LOCATION с разными maxSdkVersions.

Anaylyzing the 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" />

В модуле приложения targetSdkVersion устанавливается в 25 в build.gradle.

Сгенерированный 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 будет отсутствовать в нашем приложении.

Любые предложения по правильному исправлению?

Ответ 1

В вашем файле манифеста приложения добавьте следующее правило слияния.

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

Убедитесь, что вы уже добавили разрешение на размещение.

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

Ответ 2

Просто замените нижнюю строку на существующее вами разрешение на использование, чтобы решить проблемы.

Это связано с тем, что вы добавили дублированное разрешение в манифест, но ниже строки разделили его.

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