從同事那里轉(zhuǎn)來的文章裤唠。
>>>我的博客<<<
編譯react native項目种蘸,并最終打包成安卓的apk包
-entry-file 指定入口文件 因為要打包ios平臺,所以指定為rn項目的index.ios.js作為入口
–bundle-output 指定輸出的jsbundle文件路徑和文件名 指定到rn項目的ios工程文件夾下航瞭,記得一定要先創(chuàng)建bundle文件夾,不然終端會報文件夾找不到的錯誤
–platform 指定平臺類型
–assets-dest 指定資源文件夾路徑 assets文件夾的路徑章办,包含圖片滨彻、node模塊等資源
–dev 是否為開發(fā)模式 如果設(shè)置為false,不會產(chǎn)生警告休偶,并且bundle會被壓縮
還有其他命令辜羊,比如:transformer、prepack碱妆、bundle-encoding等昔驱,可以到官網(wǎng)查看具體介紹。
第十章 離線打包發(fā)布
10.2 Android打包發(fā)布
1)將js代碼打包成jsbundle包
-
在android工程中創(chuàng)建assets文件夾舍悯,可以用命令行創(chuàng)建萌衬,也可以手動創(chuàng)建它抱,命令如下:
mkdir android/app/src/main/assets
- 在工程的根目錄輸入如下命令進行打包
react-native bundle --entry-file demo/index.js --bundle-output ./android/app/src/main/assets/index.android.jsbundle --platform android --assets-dest ./android/app/src/main/res/ --dev false
【注意:上述命令中 “demo/index/.js”是你工程的安卓入口文件目錄】
- 在
MyApplication.java
中的ReactNativeHost中添加
getBundleAssetName`方法,該方法的返回值混移,必須與上一步中生成的jsbundle文件的文件名保持一致。
@Nullable
@Override
protected String getBundleAssetName() {
return "index.android.bundle";
}
2)利用命令行打包安卓APK
Android要求所有應(yīng)用都必須有一個簽名證書才允許安裝在手機上歌径,所以,在把應(yīng)用發(fā)布到應(yīng)用市場之前必須生成1個簽名的apk包狗准。
-
生成簽名秘鑰
在Windows上
keytool
命令放在JDK的bin目錄中(比如C:\Program Files\Java\jdkx.x.x_x\bin
)茵肃,你可能需要在命令行中先進入那個目錄才能執(zhí)行此命令。在mac上捞附,建議在工程目錄下生成:$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
【注:keystore名稱可自己修改】
這條命令會要求你輸入密鑰庫(keystore)和對應(yīng)密鑰的密碼您没,然后設(shè)置一些發(fā)行相關(guān)的信息。最后它會生成一個叫做my-release-key.keystore
的密鑰庫文件药版。
在運行上面這條語句之后喻犁,密鑰庫里應(yīng)該已經(jīng)生成了一個單獨的密鑰,有效期為10000天肢础。--alias參數(shù)后面的別名是你將來為應(yīng)用簽名時所需要用到的传轰,所以記得記錄這個別名。
-
設(shè)置gradle變量
把
my-release-key.keystore
文件放到你工程中的android/app
文件夾下慨蛙。-
在
android
工程的gradle.properties
文件中加入如下代碼:MYAPP_RELEASE_STORE_FILE=my-release-key.keystore MYAPP_RELEASE_KEY_ALIAS=my-key-alias MYAPP_RELEASE_STORE_PASSWORD=hongchuang MYAPP_RELEASE_KEY_PASSWORD=hongchuang
-
添加簽名到gradle配置文件
編輯你項目目錄下的
android/app/build.gradle
期贫,添加如下的簽名配置:... android { ... defaultConfig { ... } signingConfigs { release { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD } } buildTypes { release { ... signingConfig signingConfigs.release } } } ...
-
生成簽名apk包
cd android
./gradlew assembleRelease
./gradlew assembleRelease
在macOS、Linux或是windows的PowerShell環(huán)境中表示執(zhí)行當前目錄下的名為gradlew的腳本文件玛臂,且其運行參數(shù)為assembleRelease,注意這個./
不可省略迹冤;而在windows的傳統(tǒng)CMD命令行下則需要去掉./
。
Gradle的assembleRelease
參數(shù)會把所有用到的JavaScript代碼都打包到一起橱鹏,然后內(nèi)置到APK包中堪藐。如果你想調(diào)整下這個行為(比如js代碼以及靜態(tài)資源打包的默認文件名或是目錄結(jié)構(gòu)等),可以看看android/app/build.gradle
文件贮勃,然后琢磨下應(yīng)該怎么修改以滿足你的需求苏章。
生成的APK文件位于android/app/build/outputs/apk/app-release.apk
,它已經(jīng)可以用來發(fā)布了泉孩。
-
測試簽名包
輸入以下命令來安裝上一步生成的簽名包并淋,來進行測試。
cd android
./gradlew installRelease
注意
installRelease
參數(shù)只能在你完成了上面的簽名配置之后才可以使用县耽。 你現(xiàn)在可以關(guān)掉運行中的packager了兔毙,因為你所有的代碼和框架依賴已經(jīng)都被打包到apk包中,可以離線運行了澎剥。在debug和release版本間來回切換安裝時可能會報錯簽名不匹配,此時需要先卸載前一個版本再嘗試安裝祭饭。
-
啟用Proguard代碼混淆來縮小apk文件大行鹆俊(可選)
Proguard是一個Java字節(jié)碼混淆壓縮工具,它可以移除掉React Native Java(和它的依賴庫中)中沒有被使用到的部分悠咱,最終有效的減少APK的大小征炼。
【啟用Proguard之后,你必須再次全面地測試你的應(yīng)用眼坏。Proguard有時候需要為你引入的每個原生庫做一些額外的配置酸些。參見
app/proguard-rules.pro
文件∑嵌】啟用方法是修改android工程的
build.gradle
文件市栗,設(shè)置minifyEnabled
選項為true
buildTypes { release { signingConfig signingConfigs.release minifyEnabled true proguardFile 'proguard.txt' } }
3)利用androidStudio打包生成apk
-
利用AndroidStudio生成簽名秘鑰
具體方法是,androidStudio—>Build—>Generate Signed apk—>點擊【next】—>【Create new】
如下圖所示:
然后進入創(chuàng)建窗口蛛淋,選擇keystore路徑篡腌,key store密碼,然后下面如圖所示輸入公司及開發(fā)者信息嘹悼,信息輸入完成后點擊【ok】即可生成keystore杨伙。
此處的keystore password 跟key Alias 以及password 需要記住,當利用keystore打包時需要填寫棠赛。
-
利用AndroidStudio打包生成簽名apk
方法還是膛腐,androidStudio—>Build—>Generate Signed apk—>點擊【next】—>【Choose existing】—>選擇上一步生成的keystore文件路徑—>輸入keystore相關(guān)信息—>【Next】
然后選擇apk存儲路徑—>Signature Versions 選擇【V2(Full APK Signature)】—>【Finish】然后等待apk 打包完成即可
到這里哲身,打包工作就完成了,把apk上傳應(yīng)用商店即可勘天。
常見問題
1捉邢、build失敗
在國內(nèi)不適用代理的話build失敗是常見的商膊,有些包下載不下來晕拆。
另外如果有個別包就是下載失敗,可以嘗試調(diào)換repository里的順序实幕,比如我的環(huán)境里有個common-1.0.0.jar死活下載不下來,調(diào)了順序末贾,將google放成第一個就成功了整吆。
repositories {
jcenter()
google()
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
}
另外,bugild失敗如果本地有代理的話掂为,在android studio里正確配置代理也是一種辦法。