天天看點

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\\aapt  (版本)
rem android.jar -> X:\SDKManager\platforms\android-\android.jar  (版本)
rem aapt 是打包生成R.java和apk工具,具體存放在sdkManager中
rem android.jar是android基礎包,需要與AndroidManifest中targerSDK對應上
rem gen 是目前目錄下的gen檔案夾,生成的r.java需要存放在這裡
           

将所有java代碼打包為.class檔案

javac -source  -target  -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  -target   使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\\dx.bat  (版本)
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
           

參考資料

http://blog.csdn.net/yangwen123/article/details/8909058

https://forum.unity3d.com/threads/unable-to-build-for-android.417067/