Crear un script para editar AndroidManifest.xml después de generar el build con React Native Expo para eliminar permisos.

Tiempo de lectura: 2 minutos

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')
            }
        }
    }
}

Deja un comentario