Migrando aplicación Android a React native: Primeros problemas
En el tutorial de como añadir React Native a una aplicación nativa para Android, están muy claro los pasos a seguir, pero encontrarse con problemas es extremadamente fáciles, en la primera hora encontré tres problemas solo para poder ejecutar una sincronización de Gradle por primera vez.
Versión de Gradle
React Native, al menos en la versión 0.71 (la última a fecha de escribir este artículo), necesita funcionar con Gradle 6+ en Android para poder funcionar, pero no está especificado en ningún sitio, el error en cuestión es:
e: node_modules/react-native-gradle-plugin/build.gradle.kts:10:19: Unresolved reference: configurationcache
Solución: Actualizar Gradle de la versión 4.2 en la que estaba el proyecto hasta 7.5, para estar en la última disponible y evitar problemas a futuro.
Archivos antiguos impidiendo Gradle Build
Una vez pasado el primer error, el segundo es también bastante críptico, al hacer build de Gradle:
The current character read is 'i' with an int value of 105
Solución: Eliminar las carpetas de build
de build anteriores de Android dentro de app/build/
Memoria de Android Studio
Tercer error, como si de una aventura se tratase, encontramos el siguiente al hacer build:
Null extracted folder for artifact: ResolvedArtifact(componentIdentifier=com.facebook.react:react-android:0.71.3,
variant=com.facebook.react:react-android:0.71.3 variant debugVariantDefaultApiPublication, variantName=null,
artifactFile=.gradle/caches/modules-2/files-2.1/com.facebook.react/react-android/0.71.3/23d18991c93161fab7f522d07bb77eb76287b8a/react-android-0.71.3-debug.aar,
isTestFixturesArtifact=false, extract edFolder=null, publishedLintJar=null, dependencyType=ANDROID, isWrappedModule=false, buildMapping={__current_build__=/android, react-native-gradle-plugin=/node_modules/react-native-gradle-plugin})
Solución: Aumentar la memoria de Android Studio, ya qua que se queda sin memoria al realizar el build en esta ocasión.
Para ello hay que modificar el archivo gradle.properties
en la raiz del proyecto y añadir: org.gradle.jvmargs=-Xmx4096M
PackageList missing
Cuarto error encontrado, al no poder encontrar el paquete PackageList dentro de React. Este problema es derivado de haber instalado (o intentando instalar) el paquete con la versión anterior de Gradle (punto 1), en el que la instalación quedó incompleta.
error: cannot find symbol
List<ReactPackage> packages = new PackageList(getApplication()).getPackages();
^
symbol: class PackageList
location: class MyReactActivity
Solución: Borrar la carpeta node_modules
y volver a ejecutar yarn install
será suficiente.
Arrancar app android desde yarn
Al terminar de configurar todo e intentar arrancar la app usando yarn start
+ a
, tenemos el siguiente error en la
consola:
Error: spawn ./gradlew EACCES
at ChildProcess._handle.onexit (node:internal/child_process:285:19)
at onErrorNT (node:internal/child_process:483:16)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
info Run CLI with --verbose flag for more details.
Solución: Modificar los permisos para ejecutar gradlew
fuera de Android Studio, solucionado con un simple chmod:
`chmod 755 android/gradlew
Ruby 2.7.6 en Mac M1
Para instalar las dependencias de iOS con bundler
es necesario tener Ruby 2.7.6 (que está deprecado y solo recibe
actualizaciones de seguridad críticas, no bugfixes), e instalarlo en un Mac M1 en 2023 no es tan fácil como podría
parecer.
✖ Installing Bundler
error Your Ruby version is 3.2.1, but your Gemfile specified 2.7.6
Solución:
- Instalar rbenv
-
Añadir rbenv en el path (.zshrc en mi caso)
export PATH=$HOME/.rbenv/bin:/usr/local/bin:$HOME/.bin:$PATH
-
Forzar la instalación de 2.7.6 con el siguiente comando, ya que una instalación normal fallará con el error
BUILD FAILED (macOS 13.1 using ruby-build 20230222)
CFLAGS="-Wno-error=implicit-function-declaration" RUBY_CONFIGURE_OPTS='--with-readline-dir=/usr/local/opt/readline/' arch -x86_64 rbenv install 2.7.6
- Establecer ruby 2.7.6 globalmente para la instalación de React Native / iOS
rbenv global 2.7.6
Añadir soporte para iOS en el proyecto
La documentación de React tiene toda la información para añadir React Native a una aplicación existente, pero no cuenta con documentación oficial de como añadir soporte para otra plataforma. La manera de conseguirlo es en base a realizar distintos trucos.
Solución:
- Crear un archivo
app.json
con el contenido{"name": "empirestrikeapp", "displayName": "Empire Strike"}
- Instalar react-native-eject
yarn add react-native-eject
- Ejecutar eject
npx react-native eject
Esto generará la carpeta de ios, donde ya se puede acceder y ejecutar pod install
¡Hola Mundo!
Finalmente, conseguimos tener la primera vista de React Native con uno ¡Hola mundo!