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

IT技术 javascript android react-native mobile-application
2021-02-07 10:41:47

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

但是,我想构建一个可以发送给无需访问开发服务器的人的 APK,我希望他们能够测试应用程序。

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

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

6个回答

按照 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.keystore文件放在android/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 并确保存在以下内容(可能需要添加带有签名配置的部分签名配置):

...
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

对于 Windows 'cd android' 然后运行gradlew assembleReleasecommand ,并在 下找到您签名的apk android/app/build/outputs/apk/app-release.apk,或者android/app/build/outputs/apk/release/app-release.apk

谢谢,它不是,但我发现这是因为我使用 expo 进行测试,并且 create native app npm 具有不同的结构,因此以供将来参考,如果有人遇到此问题,只需弹出您的项目即可那些文件夹,有趣的是教程告诉你如何使用 npm 创建应用程序,然后谈论一个在你使用它时不存在的结构
2021-03-20 10:41:47
app-release.apk 未安装。问题是什么?
2021-03-23 10:41:47
我创建了 apk,上传到 google play,但它不起作用......一些提示?
2021-03-28 10:41:47
我找不到 android/app 文件夹,它在哪里?
2021-04-03 10:41:47
这是最新最准确的答案。谢谢。
2021-04-10 10:41:47

您必须创建一个密钥来签署 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

我收到此错误Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 当我尝试安装 apk 时。
2021-03-23 10:41:47
我对 Facebook 糟糕的文档感到惊讶,他们完全省略了这一react-native bundle部分。感谢您的回答!
2021-03-26 10:41:47
我正在使用 Windows,也可以使用它gradlew.bat assembleRelease
2021-03-27 10:41:47
如果你得到错误ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle' 运行mkdir android/app/src/main/assets
2021-04-04 10:41:47
非常感谢这个,它对我有用。我得到的唯一问题是这条消息:“缺少必需的参数:捆绑输出”在 react-native-bundle 部分,但通过删除 2 个“\”符号解决
2021-04-07 10:41:47

您应该在此过程中使用 android studio。它只是更简单。但首先在您的本机应用程序目录中运行此命令:

对于较新版本的 react-native(例如 react native 0.49.0 等等...)

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

对于旧版本的 react-native(0.49.0 及以下)

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/

然后使用android studio在你的本机应用程序目录中打开'android'文件夹,它会要求升级gradle和其他一些东西。转到构建-> 生成签名的 APK 并按照那里的说明进行操作。这真的很简单。

我还使用 Android Studio 和 Xcode 为我的 React Native 应用程序构建发布版本……但是可以使用@Aditya Singh 描述的脚本来生成 android 版本
2021-03-22 10:41:47
这不再需要proandroiddev.com/...
2021-04-05 10:41:47

运行此命令:

react-native run-android --variant=release

请注意,--variant=release只有在您设置了使用cd android && ./gradlew assembleRelease.

我尝试cd android && ./gradlew installRelease并收到此错误Task 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'.
2021-03-15 10:41:47
是的,您必须生成密钥库文件。并编辑 gradle 文件。按照这些说明解决此问题。facebook.github.io/react-native/docs/signed-apk-android.html
2021-03-19 10:41:47
@jasan 我在这里发现了另一个像你一样的问题:github.com/facebook/react-native/issues/11586 这可能会解决这个问题:cd android && ./gradlew installRelease
2021-04-08 10:41:47

如果有人想在没有 Playstore 密钥的情况下进行构建,那么此命令将非常有用。

# react-native run-android --variant=release

构建完成后,您可以在发布构建文件中找到该 apk。

您正在寻找的 APK 将位于里面 /android/app/build/outputs/apk/release
2021-04-05 10:41:47