如何生成一个可以在没有服务器的情况下运行与react-native的apk?

我已经构建了我的应用程序,我可以在我的本地模拟器上运行它(也可以通过更改调试服务器在同一网络中的Android设备上运行它)。

但是,我想构建一个APK,我可以在没有访问开发服务器的情况下发送给某人,并且我希望他们能够测试应用程序。

我看到文档有一个部分 在iOS上使用离线捆绑包 部分。但是我不知道如何为Android完成同样的事情。这可能吗?如果是这样,如何?

更新:关于这个问题的答案(Android无法加载JS捆绑包),据说可以从开发服务器下载离线捆绑包。但是当我从开发服务器获取捆绑包时,无法加载图像文件。


答案 1

在Aditya Singh的回答之后,生成的(未签名的)apk不会安装在我的手机上。我必须使用此处的说明生成一个签名的apk。

以下内容对我有用:

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

将文件放在项目文件夹的目录下。然后编辑文件并添加以下内容(将 **** 替换为正确的密钥库密码、别名和密钥密码)my-release-key.keystoreandroid/app~/.gradle/gradle.properties

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=****
MYAPP_RELEASE_KEY_PASSWORD=****

如果您使用的是 MacOS,则可以按照此处的说明将密码存储在钥匙串中,而不是以纯文本形式存储密码。

然后编辑 app/build.gradle 并确保存在以下内容(可能需要添加带有 signingConfigs signingConfig 的部分):

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...

然后运行命令 ,cd android && ./gradlew assembleRelease

对于视窗“cd android”,然后运行命令,并在下找到您签名的apk,或者gradlew assembleReleaseandroid/app/build/outputs/apk/app-release.apkandroid/app/build/outputs/apk/release/app-release.apk


答案 2

您将必须创建一个密钥来签署apk。使用以下命令创建密钥:

 keytool -genkey -v -keystore my-app-key.keystore -alias my-app-alias -keyalg RSA -keysize 2048 -validity 10000

出现提示时使用密码

生成密钥后,使用它来生成可安装的构建版本:

 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/

使用 gradle 生成构建

 cd android && ./gradlew assembleRelease

将APK上传到您的手机。该标志将替换现有应用(如果存在)-r

adb install -r ./app/build/outputs/apk/app-release-unsigned.apk

这里提到了更详细的描述:https://facebook.github.io/react-native/docs/signed-apk-android.html

更新:根据@shashuec和@Fallen的评论

如果您遇到错误

ENOENT:没有这样的文件或目录,打开'android/app/src/main/assets/index.android.bundle'

运行 mkdir android/app/src/main/assets