Как правильно создать APK с подписанной версией в react-native? - PullRequest
1 голос
/ 19 июня 2020

Я не уверен, что то, что я делаю, - это правильный путь или пропустить какой-то шаг или слишком много шагов , которые я сделал. Способ создания APK я нашел из различных материалов в учебниках, форумах и в примерах. Опять же, я до сих пор не уверен, как я его создаю.

У меня есть сгенерированный файл хранилища ключей в каталоге ./android/app. Ниже приведены то, что я нашел и попробовал, но я не знаю, чем они отличаются друг от друга :

ШАГ 1:

> cd android
> gradlew clean
> gradlew assembleRelease

ШАГ 2:

> react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle
> cd android
> gradlew assembleRelease

ШАГ 3:

> react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
#Go to ".\android\app\src\main\res" and delete all *drawable-xxxx* and *raw* folder if exist
> cd android
> gradlew assembleRelease -x bundleReleaseJsAndAssets

ШАГ 4:

> npx jetify
> cd android
> gradlew clean
> gradlew assembleRelease

ШАГ 5:

# Go to ./android/app/src/main/assets/ and remove `index.android.bundle` file
> react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
> cd .\android\app\src\main\res && if exist "drawable-hdpi" rmdir "drawable-hdpi" /q /s && if exist "drawable-mdpi" rmdir "drawable-mdpi" /q /s && if exist "drawable-xhdpi" rmdir "drawable-xhdpi" /q /s && if exist "drawable-xxhdpi" rmdir "drawable-xxhdpi" /q /s && if exist "drawable-xxxhdpi" rmdir "drawable-xxxhdpi" /q /s && if exist "raw" rmdir "raw" /q /s
> cd..\..\..\..\..\android
> gradlew assembleRelease -x bundleReleaseJsAndAssets

С другой стороны рука, я также создаю свой собственный командный файл, чтобы сделать эту сборку как APK. Этот файл будет на одну папку перед запуском проекта root.

build-react-native-release.bat:

@echo off
:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )
set driveName="%CD:~0,2%"
set currentFolder="%~dp0"
setlocal enableextensions enabledelayedexpansion
set /A count=1
set list=
CD %driveName%

echo ===========================================
for /d %%D in (*) do (
    set "listName=%%~f"
    set list=%listName%%1
    rem echo !listName! !
    echo !count!^. %%~D
    set /a count+=1
)
echo ===========================================
:startAgain
set choice=
set /p choice=Type in target folder from listing to build release APK (e.g. targetfolder): 
if not '%choice%'=='' (
    if exist %choice% (
        set choice=%choice%
        CD %choice%
        goto performbuild
    )
)
echo Invalid directory name!
goto startAgain

:performbuild
echo Script will start build target APK to release on %choice%...
timeout /t 2 /nobreak>nul
cd %currentFolder%%choice%^\android\app\src\main\assets
del "index.android.bundle" 2>nul
cd %currentFolder%%choice%
call react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
rem start "" %currentFolder%%choice%^\android\app\src\main\res
timeout /t 2 /nobreak>nul
cd %currentFolder%%choice%^\android\app\src\main\res
echo Validating duplicating resources
if exist "drawable-hdpi" rmdir "drawable-hdpi" /q /s 2>nul
if exist "drawable-mdpi" rmdir "drawable-mdpi" /q /s 2>nul
if exist "drawable-xhdpi" rmdir "drawable-xhdpi" /q /s 2>nul
if exist "drawable-xxhdpi" rmdir "drawable-xxhdpi" /q /s 2>nul
if exist "drawable-xxxhdpi" rmdir "drawable-xxxhdpi" /q /s 2>nul
if exist "raw" rmdir "raw" /q /s 2>nul
cd %currentFolder%%choice%^\android
call gradlew assembleRelease
cd %currentFolder%%choice%
:choiceOpt
set /P answ=Build complete. Do you want to rebuild again[Y/N]?
if /I "%answ%" EQU "Y" goto :performbuild
if /I "%answ%" EQU "N" goto :justexit
goto :choiceOpt

:justexit
echo Exiting
timeout /t 2 /nobreak>nul
exit

И этот APK созданный на .\android\app\build\outputs\apk\release, мы будем передавать его для загрузки в Playstore для проверки?

1 Ответ

2 голосов
/ 19 июня 2020

Итак, посмотрите, наконец, вы хотите, чтобы подписанный APK / пакет был загружен в ваш игровой магазин. Чтобы сделать это, как вы упомянули, все шаги, наконец, выполняют одно и то же. создание подписанного APK:

Следующие шаги будут идеальными для вас:

1. создание обновленного пакета js, потому что это то, что содержит ваш последний код. Это сделано для обновления вашего пакета для вашего собственного кода реакции. Убедитесь, что ваш файл пакета называется index.android.bundle или просто index.bundle в каталоге android/app/src/main/assets.

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle

2. После Android X вы хотите перенести все зависимости, совместимые с android х. В вашем собственном каталоге реакции выполните следующие действия:

yarn add jetifier или npm i jetifier, затем

npx jetify  

3. После этого перейдите в каталог android с помощью cd android и выполнить чистую операцию, это очистит все существующие сборки:

./gradlew clean
  1. После этого, находясь в каталоге android, вы можете создать APK или пакет. Вы можете загрузить оба в playstore. Но я бы посоветовал использовать пакет, поскольку он значительно уменьшает размер вашего приложения.

    a. Чтобы собрать APK: ./gradlew assembleRelease, и это создаст APK в /android/app/build/outputs/apk/ b. Для сборки пакета: './gradlew bundleRelease, и это создаст пакет в android/app/build/outputs/bundle/

Вы можете поделиться APK или загрузить его, но вы не можете поделиться пакетом, вы можете только загрузить пакет в playstore.

Надеюсь, это поможет. не стесняйтесь сомневаться

...