react native window環(huán)境打包android APK

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ā)布了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芽狗,隨后出現(xiàn)的幾起案子绢掰,更是在濱河造成了極大的恐慌,老刑警劉巖童擎,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滴劲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡顾复,警方通過(guò)查閱死者的電腦和手機(jī)班挖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芯砸,“玉大人萧芙,你說(shuō)我怎么就攤上這事〖偕ィ” “怎么了双揪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)包帚。 經(jīng)常有香客問(wèn)我渔期,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任疯趟,我火速辦了婚禮拘哨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘信峻。我一直安慰自己倦青,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布盹舞。 她就那樣靜靜地躺著产镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矾策。 梳的紋絲不亂的頭發(fā)上磷账,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音贾虽,去河邊找鬼逃糟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蓬豁,可吹牛的內(nèi)容都是我干的绰咽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼地粪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼取募!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蟆技,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤玩敏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后质礼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旺聚,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年眶蕉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砰粹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡造挽,死狀恐怖碱璃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饭入,我是刑警寧澤嵌器,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站谐丢,受9級(jí)特大地震影響爽航,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一岳掐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饭耳,春花似錦串述、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至新蟆,卻和暖如春觅赊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琼稻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工吮螺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帕翻。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓鸠补,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘀掸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子紫岩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,292評(píng)論 0 10
  • This project was bootstrapped with Create React App. Belo...
    unspecx閱讀 5,135評(píng)論 0 2
  • Correctness AdapterViewChildren Summary: AdapterViews can...
    MarcusMa閱讀 8,851評(píng)論 0 6
  • 習(xí)慣在黃昏落寞的時(shí)候?qū)懮弦欢伟察o的文字,裝作并不開(kāi)心睬塌,這其實(shí)是真的泉蝌。 時(shí)間會(huì)慢慢沉淀,有些人會(huì)在你心底慢慢模糊揩晴,但...
    聽(tīng)張老師說(shuō)閱讀 467評(píng)論 1 8
  • 1954年勋陪,卡爾夫參加洛溫菲爾德在蘇黎世的討論,深受啟發(fā)文狱,希望尋找一種能夠有效幫助兒童心理分析的方法與途徑粥鞋。于是,...
    風(fēng)和日麗王秀波閱讀 105評(píng)論 0 0