react native打包APK首先要生成一個(gè)簽名密鑰
? ? 1. 進(jìn)入jdk的安裝目錄下C:\Program Files\Java\jdk1.8.0_151\bin,打開(kāi)黑窗口運(yùn)行:
keytool -genkeypair -v -keystore auditkey.keystore -alias auditkey -keyalg RSA -keysize 2048 -validity 10000
這條命令會(huì)要求你輸入密鑰庫(kù)(keystore)和對(duì)應(yīng)密鑰的密碼爆哑,然后設(shè)置一些發(fā)行相關(guān)的信息澄暮。最后它會(huì)生成一個(gè)叫做auditkey.keystore 的密鑰庫(kù)文件艾栋。(注意auditkey是需要修改自己命名的密鑰名稱)
在運(yùn)行上面這條語(yǔ)句之后,密鑰庫(kù)里應(yīng)該已經(jīng)生成了一個(gè)單獨(dú)的密鑰座掘,有效期為 10000 天。--alias 參數(shù)后面的別名是你將來(lái)為應(yīng)用簽名時(shí)所需要用到的,所以記得記錄這個(gè)別名归粉。
? 2. 設(shè)置gradle變量
? 把a(bǔ)uditkey.keystore文件放到你工程中的android/app文件夾下。如下圖
![app目錄下](https://upload-images.jianshu.io/upload_images/11822162-c062cdd666f0e2a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
? 3. 把簽名配置加入到項(xiàng)目的 gradle 配置中
apply plugin: "com.android.application"
import com.android.build.OutputFile
/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
* and bundleReleaseJsAndAssets).
* These basically call `react-native bundle` with the correct arguments during the Android build
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
* bundle directly from the development server. Below you can see all the possible configurations
* and their defaults. If you decide to add a configuration block, make sure to add it before the
* `apply from: "../../node_modules/react-native/react.gradle"` line.
*
* project.ext.react = [
*? // the name of the generated asset file containing your JS bundle
*? bundleAssetName: "index.android.bundle",
*
*? // the entry file for bundle generation
*? entryFile: "index.android.js",
*
*? // whether to bundle JS and assets in debug mode
*? bundleInDebug: false,
*
*? // whether to bundle JS and assets in release mode
*? bundleInRelease: true,
*
*? // whether to bundle JS and assets in another build variant (if configured).
*? // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
*? // The configuration property can be in the following formats
*? //? ? ? ? 'bundleIn${productFlavor}${buildType}'
*? //? ? ? ? 'bundleIn${buildType}'
*? // bundleInFreeDebug: true,
*? // bundleInPaidRelease: true,
*? // bundleInBeta: true,
*
*? // whether to disable dev mode in custom build variants (by default only disabled in release)
*? // for example: to disable dev mode in the staging build type (if configured)
*? devDisabledInStaging: true,
*? // The configuration property can be in the following formats
*? //? ? ? ? 'devDisabledIn${productFlavor}${buildType}'
*? //? ? ? ? 'devDisabledIn${buildType}'
*
*? // the root of your project, i.e. where "package.json" lives
*? root: "../../",
*
*? // where to put the JS bundle asset in debug mode
*? jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
*
*? // where to put the JS bundle asset in release mode
*? jsBundleDirRelease: "$buildDir/intermediates/assets/release",
*
*? // where to put drawable resources / React Native assets, e.g. the ones you use via
*? // require('./image.png')), in debug mode
*? resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
*
*? // where to put drawable resources / React Native assets, e.g. the ones you use via
*? // require('./image.png')), in release mode
*? resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
*
*? // by default the gradle tasks are skipped if none of the JS files or assets change; this means
*? // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
*? // date; if you have any other folders that you want to ignore for performance reasons (gradle
*? // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
*? // for example, you might want to remove it from here.
*? inputExcludes: ["android/**", "ios/**"],
*
*? // override which node gets called and with what additional arguments
*? nodeExecutableAndArgs: ["node"],
*
*? // supply additional arguments to the packager
*? extraPackagerArgs: []
* ]
*/
project.ext.react = [
? ? entryFile: "index.js"
]
apply from: "../../node_modules/react-native/react.gradle"
/**
* Set this to true to create two separate APKs instead of one:
*? - An APK that only works on ARM devices
*? - An APK that only works on x86 devices
* The advantage is the size of the APK is reduced by about 4MB.
* Upload all the APKs to the Play Store and people will download
* the correct one based on the CPU architecture of their device.
*/
def enableSeparateBuildPerCPUArchitecture = false
/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = false
android {
? ? compileSdkVersion rootProject.ext.compileSdkVersion
? ? compileOptions {
? ? ? ? sourceCompatibility JavaVersion.VERSION_1_8
? ? ? ? targetCompatibility JavaVersion.VERSION_1_8
? ? }
? ? defaultConfig {
? ? ? ? applicationId "com.auditproject"
? ? ? ? minSdkVersion rootProject.ext.minSdkVersion
? ? ? ? targetSdkVersion rootProject.ext.targetSdkVersion
? ? ? ? versionCode 1
? ? ? ? versionName "1.0"
? ? }
? ? splits {
? ? ? ? abi {
? ? ? ? ? ? reset()
? ? ? ? ? ? enable enableSeparateBuildPerCPUArchitecture
? ? ? ? ? ? universalApk false? // If true, also generate a universal APK
? ? ? ? ? ? include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
? ? ? ? }
? ? }
? signingConfigs {
? ? ? ? release {
? ? ? ? ? ? storeFile file("auditkey.keystore")
? ? ? ? ? ? storePassword "auditproject"
? ? ? ? ? ? keyAlias "auditkey"
? ? ? ? ? ? keyPassword "auditproject"
? ? ? ? }
? ? }
? ? buildTypes {
? ? ? ? release {
? ? ? ? ? ? minifyEnabled enableProguardInReleaseBuilds
? ? ? ? ? ? proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
? ? ? ? ? ? signingConfig signingConfigs.release
? ? ? ? }
? ? }
? ? // applicationVariants are e.g. debug, release
? ? applicationVariants.all { variant ->
? ? ? ? variant.outputs.each { output ->
? ? ? ? ? ? // For each separate APK per architecture, set a unique version code as described here:
? ? ? ? ? ? // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
? ? ? ? ? ? def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4]
? ? ? ? ? ? def abi = output.getFilter(OutputFile.ABI)
? ? ? ? ? ? if (abi != null) {? // null for the universal-debug, universal-release variants
? ? ? ? ? ? ? ? output.versionCodeOverride =
? ? ? ? ? ? ? ? ? ? ? ? versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
dependencies {
? ? implementation fileTree(dir: "libs", include: ["*.jar"])
? ? implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
? ? implementation "com.facebook.react:react-native:+"? // From node_modules
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
? ? from configurations.compile
? ? into 'libs'
}
4. 生成發(fā)行 APK 包
? 切換到android目錄下漏峰,打開(kāi)黑窗口運(yùn)行g(shù)radlew assembleRelease 命令
? 生成的 APK 文件位于android/app/build/outputs/apk/release/app-release.apk糠悼,它已經(jīng)可以用來(lái)發(fā)布了