在使用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
。
寫在最後,鑑於本人水平有限,如文章有錯誤之處,請不吝指正!(^▽^)