现在有这么个需求,要手动编译apk,不用eclipse集成工具,用命令行直接编译。一开始直接拼凑命令行,后来发现命令行编译apk无法包含第三方Library和so库,很恶心啊。
调研了一下,用ant或maven,maven学习成本很高,而且ant很方便,所以用ant。
1、搭建ant环境......搭建好之后下载了一个测试程序,直接用的百度LBS的demo项目,项目名为:BaiduNaviSDKDemo-1.1.1-Mini
2、开始用ant手动为项目打包,用android SDK自带的android.bat命令为项目生成build.xml文件,要不然共用android自带的build.xml的话读里面的代码非常累,新生成的build.xml文件内容非常少,命令为:
android.bat update project --name BaiduNaviSDKDemo-1.1.1-Mini -t android-20 -p C:\SOFT\AndroidProject\v\BaiduNaviSDKDemo-1.1.1-Mini
3、报错,如图:
4、stackOverflow的解决办法,在命令中间加上 --subprojects参数,命令为:
android.bat update project --name BaiduNaviSDKDemo-1.1.1-Mini --subprojects -t android-20 -p C:\SOFT\AndroidProject\v\BaiduNaviSDKDemo-1.1.1-Mini
5、编译成功,如图:
6、然后进入到BaiduNaviSDKDemo-1.1.1-Mini工程目录中执行“ant release”直接进行打包,(也可以不用进入到工程根目录打包,打包的命令为:ant release Buildfile: C:\SOFT\AndroidProject\v\BaiduNaviSDKDemo-1.1.1-Mini\build.xml)但是报错:
7、是没有填写相应的签名文件,查了一下相关命令参数:
ant 参数介绍
* debug:带调试用签名的构建
* release:构建应用程序,生成的apk必须签名才可以发布
* install:安装调试构建的包到运行着的模拟器或者设备;
* reinstall
* uninstall
key.store=keystore的全路径(例如:C:\\SOFT\\AndroidProject\\v\\BaiduNaviSDKDemo-1.1.1-Mini\\Keystore)
key.store.password=密码(例如:haha123)
key.alias=key的别名(例如:haha123)
key.alias.password=alias密码(例如:haha123)
8、重新在工程目录中执行“ant release”命令
编译成功,如图:
9、用eclipse查看bin目录下,多了很多文件,有签名的,未签名的:
10、可以在build.xml中配置参数,使生成签名apk成功后,删掉临时的未签名apk。
第一阶段结束,开始研究build.xml配置使其支持编译apk时同时编译so文件和三方Library(他妈的,整死我了,全是坑)
=============================快乐的分割线==========================
先编写特定的build.xml,参照这位大神的,依赖第三方库的解决方案http://www.cnblogs.com/qianxudetianxia/archive/2012/07/04/2573687.html。整出了一套build.xml,用这个大神的代码,命令行不需要输入ant release,只输入ant编译即可。
问题1、出现什么找不到的包的错误,明明已经包含第三方库的jar包,已经引入了。可还是报错,我就把第三方库里面的jar和src里面的内容都移到主工程中,合并为一个工程,这下不报错了。
问题2、出现编码问题,里面有两个错误,如图:
先解决第二个错误:经排查,是一个工程中有两种编码格式的文件,有一部分是GBK的,有一部分是utf-8的。解决办法是修改build.xml,使其javac编译成class文件时,统一编码格式,全都用utf-8,如图:
就变成了这个错误:
整了一个程序,将GBK编码的文件全部都转换成utf-8格式文件。转换程序出自:http://www.oschina.net/code/snippet_97118_11332
可以读取指定目录下的所有java文件,将其转换成UTF-8格式,个别GBK文件转换成utf-8后发生乱码,就是第一个错误截图。把备用文件拷贝过来,粘贴替换新的java文件,直接用utf-8格式保存,就好使了。
问题3、找不到dx命令,找不到apkbuilder命令,报错如图:
问题原因:是因为
packaging class files (include the third-party jars) to calsses.dex ...
此处不识别dx命令,apkbuilder同理
解决办法:
packaging class files (include the third-party jars) to calsses.dex ...
问题4、错误如图:发现是bin/res.zip就不存在,查找原因,一步一步向上找,发现是因为那个图片资源找不到而导致"生成资源文件"步骤时出错,根本就没生成res.zip,生成资源文件步骤的截图:
根本就没生成res.zip,百度上图中的错误:error: Error: No resource found that matches the given name ...没发现什么太有用的信息,觉得可能是由于错误太多,看不到全部,所以就在eclipse中ant了一下,ant方法如图:
在console栏中看到了全部错误:
发现那一大堆错误的上面还有一些ERROR,经查询发现是.9.png的问题,但是我也不会改呀,所以我就想了个招,直接把.9去掉,变成普通png图片,这些错误就都没有了。
问题5、最后一个错误:failed to create 'bin/unsigned.apks':系统找不到指定的路径。百度和google都没有相关的错误,搜索了好久,最后搜索了关键字:”ant编译错误 系统找不到指定路径“搜索到一篇文章:http://blog.csdn.net/u010311313/article/details/39345567帮了我大忙,按照这个修改apibuilder.bat之后,成功编译了。心里无限喜悦,成功如图:
但是还没有把so库文件编译进去,管他呢,先运行一下看看,发现”设置“模块如图:
这个就是因为把.9.png的图片变成了普通png图片的结果,一点一点改吧。
问题6、接下来把so库文件编译到项目中:
我以为很难的,其实很简单,修改build.xml如图:
问题7、当点击主界面的作业模块、签到模块时,程序崩溃。
1、点击作业模块时程序崩溃后台报错如图:
2、点击签到模块时程序崩溃后台报错如图:
3、骂了隔壁的,这个错误坑死我了,我先后搜索了其中的几个错误:
Exceptionandroid.content.res.Resources$NotFoundException: String resource ID #0x7f070007
java.lang.reflect.InvocationTarget
android.view.InflateException: Binary XML file line #106: Error inflating class com.system.homework.view.RefreshableView
4、并按照网上的答案各种修改RefreshableView的什么setText()、额外添加了两个构造函数 都tm不好使。苦逼死我了
5、可能是ant编译的问题,因为用eclipse编译就好使(将两个工程变成一个工程的时候编译好使)也许是ant的问题,
6、所以搜索关键词:“ant打包 Exceptionandroid.content.res.Resources$NotFoundException: String resource ID #0x7f070007”也没搜索出什么逼玩意出来。
7、然后google " ant build Exceptionandroid.content.res.Resources$NotFoundException: String resource ID #0x7f070007”也一样。
8、查这个问题查了一天,最后我想再用eclipse编译一遍试一下确保用eclipse编译好使,结果发现eclipse编译的也不好使,艾尼玛,
9、查找这中间我都做了什么操作,发现就是把java文件进行转码了而已,这tm的坑死我了
10、重新拿过来新的合并后的程序(之前测试过了,好使)重新转码,ant编译,发布,就好使了
11、我去年买了个表!
参考资料:
http://www.apkbus.com/android-138842-1-1.html
http://www.csdn123.com/html/exception/537/537530_537537_537539.htm
http://my.oschina.net/bigtiger/blog/201924
http://blog.csdn.net/houyu_1983/article/details/9129031
http://www.bingfengsa.com/old/archives/27617.html