Eliminar permisos no necesarios al generar APK o app-bundle con Expo 52 React Native y plugin en build.gradle con gradle 8.10.2

Tiempo de lectura: 2 minutos

Hoy vamos a aprender cómo podemos eliminar permisos no necesarios qué se puedan añadir automáticamente a nuestro build desde librerías externas en React Native con Expo.

gato - pexels

Para realizar esta eliminación automática de los permisos tendremos qué crear un plugin para expo que añada un pequeño script dentro de build.gradle de Android en tiempo de generación del APK o el archivo app-bundle para la tienda de aplicaciones Google Play.

Primero tenemos que crear nuestro plugin que llamaremos RemovePermissions.js

const { withAppBuildGradle } = require('@expo/config-plugins');

const withCustomAndroidConfig = (config) => {
    config = withAppBuildGradle(config, (config) => {
        // Verifica que el contenido del build.gradle esté presente
        if (config.modResults.contents) {
            const buildGradleContents = config.modResults.contents;

            // El código a agregar
            const codeToAdd = `
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.processManifestProvider.get().doLast {
                        // Comprobar si la ruta para debug o release existe
                        def manifestFile
                        if (variant.buildType.name == 'debug') {
                            // Ruta para debug
                            manifestFile = file("$buildDir/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml")
                        } else if (variant.buildType.name == 'release') {
                            // Comprobamos si existe la ruta para release con processReleaseManifest
                            def releaseManifestFile = file("$buildDir/intermediates/merged_manifests/release/processReleaseManifest/AndroidManifest.xml")
                            if (releaseManifestFile.exists()) {
                                manifestFile = releaseManifestFile
                            } else {
                                // Si no existe, usamos la ruta estándar
                                manifestFile = file("$buildDir/intermediates/merged_manifests/release/AndroidManifest.xml")
                            }
                        }
            
                        // Verificar si el archivo manifest existe y modificarlo
                        if (manifestFile.exists()) {
                            println "Modificando el archivo manifest en: \${manifestFile}"
                            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" />', '')
                                .replaceAll('<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />', '')
                            manifestFile.write(updatedManifestText, 'UTF-8')
                        } else {
                            println "El archivo manifest no se encuentra en: \${manifestFile}"
                        }
                    }
                } 
            }`;

            const regex = /applicationVariants\.all\s*\{[\s\S]*?variant\.outputs\.each\s*\{[\s\S]*?output\.processManifestProvider.get\(\)\.doLast\s*\{[\s\S]*?}[\s\S]*?\}/;

            // Verifica si ya existe el bloque en build.gradle
            if (!regex.test(buildGradleContents)) {
                // Agregar codeToAdd al final del bloque 'android { ... }'
                const modifiedContents = buildGradleContents.replace(
                    /(android\s*{[\s\S]*?})/g,  // Aquí buscamos el bloque 'android { ... }'
                    (match) => {
                        return `${match.trim()}
    ${codeToAdd}`;  // Añadimos el texto justo antes de cerrar el bloque 'android'
                    }
                );
                config.modResults.contents = modifiedContents;
                //console.log("Contenido modificado de build.gradle:", modifiedContents);
            }
        }

        return config;
    });

    return config;
};

module.exports = withCustomAndroidConfig;

Ahora vamos a expo > plugins:

"expo":{

 "plugins": [
      [

Y añadimos:

      "./src/util/configPluginApp/RemovePermissions",

Deja un comentario