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.

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",

Ingeniero en Informática, Investigador, 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.