react native window環境打包android APK

react native打包APK首先要生成一個簽名密鑰

? ? 1. 進入jdk的安裝目錄下C:\Program Files\Java\jdk1.8.0_151\bin,打開黑窗口運行:

keytool -genkeypair -v -keystore auditkey.keystore -alias auditkey -keyalg RSA -keysize 2048 -validity 10000

這條命令會要求你輸入密鑰庫(keystore)和對應密鑰的密碼,然后設置一些發行相關的信息。最后它會生成一個叫做auditkey.keystore 的密鑰庫文件。(注意auditkey是需要修改自己命名的密鑰名稱)

在運行上面這條語句之后,密鑰庫里應該已經生成了一個單獨的密鑰,有效期為 10000 天。--alias 參數后面的別名是你將來為應用簽名時所需要用到的,所以記得記錄這個別名。

? 2. 設置gradle變量

? 把auditkey.keystore文件放到你工程中的android/app文件夾下。如下圖

![app目錄下](https://upload-images.jianshu.io/upload_images/11822162-c062cdd666f0e2a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

? 3. 把簽名配置加入到項目的 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. 生成發行 APK 包

? 切換到android目錄下,打開黑窗口運行gradlew assembleRelease 命令

? 生成的 APK 文件位于android/app/build/outputs/apk/release/app-release.apk,它已經可以用來發布了

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,386評論 0 10
  • This project was bootstrapped with Create React App. Belo...
    unspecx閱讀 5,197評論 0 2
  • Correctness AdapterViewChildren Summary: AdapterViews can...
    MarcusMa閱讀 8,887評論 0 6
  • 習慣在黃昏落寞的時候寫上一段安靜的文字,裝作并不開心,這其實是真的。 時間會慢慢沉淀,有些人會在你心底慢慢模糊,但...
    聽張老師說閱讀 478評論 1 8
  • 1954年,卡爾夫參加洛溫菲爾德在蘇黎世的討論,深受啟發,希望尋找一種能夠有效幫助兒童心理分析的方法與途徑。于是,...
    風和日麗王秀波閱讀 108評論 0 0