我通过react native创建一个简单的应用程序。现在完成部署后,我要发布apk,以便按照official site的要求创建密钥:
"C:\Program Files\Java\jdk1.8.0_162\bin\keytool.exe" -genkeypair -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
我添加了:
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=mypass
MYAPP_UPLOAD_KEY_PASSWORD=mypass
进入android/gradle.properties
文件,最后我在release
文件的signingConfigs
部分中添加了android/app/build.gradle
部分:
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
}
并且我将此符号配置添加到buildTypes
部分:
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
}
}
但运行\android> ./gradlew bundleRelease
后:
PS F:\SafaProject\ReactNative\RNAuditMngm\android> ./gradlew bundleRelease
> Task :app:bundleReleaseJsAndAssets
warning: the transform cache was reset.
Loading dependency graph, done.
info Writing bundle output to:, F:\SafaProject\ReactNative\RNAuditMngm\android\app\build\generated\assets\react\release\index.android.bundle
info Writing sourcemap output to:, F:\SafaProject\ReactNative\RNAuditMngm\android\app\build\generated\sourcemaps\react\release\index.android.bundle.map
info Done writing bundle output
info Done writing sourcemap output
info Copying 13 asset files
info Done copying assets
> Task :react-native-gesture-handler:compileReleaseJavaWithJavac
Note: F:\SafaProject\ReactNative\RNAuditMngm\node_modules\react-native-gesture-handler\android\src\main\java\com\swmansion\gesturehandler\react\RNGestureHandlerButtonViewManager.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
> Task :react-native-reanimated:compileReleaseJavaWithJavac
Note: F:\SafaProject\ReactNative\RNAuditMngm\node_modules\react-native-reanimated\android\src\main\java\com\swmansion\reanimated\NodesManager.java uses or overrides a deprecated
API.
Note: Recompile with -Xlint:deprecation for details.
Note: F:\SafaProject\ReactNative\RNAuditMngm\node_modules\react-native-reanimated\android\src\main\java\com\swmansion\reanimated\NodesManager.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.5/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 1m 54s
88 actionable tasks: 84 executed, 4 up-to-date
PS F:\SafaProject\ReactNative\RNAuditMngm\android>
它只是在app.aab
文件夹中创建\app\build\outputs\bundle\release
文件吗?
我如何创建apk文件?
这是完整的应用build.gradle
答案 0 :(得分:2)
如果要创建.apk,请运行命令:
cd android
./ gradlew assembleRelease
它将在此处生成发行版APK:
android / app / build / output / apk / release / app-release.apk
如果您想生成一个小玩意(.aab)并上传到游戏商店:
cd android
./ gradlew bundleRelease
答案 1 :(得分:1)
这是我生成签名 APK 的方式。
我还将向您展示如何安全地加载您的 gradle 变量,以便可以将项目安全地推送到 Git 而不会暴露您的密码(令人讨厌的是教程中没有介绍这一点)。
您可以使用 keytool 生成私有签名密钥。在 Windows 上,keytool 必须从 C:\Program Files\Java\jdkx.x.x_x\bin 运行。
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
此命令会提示您输入密钥库和密钥的密码以及密钥的专有名称字段。然后将密钥库生成为名为 my-upload-key.keystore 的文件。
密钥库包含一个密钥,有效期为 10000 天。
将 my-upload-key.keystore 文件放在项目文件夹中的 android/app 目录下。
在 android 文件夹中创建一个新文件:android/keystore.properties 并添加以下内容(但显然使用您自己的密码)。
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=YOUR_PASSWORD_HERE
MYAPP_UPLOAD_KEY_PASSWORD=YOUR_PASSWORD_HERE
然后将此新文件添加到 .gitignore 以便您可以安全地推送到 github 而不暴露您的变量:
keystore.properties
接下来,修改您的 android/app/build.gradle 代码以加载您的密钥库属性:
// Load keystore
def keystorePropertiesFile = rootProject.file("keystore.properties");
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
// ...
android{
// ...
signingConfigs {
release {
if ( keystorePropertiesFile.exists() ) {
storeFile file(keystoreProperties['MYAPP_UPLOAD_STORE_FILE'])
storePassword keystoreProperties['MYAPP_UPLOAD_STORE_PASSWORD']
keyAlias keystoreProperties['MYAPP_UPLOAD_KEY_ALIAS']
keyPassword keystoreProperties['MYAPP_UPLOAD_KEY_PASSWORD']
}
}
}
buildTypes {
release {
// ...
signingConfig signingConfigs.release
}
}
// ...
}
这样做可以确保如果其他人在没有 keystore.properties 文件的情况下从 Git 克隆项目,该项目仍然可以工作 - 完美。
删除当前的 index.android.bundle 文件:
rm android/app/src/main/assets/index.android.bundle
如果不存在这样的文件,那么您将收到“没有这样的文件或目录”消息。
接下来,生成android bundle,注意下面是一条命令:
npx 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
您可能会收到“重复资源”错误(至少我总是这样做)。转到 /android/app/src/main/res 文件夹并删除所有以“drawable”开头的文件。
导航到 android 文件夹:
cd android
并运行以下命令来生成您的发布版 APK:
./gradlew clean && ./gradlew assembleRelease
如果有任何错误,请删除 android/.gradle 和 android/app/build/ 并重试。
您已签名的 APK 现在应位于 android/app/build/outputs/apk/app-release.apk。
一旦您的构建成功,然后从您项目的根文件夹运行以下命令以在您的设备中测试您的应用程序:
npx react-native run-android --variant=release
如果您有任何问题,请在重新执行上述步骤之前尝试以下操作:
我将此答案写为 an article 以供将来参考,但请随时将其加入书签:)