記載目錄:
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/