Как использовать автономный пакет на 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.bundle --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
, затем поместите сгенерированный пакет по указанному пути на вашем устройстве.