在使用react-native 的整個過程中,我深一腳淺一腳的走到今天,着實為自己感到高興。在此記錄踩坑過程,阿門!
官方文檔 中有完整打包apk步驟,我們一步步來。
首先,我們需要使用keytool
生成一個私有秘鑰,在Windows上keytool
命令放在JDK的bin目錄中。也就是說,命令必須在JDK安裝的bin目錄下運行,命令如下:
$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-
alias -keyalg RSA -keysize 2048 -validity 10000
接下來的過程中,我需要輸入秘鑰口令及其他的一些信息,一切都很完美,就在此時,拋出一個錯誤:
java.io.FileNoFoundException:my-release-key.keystore(拒絕訪問。)
這個錯誤是說找不到my-release-key
這個文件,這是由於在安裝我的JDK安裝到了C盤,命令行在當前路徑下沒有寫入文件的權限。這時,可以選擇兩種解決方法:
-
以管理員身份運行cmd,執行上述命令。
有多種方法可以使用,這里只敘述一種,在路徑C:\Windows\System32
中找到cmd.exe
,右鍵以管理員身份運行。 -
我們可以將秘鑰生成於其他盤,運行如下命令,將
<MY_PATH>
替換成秘鑰保存路徑即可。$ keytool -genkey -v -keystore my-release-key.keystore -alias
my-key-alias - keyalg RSA -keysize 2048 -validity 20000 -keystore
/<MY_PATH>/my-release-key.keystore
接下來,設置gradle
變量。官方文檔有詳細步驟,這里只做簡單敘述
-
將剛剛生成的秘鑰放到項目下的
android/app
文件夾下 -
編輯或創建
~/.gradle/gradle.properties
,將以下示例代碼添加進去,注意要將******
部分替換成相應密碼MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****
最后,生成發行apk包。運行如下命令:
cd android && ./gradlew assembleRelease
在windows 系統下,可能無法識別&&
命令,所以講上述命令分為兩步:先運行cd android
,進入當前項目下的android
文件夾,然后運行./gradlew assembleRelease
,就在即將大功告成之際,報了如下錯誤:
Exception in thread "main" java.util.zip.ZipException: error in opening zip file
這是由於gradle.zip
下載有問題,解決方法有二。
- 將
gradle-2.14.1-all.zip
刪除后重新運行上述命令,文件會重新下載。 - 手動下載文件,將其放到對應文件夾
gradle-2.14.1-all.zip
文件對應位置在個人電腦上有所不同,在我這里是C:\Users\wxl\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv
。
下載成功之后,再次鍵入命令,發現這最后一步還是沒有邁過去。系統報錯:gradlew : 無法將“gradlew”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確,然后再試一次。
官方文檔中有這樣一句:
./gradlew assembleRelease
在macOS、Linux或是windows的PowerShell環境中表示執行當前目錄下的名為gradlew的腳本文件,且其運行參數為assembleRelease,注意這個./不可省略;而在windows的傳統CMD命令行下則需要去掉./
。
所以我在運行時,直接運行gradlew assembleRelease
,實際上這樣反而會報錯,正確的命令就是./gradlew assembleRelease
。這一步僅作為參考,可能和windows的系統版本有關。
這次,打包順利完成,如圖就是我們所打包出來的apk,生成的APK文件位於android/app/build/outputs/apk/app-release.apk
。
寫在最后,鑒於本人水平有限,如文章有錯誤之處,請不吝指正!(▽)