1. 程式人生 > >Unity快速打包安卓apk

Unity快速打包安卓apk

記載目錄:

1.雜言雜語
2.快速打包原理
3.快速打包的具體步驟
    a.生成R.java類
    b.將所有java程式碼打包為.class檔案
    c.生成classes.dex檔案
    d.打包所有資源為apk資源包
    e.將apk資源包打包為未簽名的apk包
    f.對未簽名的apk包進行簽名
4.常見報錯
5.改進建議
6.參考資料

雜言雜語

曾經寫過Unity自動打包安卓apk的解決辦法---當時沿用將所有的外掛打包到plugin/android下,依靠Unity自身的打包程式將工程打包成apk的打包方法;後來在實踐當中發現這一方法有很多限制,比如說我們的在Unity中使用的某些外掛是必須依賴於其它工程的,那麼如果沿用舊方式,就必須對第三方工程進行改動,活生生的將N個工程合併為一個工程,並且以後該外掛有變動,所有的維護工作都還得依賴我們再度合併工程。
不論從效率還是從維護成本上來看,以前那種方式都不是最好的解決方案。打包apk其實還存在另外一種方式去打包,就是像xcode般匯出android工程(eclipse),從eclipse中去打包apk.
下面就是這種打包方式的快速打包方案。

快速打包原理

打過Xcode的童鞋都知道,xcode只要配置好一次以後,以後匯出的xcode工程直接覆蓋原來的工程,再進行配置,就僅僅花費很少時間就可以打包處ipa了(其實還有更簡單的自動配置Xcode方法)
android工程也能達到類似的效果:
在Unity中所有的資源和程式碼,再匯出android工程後都會存放在assets資料夾中,根據這一特點我們可以直接寫個工程替換掉已經配置好的eclipse工程中的assets檔案
在替換掉assets以後,只要再執行打包程式,就可以生成一個apk了。

快速打包的具體步驟

rem 這個指令碼是執行在android工程所在的目錄
cd /d X:\eclipse_android_project\

生成R.java類

aapt package -m -J gen -S res -A assets -I android.jar -M AndroidManifest.xml

rem  -S res -A assets 這是資源 android工程下的資源目錄
rem aapt -> X:\SDKManager\build-tools\25.0.2\aapt  (25版本)
rem android.jar -> X:\SDKManager\platforms\android-25\android.jar  (25
版本) rem aapt 是打包生成R.java和apk工具,具體存放在sdkManager中 rem android.jar是android基礎包,需要與AndroidManifest中targerSDK對應上 rem gen 是當前目錄下的gen資料夾,生成的r.java需要存放在這裡

將所有java程式碼打包為.class檔案

javac -source 1.7 -target 1.7 -g -verbose -bootclasspath android.jar -d bin src\com\all_java_folder\*.java gen\com\R.java -classpath all_jar_full_path.jar

rem -source 1.7 -target 1.7  使java生成的class帶目標版本
rem -bootclasspath android.jar 與打包R.java是的android.jar相同
rem -d [*.class存放目錄][需要打包的java目錄下所有的java程式]
rem -classpath 所有程式引用到的jar包,這裡的jar包必須得填完整路徑,也就是說有一百個jar包就必須填寫一百條完整路徑

生成classes.dex檔案


dx.bat --dex --output=x:\classesdex_path\classes.dex dir_class_path all_jar_full_path.jar

rem 打包後的classes.dex 在生成未簽名的apk時使用
rem dx.bat 生成.dex的工具 通常放在 SDKManager\build-tools\25.0.1\dx.bat  (25版本)
rem --output=[打包出來的classes.dex存放路徑] [上一步生成的class檔案目錄] [跟上一步驟一樣的所有jar包]

打包所有資源為apk資源包

aapt package -f -S res -A assets -I android.jar -M AndroidManifest.xml -F save_resource_target_path

rem -F save_resource_target_path 生成資源包路徑
rem 這一步與第一步生成R.java時非常的類似,其它的引數就不解釋了

將apk資源包打包為未簽名的apk包

java -cp sdklib.jar com.android.sdklib.build.ApkBuilderMain seve_apk_path/unsigned_apk.apk -v -u -z save_resource_target_path -nf libs -f classes.dex

rem sdklib X:/SDKManager\tools\lib\sdklib.jar  com.android.sdklib.build.ApkBuilderMain
rem 由於apkbuilder不能夠再繼續使用了,所以呼叫sdklib.jar包達到相同的功能 後面的引數是固定的
rem -nf libs libs 下存放所有的.so檔案 
rem -f [classes.dex] 
rem -z save_resource_target_path 上一步生成的資源包路徑

對未簽名的apk包進行簽名

jarsigner -verbose -keystore keyname.keystore -storepass passwd -signedjar xxxxSigned.apk xxxxUngined.apk alias_name

rem jarsigner 這是簽名檔案,按照按正常,能夠直接執行java就能夠直接執行jarsigner 
rem -keystore [keyname.keystore  完整的keystore簽名檔案路徑]
rem -storepass keystore簽名的密碼
rem -signedjar [簽名後的apk存放的路徑] [未簽名的apk存放路徑(上一步生成的)]
rem 最後最後別忘記了需要把簽名的別名放在後面 alias_name




rem 至此apk打包過程就執行完了。

常見報錯

1.unsupported class file version 52.0
這是在將所有java程式碼打包為.class檔案步驟發生報的錯
造成的原因是由於你的java版本是1.8的,而java程式碼中又使用了1.7版本所造成的
解決辦法是:javac -source 1.7 -target 1.7 
2.執行時提示class not found
發生這一步你把apk使用壓縮工具開啟,可以看到dex檔案的大小不對
在android機器上,執行的都是.dex檔案
重新檢查打包dex步驟,檢視類是否全部打包進去了,還有jar包也進去了
3.開始遊戲提示硬體不支援
不多說了,.so檔案沒有打包進去
4.無法執行安卓遊戲
這一情況很複雜的,但是如果你連apk點選都後就提示apk標示等問題,那麼很有可能就是簽名的問題
重新檢查簽名是否正確
查詢是否簽名成功命令:
jarsigner -verify *******.apk

改進建議

1.將上述步驟改成python程式碼實現,不僅便於維護還可以支援跨平臺打包
2.將python/bat檔案放到Unity裡面
3.呼叫Unity打包回撥API---OnPostProcessBuild 函式實現回撥python/bat檔案
py的shell資料:http://blog.csdn.net/biospc/article/details/77427432

參考資料