ReactNative之Android打包APK方法(趟坑過程)

多余的不解釋了。直接上車吧。中途遇到的問題我也寫出來了(其實和官網教程相似但也有不同不然我也不會寫出來了):遇到問題可以留言

Android 打包 閃退的問題,極有可能是你簽名配置不正確,建議仔細檢查每個步驟,找不到問題建議命令打包根據錯誤提示解決

1、生成簽名秘鑰:

方法一:

你可以用keytool命令生成一個私有密鑰。在Windows上keytool命令放在JDK的bin目錄中(比如C:\Program Files\Java\jdkx.x.x_x\bin),
你可能需要在命令行中先進入那個目錄才能執行此命令。

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

這條命令會要求你輸入密鑰庫(keystore)和對應密鑰的密碼,然后設置一些發行相關的信息。最后它會生成一個叫做my-release-key.keystore的密鑰庫文件。
在運行上面這條語句之后,密鑰庫里應該已經生成了一個單獨的密鑰,有效期為10000天。--alias參數后面的別名是你將來為應用簽名時所需要用到的,所以記得記錄這個別名。

方法二: 直接使用 Android studio 進行簽名

1.

image.png

2.如果你沒有就創建新的,當然這里也可以選中使用方法一創建的keystore
image.png

3.next 搞定

注意:請記得妥善地保管好你的密鑰庫文件,不要上傳到版本庫或者其它的地方。

2、設置gradle變量:

my-release-key.keystore文件放到你工程中的android/app文件夾下。
編輯~/.gradle/gradle.properties(沒有這個文件你就創建一個),添加如下的代碼(注意把其中的****替換為相應密碼)
注意:~表示用戶目錄,比如windows上可能是C:\Users\用戶名,而mac上可能是/Users/用戶名

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

這里可以放到這里面:


image.png

上面的這些會作為全局的gradle變量,我們在后面的步驟中可以用來給應用簽名。

3、添加簽名到應用的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
        }
    }
}
...

我是這樣寫的,

 signingConfigs { 
       release { 
        storeFile file("/Users/ xxxxx/android/app/my-release-key.keystore")//這里換成你自己的
        storePassword "123456"http://這里換成你自己的
        keyAlias "my-key-alias"http://這里換成你自己的
        keyPassword "123456"http://這里換成你自己的
    }
     }

4、生成release版本的APK:

現在可以生成簽名版的APK 了:進入項目的根目錄,在終端運行React Native 包管理器:
$ npm start
然后根目錄在次運行下列命令:

$  mkdir -p android/app/src/main/assets
$ curl -k "http://localhost:8081/index.android.bundle" >android/app/src/main/assets/index.android.bundle  
$ cd android && ./gradlew assembleRelease

解釋:首先我們新建了一個assets目錄來存儲打包的JavaScript文件然后通過curlReactNative包管理器中獲取JavaScript文件。最后使用gradlew來構建release版本的APK

5、在設備上安裝release版本的APK(以上完成之后我用的Android Studio打包的)

image.png

在項目的android/目錄下運行 ./gradlew installRelease
好啦完成了。如果你這樣打包還出錯建議在第四步的時候可以用AndroidStudio進行打包。遇到問題可以看這個來解決

二打包離線Bundle

打包步驟

在工程根目錄下執行打包命令,

React-native bundle --entry-file index.android.js --bundle-output ./android/app/src/main/assets/index.android.jsbundle --platform android --assets-dest ./android/app/src/main/res/ --dev false

0.49之后用這個:

React-native bundle --entry-file index.js --bundle-output ./android/app/src/main/assets/index.android.jsbundle --platform android --assets-dest ./android/app/src/main/res/ --dev false


注意: 
1、[./android/app/src/main/assets/]文件夾必須存在,不存在就new一個assets文件夾,不然會報一個錯誤:

ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle'


2、./android/app/這個路徑一定要準確

執行完畢后:
image.png

打包apk文件

到你rn項目的根目錄下執行:(或者直接使用Androidstudio打包就可以)
cd android && ./gradlew assembleRelease
好啦~ 如果沒有錯的話,就說明apk文件打包完成了,然后到你的這個目錄下:
/android/app/build/outputs/apk

命令打包遇到問題:

問題1:

* What went wrong:
Could not list contents of 'xxxxx/node-pre-gyp/node_modules/.bin/detect-libc'. Couldn't follow symbolic link.
image.png

解決: 刪掉那些找不到的,比如上面那些都刪掉

問題二:

* What went wrong:
Execution failed for task ':app:processReleaseResources'.
> com.android.ide.common.process.ProcessException: Failed to execute aapt

解決方法:
1.這里檢查一下上面報錯日志上面給出的信息, 可能是因為打包 APK 導出asset文件或者圖片文件格式不正確導致的,建議查看!
2.如圖:


image.png

明顯圖片名字格式不正確.英文小寫沒有特殊符號數字等等.png
如果圖片本事項目中不需要可以直接刪掉.

3.cd android && ./gradlew assembleRelease 打包查看

問題三

Execution failed for task ':app:validateSigningRelease'. > Keystore file /Users/xxxxx/app/annn.jks not found for signing config 'release'.

說明你這個簽名沒有找到
解決方法:

步驟如圖: file -> ProjectStructure ->app -> signing
一.


image.png

二.


image.png

將你創建的簽名選上,

或者你用我這個方式寫試試:


image.png

問題四:

Error:Execution failed for task ':app:processReleaseManifest'.
> Manifest merger failed : Attribute application@label value=(xxx) from AndroidManifest.xml:16:7-26
    is also present at [:rn-fetch-blob] AndroidManifest.xml:35:18-50 value=(@string/app_name).
    Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:13:5-30:19 to override.

解決方法:Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:13:5-30:19 to override.
找到:

image.png

首先在 <manifest 
  加上:  xmlns:tools="http://schemas.android.com/tools"
    >

其次在:<application 加上這句: tools:replace="android:label"

></application>


免責聲明:所有信息來源于網絡和自己開發中的一點總結。如果有不妥希望指出我會改。

                                                                           --ZPengs

相關文章:
1.React Native開發錯誤警告處理總結(已解決 !持續更新)
2.ReactNative 實現的文件上傳功能(實測可行!)
3.React Native開發總結之:開發技巧和調試技巧
4.React Native開發總結:一、開發環境配置
5.Android 調試錯誤總結(ReactNative開發)(持續更新)
6.ReactNative開發之真機測試
7React Native開發之iOS打包ipa發布(親測可行)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容