reales - manual android studio avanzado
¿Cómo usar el paquete fuera de línea en Android para reaccionar al proyecto nativo? (5)
¿Cómo usar el paquete fuera de línea en Android?
No vi el documento sobre el uso del paquete fuera de línea en Android.
Traté de descomentar el código en build.gradle.
project.ext.react = [
// the name of the generated asset file containing your JS bundle
bundleAssetName: "index.android.bundle",
// the entry file for bundle generation
entryFile: "index.android.js",
// whether to bundle JS and assets in debug mode
bundleInDebug: false,
// whether to bundle JS and assets in release mode
bundleInRelease: true,
// the root of your project, i.e. where "package.json" lives
root: "../../",
// where to put the JS bundle asset in debug mode
jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
// where to put the JS bundle asset in release mode
jsBundleDirRelease: "$buildDir/intermediates/assets/release",
// where to put drawable resources / React Native assets, e.g. the ones you use via
// require(''./image.png'')), in debug mode
resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
// where to put drawable resources / React Native assets, e.g. the ones you use via
// require(''./image.png'')), in release mode
resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
// by default the gradle tasks are skipped if none of the JS files or assets change; this means
// that we don''t look at files in android/ or ios/ to determine whether the tasks are up to
// date; if you have any other folders that you want to ignore for performance reasons (gradle
// indexes the entire tree), add them here. Alternatively, if you have JS files in android/
// for example, you might want to remove it from here.
inputExcludes: ["android/**", "ios/**"]
]
pero no funcionó. Todavía busca el paquete JS del servidor.
¿Hay algo que eché de menos?
Para publicación con un APK firmado.
Traté de usar un archivo APK sin firmar e instalar eso, pero cuando fui a instalarlo en mi tableta Android, me dio un error de Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
.
Me imagino que esto se debe a que el archivo APK no estaba firmado y la tableta no estaba contenta con esto. Entonces, después de generar el archivo del paquete React Native, pude generar un archivo APK firmado, como es normal, a través de Android Studio.
Por cierto, nuestra aplicación es una aplicación totalmente funcional de Android que ya existe en Play Store y solo le agregamos React Native en pedazos pequeños porque es increíble.
Para resumir, aquí están mis pasos:
1) Generar conjunto de React Native:
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/<your-package-name>/src/main/assets/index.android.bundle --assets-dest android/<your-package-name>/src/main/res/
2) Genere un archivo APK firmado de Android Studio.
3) Instalar el archivo APK firmado en el dispositivo USB:
adb -d install -r <path_to_signed_apk>
4) ¡Ganar!
No tiene que descomentar nada en su archivo gradle.build. Está ahí para referencia y puede sobrescribir cualquiera de los valores que están por defecto si es necesario.
El problema es que Android Studio no ejecuta la tarea que es responsable de generar el paquete.
Para solucionarlo en Android Studio, vaya a Preferences > Build, Execution, Deployment > Build Tools > Compiler
y desmarque "Configure on demand"
.
Ahora, cualquier variante que marque como que requiera paquete, tendrá el paquete generado automáticamente.
De forma predeterminada, la variante de depuración no obtiene el paquete generado: bundleInDebug : false
Puedes cambiar eso así Aquí también proporcioné ejemplos de cómo cambiar la ubicación predeterminada del punto de entrada y el nombre predeterminado del paquete.
project.ext.react = [
bundleAssetName: "index.myapp.bundle",
entryFile: "js/index.myapp.js",
bundleInDebug: true
]
Una vez que realice estos ajustes, aún puede profundizar en la creación de problemas porque Studio no reconoce rutas desde sus perfiles de shell, por lo que es posible que no encuentre la ruta al nodo.
Publiqué una solución a ese problema aquí
Esta es una solución estable y robusta. No tiene que hacer nada manualmente una vez que realice estos cambios en su env. El paquete se compilará automáticamente al presionar los botones en su IDE, con la condición de que seleccione las variantes de compilación adecuadas (que también están en IDE en la barra LHS de la ventana Studio hacia la parte inferior).
Para el paquete fuera de línea de JS en Android, primero inicie el servidor en la ruta del proyecto respectivo:
- cuando el servidor se inicia, abra el siguiente terminal con la misma ruta que la ruta del proyecto
Copie y pegue este comando: Antes de copiar y pegar el comando en el comando propmt, haga la carpeta de activos en la ruta respectiva del proyecto
como:
android / app / src / main / assetspegue este comando en el símbolo del sistema y ejecútelo:
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
Luego en la carpeta de activos aparecerá el archivo como index.android.bundle
- Finalmente, ejecute el comando: react-native run-android (mientras construye un nuevo apk fuera de línea no necesita iniciar el servidor, su archivo js sin conexión lo ayudará a compilar el archivo apk).
- Final, apk now build está listo para ejecutarse en diferentes dispositivos (ejecuta apk desde app / src / build / debug.apk).
- A veces la aplicación recién creada se ejecutará sin mostrar imágenes. Si la aplicación se ejecuta sin imagen, copie y pegue la carpeta de recursos de la imagen específica en android / app / src / main / assets / (carpeta de origen de la imagen)
- De nuevo vuelva a ejecutar la aplicación y, por lo tanto, compilar apk está listo para ejecutarse.
Puede anular la función getJSBundleFile () en su clase ReactApplication para devolver una ruta de archivo personalizada.
@Nullable
@Override
protected String getJSBundleFile() {
return "/your/bundle/path/bundle.file.name.bundle";
}
Después de eso, solo genere el paquete utilizando el paquete react-native bundle
, luego coloque el paquete generate en la ruta especificada en su dispositivo.
Puede leer el código fuente de react.gradle
, luego sabrá cómo hacer el paquete fuera de línea.
En react.gradle
, crea la tarea gradle bundle sin conexión para cada variante de compilación, y la hace ejecutar antes de los recursos del proceso de gradle, pero habilita la tarea del paquete en algunas condiciones especiales, el código es:
enabled config."bundleIn${targetName}" ||
config."bundleIn${buildTypeName.capitalize()}" ?:
targetName.toLowerCase().contains("release")
mientras que el objeto de config
es el objeto de react
realidad ya que su definición es def config = project.hasProperty("react") ? project.react : [];
def config = project.hasProperty("react") ? project.react : [];
y la definición de targetName
es def targetName = "${productFlavorName.capitalize()}${buildTypeName.capitalize()}"
Por lo tanto, si definimos una propiedad de react
adecuada en la app/build.gradle
, podemos habilitar la tarea del paquete sin conexión.
Por ejemplo, si queremos habilitar el paquete fuera de línea en el tipo de compilación de release
pero no en el tipo de compilación de debug
, podemos definir la react
como:
ext.react = [
bundleInDebug : false,
bundleInRelease : true
]
luego ejecuta gradle assembleRelease
en la línea de comandos, gradle ejecutará la tarea bundle y el paquete js se incluirá en la apk final.
Ahora en tu pregunta, has definido el objeto de react
adecuado, pero no mencionas qué tipo de compilación has ejecutado. Solo ejecute gradle assembleRelease
para hacer el trabajo de bundle, quizás haya ejecutado gradle assembleDebug
para que no tenga sentido.
Y todavía hay otro problema que necesito decir (También ver en el issue7258 ). Si habilitó la tarea de paquete para el tipo de compilación de lanzamiento y ejecuta la aplicación desde android studio, gradle no ejecuta bundleReleaseJsAndAssets
, porque android studio habilita la función Configure on demand
(está en File | Settings | Build, Execution, Deployment | Compiler) de forma predeterminada para acelerar la construcción, y en react.gradle
la tarea del paquete se agrega al proyecto cuando todos los proyectos están configurados (o llamados evaluados) ya que el código principal está en gradle.projectsEvaluated{}
block.
La configuración en modo de demanda intenta configurar solo los proyectos que son relevantes para las tareas solicitadas, es decir, solo ejecuta el archivo build.gradle de los proyectos que participan en la compilación.
Por algunas razones poco claras, cualquier definición de tarea en el bloque gradle.projectsEvaluated{}
no se ejecuta cuando se habilita la función Configure on demand
. Para que sea ejecutable, desactive la función Configure on demand
la Configure on demand
Android Studio, o cambie gradle.projectsEvaluated{}
para afterEvaluate{}
.
Si ejecuta gradle assembleRelease
en la herramienta de línea de comandos, todo está bien porque Configure on demand
está deshabilitado de manera predeterminada.