记载目录:
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
参考资料
http://blog.csdn.net/yangwen123/article/details/8909058
https://forum.unity3d.com/threads/unable-to-build-for-android.417067/