Как использовать автономный пакет на android для реагирования на собственный проект?

Как использовать автономный пакет на Android?
Я не видел документа об использовании автономного пакета на Android.
Я попытался раскомментировать код в 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, ie 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, eg 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, eg 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/**"] ] 

Но он не работал. Он все еще извлекает пакет JS с сервера.
Я что-то пропустил?

Для автономного объединения JS в android сначала запустите сервер в соответствующем пути проекта:

  1. При запуске сервера откройте следующий терминал с тем же путем, что и путь к проекту
  2. Скопируйте и вставьте эту команду: перед тем, как скопировать и вставить команду в команду propmt, сделайте папку с ресурсами в соответствующем пути проекта
    в виде:
    Android / приложение / SRC / основные / активы

    Вставьте эту команду в командной строке и запустите:

      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/ 
  3. Затем в папке с ресурсами появится файл index.android.bundle

  4. Наконец, запустите команду: response-native run-android (при создании нового автономного apk вам не нужно запускать сервер, ваш автономный js-файл поможет вам собрать файл apk.)
  5. Final, теперь apk build готов для работы на разных устройствах (запустите apk из app / src / build / debug.apk).
  6. Иногда новый apk запускается без показов изображений. Если приложение запускается без изображения, то скопируйте и вставьте конкретную папку ресурса изображений в папку android / app / src / main / assets / (исходная папка с изображениями)
  7. Снова повторное приложение и, следовательно, сборка apk готова к запуску.

Вы можете прочитать исходный код react.gradle , тогда вы узнаете, как сделать автономный пакет.

В случае react.gradle он создает автономную задачу градиента связки для каждого варианта сборки и делает ее выполняться до ресурсов процесса градации, но она позволяет задание пакета в некоторых особых условиях, код:

 enabled config."bundleIn${targetName}" || config."bundleIn${buildTypeName.capitalize()}" ?: targetName.toLowerCase().contains("release") 

В то время как объект config – это объект react поскольку его определение определяется def config = project.hasProperty("react") ? project.react : []; def config = project.hasProperty("react") ? project.react : [];

targetName определение targetNamedef targetName = "${productFlavorName.capitalize()}${buildTypeName.capitalize()}"

Поэтому, если мы определим правильное свойство react в app\build.gradle , мы можем включить задачу автономного пакета.

Например, если мы хотим включить автономный пакет в тип сборки release но не в стиле debug , мы можем определить react как:

 ext.react = [ bundleInDebug : false, bundleInRelease : true ] 

Затем выполните gradle assembleRelease в командной строке, gradle выполнит задачу с пакетом, а пакет js будет включен в final apk.

Теперь в вашем вопросе вы определили правильный объект react , но не указываете, какой тип сборки вы использовали. gradle assembleRelease только gradle assembleRelease можете выполнить задание на связку, возможно, вы выполнили gradle assembleDebug поэтому это не имеет никакого смысла.

И еще есть еще одна проблема, которую я должен сказать (см. Также в номере7258 ). Если вы включили задачу связки для типа сборки выпуска и запустили приложение из студии android, gradle не выполнит bundleReleaseJsAndAssets , потому что студия Android поддерживает функцию Configure on demand (она находится в файле | Настройки, сборка, выполнение, развертывание | компилятор) по умолчанию Для ускорения сборки, а в react.gradle задача пакета добавляется к проекту, когда весь проект сконфигурирован (или называется оцененным), поскольку основной код находится в gradle.projectsEvaluated{} block.

Режим конфигурации по требованию пытается настроить только проекты, которые имеют отношение к запрошенным задачам, т. Е. Он выполняет только файл build.gradle проектов, участвующих в сборке.

По некоторым неясным причинам любая задача определяется в gradle.projectsEvaluated{} не выполняется при включении функции Configure on demand . Чтобы сделать его исполняемым, отключите функцию « Configure on demand в настройках студии Android или измените gradle.projectsEvaluated{} на afterEvaluate{} .

Если вы запускаете gradle assembleRelease в инструменте командной строки, все в порядке, потому что Configure on demand отключена по умолчанию.

Вам не нужно раскомментировать что-либо в вашем файле gradle.build. Он доступен для справки, и вы можете перезаписать любое из значений, которые есть по умолчанию, если вам нужно.

Проблема в том, что Android Studio не выполняет задачу, отвечающую за создание пакета.

Чтобы исправить это, в Android Studio перейдите в Preferences > Build, Execution, Deployment > Build Tools > Compiler и снимите флажок "Configure on demand" .

Теперь любой вариант, который вы отмечаете как требующий связки, будет автоматически сгенерирован.

По умолчанию вариант debug не получает сгенерированный пакет: bundleInDebug : false

Вы можете изменить это так. Здесь я также привел пример, как изменить местоположение по умолчанию для точки входа и имя по умолчанию для пакета.

 project.ext.react = [ bundleAssetName: "index.myapp.bundle", entryFile: "js/index.myapp.js", bundleInDebug: true ] 

Как только вы выполните эти настройки, вы все равно можете сконфигурировать проблемы, потому что Studio не распознает пути из ваших профилей оболочки, поэтому я не могу найти путь к узлу.

Я опубликовал решение этой проблемы здесь

Это стабильное и надежное решение. Вам не нужно ничего делать вручную, как только вы вносите эти изменения в свой env. Пакет будет автоматически создан при нажатии кнопок в вашей среде IDE, если вы выберете правильные варианты сборки (также в IDE на панели LHS окна Studio внизу).

Для выпуска с подписью APK.

Я попытался использовать файл без знака APK и установил его, но когда я пошел устанавливать его на свой Android-планшет, это дало мне ошибку Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] .

Я предполагаю, что это связано с тем, что файл APK не был подписан, и планшет был недоволен этим. Таким образом, после генерации файла пакета React Native я смог создать подписанный файл APK, как обычно, через Android Studio.

Кстати, наше приложение является полностью функционирующим Android-приложением, которое уже существует в Play Store, и мы просто добавляем React Native к нему в кусочки размером с укусом, потому что это потрясающе.

Итак, чтобы подвести итог, здесь были мои шаги:

1) Создать реактивный родной пучок:

 react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/<your-package-name>/src/main/assets/index.android.bu‌​ndle --assets-dest android/<your-package-name>/src/main/res/ 

2) Создайте подписанный файл APK из Android Studio.

3) Установите подписанный файл APK на USB-устройство:

 adb -d install -r <path_to_signed_apk> 

4) Прибыль!

Вы можете переопределить функцию getJSBundleFile () в вашем классе ReactApplication, чтобы вернуть путь к пользовательскому файлу.

 @Nullable @Override protected String getJSBundleFile() { return "/your/bundle/path/bundle.file.name.bundle"; } 

После этого просто сгенерируйте пакет с помощью react-native bundle , затем поместите сгенерированный пакет по указанному пути на вашем устройстве.