Hoy vamos a hacer un script que nos ayudará a editar el AndroidManifest.xml después de generar el build con React Native Expo para evitar permisos extras que añaden ciertas librerías.
En mi caso quiero eliminar el permiso:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
Que añade automáticamente la librería de Expo Sensors.
Para eliminarlo lo que haremos es generar un paso posterior en el gradle que edite el AndroidManifest.xml y elimine el permiso.
Tenemos que añadir el siguiente script dentro de app/build.gradle dentro de Android:
applicationVariants.all { variant -> variant.outputs.each { output -> output.processManifest.doLast { def manifestFile = file("$buildDir/intermediates/merged_manifests/${variant.dirName}/AndroidManifest.xml") if (manifestFile.exists()) { def manifestText = manifestFile.getText('UTF-8') def updatedManifestText = manifestText.replaceAll('<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />', '') manifestFile.write(updatedManifestText, 'UTF-8') } } } }
Quedando de la siguiente forma en el archivo:
android { ... packagingOptions { ... } ... applicationVariants.all { variant -> variant.outputs.each { output -> output.processManifest.doLast { def manifestFile = file("$buildDir/intermediates/merged_manifests/${variant.dirName}/AndroidManifest.xml") if (manifestFile.exists()) { def manifestText = manifestFile.getText('UTF-8') def updatedManifestText = manifestText.replaceAll('<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />', '') manifestFile.write(updatedManifestText, 'UTF-8') } } } } ... }
Con esto habremos eliminado este permiso del manifest.
Si queremos añadir mas pondremos lo siguiente:
applicationVariants.all { variant -> variant.outputs.each { output -> output.processManifest.doLast { def manifestFile = file("$buildDir/intermediates/merged_manifests/${variant.dirName}/AndroidManifest.xml") if (manifestFile.exists()) { def manifestText = manifestFile.getText('UTF-8') def updatedManifestText = manifestText .replaceAll('<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />', '') .replaceAll('<uses-permission android:name="android.permission.SEND_SMS" />', '') .replaceAll('<uses-permission android:name="android.permission.RECEIVE_MMS" />', '') manifestFile.write(updatedManifestText, 'UTF-8') } } } }
A partir de Android Gradle 9.0 output.processManifest.doLast es obsoleto y se debe cambiar por: output.processManifestProvider.get().doLast
applicationVariants.all { variant -> variant.outputs.each { output -> output.processManifestProvider.get().doLast { def manifestFile = file("$buildDir/intermediates/merged_manifests/${variant.dirName}/AndroidManifest.xml") if (manifestFile.exists()) { def manifestText = manifestFile.getText('UTF-8') def updatedManifestText = manifestText .replaceAll('<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />', '') .replaceAll('<uses-permission android:name="android.permission.SEND_SMS" />', '') .replaceAll('<uses-permission android:name="android.permission.RECEIVE_SMS" />', '') .replaceAll('<uses-permission android:name="android.permission.READ_SMS" />', '') .replaceAll('<uses-permission android:name="android.permission.RECEIVE_MMS" />', '') .replaceAll('<uses-permission android:name="android.permission.READ_MMS" />', '') manifestFile.write(updatedManifestText, 'UTF-8') } } } }
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.