У нас есть приложение, состоящее из сторонней библиотеки (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 будет отсутствовать в нашем приложении.
Любые предложения по правильному исправлению?