los - Android duplicados permisos de manifiesto
porque se duplican los contactos en android (2)
Tenemos una aplicación que consiste en una biblioteca de terceros (altbeacon), una biblioteca Android construida localmente y un componente de aplicación. Los tres componentes tienen un AndroidManifest.xml que se fusionan durante la compilación. La aplicación está construida usando gradle.
Esta aplicación ha sido publicada durante mucho tiempo en Google Play Store. En la última iteración, pasamos de nivel de API 22 a 25. Todo construido sin errores, el APK se instaló y probó en dispositivos reales sin error, pero cuando llegamos a actualizar la aplicación en Google Play, la carga del APK falló con el error:
Subida fallida
Declaraciones de permiso duplicadas android.permission.ACCESS_COARSE_LOCATION con diferentes maxSdkVersions.
Anaylyzing the AndroidManaifest.xml encontramos org.altbeacon.beacon tiene el siguiente permiso:
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="23" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
Nuestro módulo local de biblioteca de Android, targetSdkVersion, está establecido en 25 en build.gradle y el archivo AndroidManifest.xml contiene:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
En el módulo de aplicación, targetSdkVersion se establece en 25 en build.gradle.
El archivo AndroidManifest.xml generado en el módulo de la aplicación contiene:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
y solo para confirmar, buscando en el propio APK y extrayendo el manifiesto binario:
~/.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")
Entonces, hay una etiqueta duplicada, y creo que la fusión de manifiesto debería haber reconocido eso y eliminado el de la biblioteca altbeacon. Mi pregunta es ¿cómo elimino el permiso de la biblioteca altbeacon?
He intentado lo siguiente en el módulo de aplicación AndroidManifest.xml:
<uses-permission-sdk-23
android:name="android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove"
tools:selector="org.altbeacon.beacon"/>
Esto resulta en:
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
y
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove"
tools:selector="org.altbeacon.beacon"/>
Esto resulta en:
AndroidManifest.xml:12:5-15:48 Warning:
uses-permission was tagged at AndroidManifest.xml:12 to remove other declarations but no other declaration present
Lo siguiente funciona, pero elimina la etiqueta incorrecta, elimina la que está en la biblioteca Android local que creamos como parte de nuestra aplicación.
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove"/>
El permiso org.altbeacon.beacon queda:
~/.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")
Lo cual es insatisfactorio porque si el permiso en org.altbeacon.beacon la biblioteca de chamge, o se elimina en el futuro, ACCESS_COARSE_PERMISSION se perderá de nuestra aplicación.
¿Alguna sugerencia sobre cómo solucionar esto correctamente?
Simplemente reemplace la línea debajo de su permiso de usos existentes para resolver los problemas.
Lo que esto causa porque ha agregado permisos duplicados en el manifiesto pero debajo de la línea divide el permiso.
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="22"/>
En el archivo de manifiesto de la aplicación, agregue la regla de fusión siguiente.
<uses-permission-sdk-23
tools:node="removeAll" />
Asegúrate de haber agregado el permiso de ubicación.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />