發佈至 Google Play 商店
Android 要求所有應用程式在安裝前都必須使用憑證進行數位簽署。為了透過 Google Play 商店 發佈您的 Android 應用程式,它需要使用發佈金鑰進行簽署,該金鑰然後需要用於所有未來的更新。自 2017 年以來,由於 Google Play 應用程式簽署 功能,Google Play 可以自動管理簽署發佈版本。但是,在您的應用程式二進制檔案上傳到 Google Play 之前,它需要使用上傳金鑰進行簽署。簽署您的應用程式 Android 開發人員文件中的頁面詳細描述了該主題。本指南簡要介紹了該過程,並列出了打包 JavaScript 捆綁包所需的步驟。
如果您使用 Expo,請閱讀 Expo 指南以了解 部署到應用程式商店,以建置您的應用程式並提交到 Google Play 商店。本指南適用於任何 React Native 應用程式,以自動化部署流程。
產生上傳金鑰
您可以使用 keytool
產生私密簽署金鑰。
Windows
在 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
此命令會提示您輸入金鑰庫和金鑰的密碼,以及金鑰的 Distinguished Name 欄位。然後,它會將金鑰庫產生為名為 my-upload-key.keystore
的檔案。
金鑰庫包含單一金鑰,有效期為 10000 天。別名是您稍後在簽署應用程式時將使用的名稱,因此請記住記下別名。
macOS
在 macOS 上,如果您不確定 JDK bin 資料夾在哪裡,請執行以下命令來找到它
/usr/libexec/java_home
它將輸出 JDK 的目錄,看起來會像這樣
/Library/Java/JavaVirtualMachines/jdkX.X.X_XXX.jdk/Contents/Home
使用命令 cd /your/jdk/path
導航到該目錄,並使用 sudo 權限執行 keytool 命令,如下所示。
sudo keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
請記住將金鑰庫檔案設為私密。如果您遺失了上傳金鑰或金鑰已遭洩露,您應該按照這些指示操作。
設定 Gradle 變數
- 將
my-upload-key.keystore
檔案放在專案資料夾中的android/app
目錄下。 - 編輯檔案
~/.gradle/gradle.properties
或android/gradle.properties
,並新增以下內容(將*****
替換為正確的金鑰庫密碼、別名和金鑰密碼),
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****
這些將成為全域 Gradle 變數,我們稍後可以在 Gradle 設定中使用它們來簽署我們的應用程式。
將上述 Gradle 變數儲存在 ~/.gradle/gradle.properties
中,而不是 android/gradle.properties
中,可以防止它們被簽入到 git 中。您可能需要在使用者主目錄中建立 ~/.gradle/gradle.properties
檔案,然後才能新增變數。
如果您不喜歡以純文字形式儲存密碼,並且您正在執行 macOS,您也可以將您的憑證儲存在「鑰匙圈存取」應用程式中。然後您可以跳過 ~/.gradle/gradle.properties
中的最後兩行。
將簽署設定新增至您應用程式的 Gradle 設定
最後一個需要完成的配置步驟是設定發佈版本以使用上傳金鑰進行簽署。編輯專案資料夾中的檔案 android/app/build.gradle
,並新增簽署設定,
...
android {
...
defaultConfig { ... }
signingConfigs {
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 {
release {
...
signingConfig signingConfigs.release
}
}
}
...
產生發佈 AAB
在終端機中執行以下命令
npx react-native build-android --mode=release
此命令在底層使用 Gradle 的 bundleRelease
,將執行您的應用程式所需的所有 JavaScript 捆綁到 AAB(Android App Bundle)中。如果您需要變更 JavaScript 捆綁包和/或可繪製資源的捆綁方式(例如,如果您變更了預設檔案/資料夾名稱或專案的一般結構),請查看 android/app/build.gradle
,以了解如何更新它以反映這些變更。
請確保 gradle.properties
不包含 org.gradle.configureondemand=true
,因為這會使發佈版本跳過將 JS 和資源捆綁到應用程式二進制檔案中。
產生的 AAB 可以在 android/app/build/outputs/bundle/release/app-release.aab
下找到,並且可以上傳到 Google Play。
為了讓 Google Play 接受 AAB 格式,需要在 Google Play 管理中心為您的應用程式設定 Google Play 應用程式簽署。如果您正在更新不使用 Google Play 應用程式簽署的現有應用程式,請查看我們的遷移章節,以了解如何執行該配置變更。
測試您應用程式的發佈版本
在將發佈版本上傳到 Play 商店之前,請確保徹底測試它。首先解除安裝您已安裝的應用程式的任何先前版本。使用專案根目錄中的以下命令將其安裝在裝置上
- npm
- Yarn
npm run android -- --mode="release"
yarn android --mode release
請注意,只有在您已按照上述說明設定簽署時,--mode release
才可用。
您可以終止任何正在執行的 bundler 實例,因為您的所有框架和 JavaScript 程式碼都捆綁在 APK 的資源中。
發佈到其他商店
預設情況下,產生的 APK 具有 x86
、x86_64
、ARMv7a
和 ARM64-v8a
CPU 架構的原生程式碼。這使得更容易共享幾乎可在所有 Android 裝置上執行的 APK。但是,這樣做的缺點是,任何裝置上都會有一些未使用的原生程式碼,導致 APK 不必要地變大。
您可以透過在您的 android/app/build.gradle
檔案中新增以下行,為每個 CPU 建立 APK
android {
splits {
abi {
reset()
enable true
universalApk false
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
}
將這些檔案上傳到支援裝置定位的市場,例如 Amazon AppStore 或 F-Droid,使用者將自動獲得適當的 APK。如果您想上傳到其他市場,例如 APKFiles,這些市場不支援單一應用程式的多個 APK,請將 universalApk false
行變更為 true
,以建立具有兩個 CPU 二進制檔案的預設通用 APK。
請注意,您還必須設定不同的版本代碼,如官方 Android 文件中的此頁面中建議。
啟用 Proguard 以縮減 APK 的大小(選用)
Proguard 是一種可以稍微縮減 APK 大小的工具。它透過剝離您的應用程式未使用的 React Native Java 位元組碼(及其依賴項)的部分來實現這一點。
如果您已啟用 Proguard,請務必徹底測試您的應用程式。Proguard 通常需要針對您使用的每個原生函式庫進行特定設定。請參閱 app/proguard-rules.pro
。
若要啟用 Proguard,請編輯 android/app/build.gradle
/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = true
將舊版 Android React Native 應用程式遷移為使用 Google Play 應用程式簽署
如果您是從先前版本的 React Native 遷移而來,您的應用程式可能未使用 Google Play 應用程式簽署功能。我們建議您啟用它,以便利用自動應用程式分割等功能。為了從舊的簽署方式遷移,您需要先產生新的上傳金鑰,然後替換 android/app/build.gradle
中的發佈版本簽署設定,以使用上傳金鑰而不是發佈金鑰(請參閱關於將簽署設定新增至 gradle 的章節)。完成後,您應該按照 Google Play 說明網站的指示,將您的原始發佈金鑰傳送給 Google Play。
預設權限
預設情況下,INTERNET
權限會新增至您的 Android 應用程式,因為幾乎所有應用程式都使用它。SYSTEM_ALERT_WINDOW
權限會新增至偵錯模式下的 Android APK,但在生產環境中將會移除。