Как использовать автономный пакет на 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, 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/**"]
]

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

Ответ 1

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

  • при запуске сервера откройте следующий терминал с тем же путем, что и путь к проекту.
  • скопируйте и вставьте эту команду: Прежде чем копировать и вставлять команду в команду 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/
    
  • Затем в папке с ресурсами появится файл index.android.bundle

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

Вам не нужно раскомментировать что-либо в вашем файле 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 не распознает пути из ваших профилей оболочки, поэтому я не могу найти путь к node.

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

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

Ответ 4

Для выпуска с подписью 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) Прибыль!

Ответ 5

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

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

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