Android项目自动编译打包方案

6年前

从去年八月份接触Android开发到现在,开发均在eclipse中进行,对Android项目编译打包的过程一直不是很清晰,前段时间随着普元移动中间件新版本将要发布,我们对版本要做日编译,更重要的是我们要给客户提供自动的打包工具,使得客户使用我们的开发工具开发出来的html+js+css应用,通过打包工具,可以直接打包成一个android的apk包,发布应用。经过查找资料,终于找到了解决方案

从去年八月份接触Android开发到现在,开发均在eclipse中进行,对Android项目编译打包的过程一直不是很清晰,前段时间随着普元移动中间件新版本将要发布,我们对版本要做日编译,更重要的是我们要给客户提供自动的打包工具,使得客户使用我们的开发工具开发出来的html+js+css应用,通过打包工具,可以直接打包成一个android的apk包,发布应用。经过查找资料,终于找到了解决方案,现将总结如下:


第一点, Android自动打包脚本的完成 ,先看下adnroid编译打包的过程图



从图形中我们可以看出,编译打包的过程大致如下:


• 首先.aidl(Android Interface Description Language)文件需要通过aidl工具转换成编译器能处理的Java接口文件

• 同时资源文件将被aapt (Asset Packaging Tool)处理为最终的resources.arsc,并生成R.java文件以使源码可以方便地访问到这些资源

• Java的编译器将R.java, Java源码以及上述生成的接口文件统一编译成.class文件

• 不过.class并不是Android系统所能识别的格式,因而还要利用dex工具转化为Dalvik字节码。这其中还会加入所有需要的第三方库等文件

• 接下来系统将上面生成的dex,资源包,以及其它资源通过apkbuilder生成初始的apk文件包。这时还没有签名和优化

• 签名可以用Jarsigner,也可以用其它类似的工具。如果是在Debug模式下,所签名所用的keystore就是系统默认自带的,否则开发者需要提供自己的私钥以完成签名过程

• 最后一步,将上述签名后的apk通过zipalign进行优化,以提高加载和运行速度。大概原理是通过对其中包含的相关数据进行边界对齐,来加快读取和处理。这也同时解释了其名称"zip"+"align"的由来


搞清楚了编译的整个过程之后,根据google SDK中给出的ant编译脚本,我精简了sdk,只保留了必须用到的依赖包,更改了一个自动编译脚本,通过ant命令即完成了android项目自动编译的过程。


第二点, 自动打包工具的实现


上述仅仅是实现了普通android项目的自动打包,由于android应用是以包名做为应用的唯一标识,要做到自动打包成不同的项目,首先一点就是要自动的去更改包名。而项目中的资源文件的访问都是通过R.id 来访问的,这一点我查了许久,找到了android 项目可以是一个类库项目,即整个项目的产物是一个jar包,在其他项目中引用。顺着这个思路:

第一步: 将类库项目打包成一个jar包,并将含有R.class的文件删除

第二步:新建了一个新的android项目,AndroidManifest.xml中使用原项目中的        xml,同时将原项目中的资源文件copy到新的项目中

第三步:更改AndroidManifest.xml 中package为新的包名,应用名及图标为新应用的名称和图标

第四步:copy用户开发的项目zip包打指定目录

第五步:通过第一点中介绍的编译过程重新打包apk

经过上述几个过程,类库项目整合用户开发的项目打包完成。


现将打包过程中遇到的问题汇总如下:

问题1:第五步中生成 新的R.class在转换成dex文件的时候报R.class被多次加载dex

解决:打包类库项目为jar包时没有即时的将生成的R.class文件删除,,将其删除后再打包成jar。

问题2:添加新的应用图标资源到项目中时,导致图片加载混乱

解决:由于R.id 生成在按照文件名 排序生成,传入的文件并不一定是在所有图片资源最后,所以导致加载混乱,后来我将传入的图片名称更改成zzzz开头,保证其是在最后

问题3:AndroidManifest.xml中包名和应用名及图片包的替换

解决: 将文件中的用$package ,$name,$icon 替换项目中的包名,应用名及图标,然后利用ant 脚本的replace去替换文件中资源

问题4:脚本打包后,地图功能无法使用

解决:经查证,eclipse在打包时,会将地图包的资源放在assets目录下,而脚本打包没有做这一块的事情。最终将用eclipse打包出的apk的assets目录下的资源文件在脚本打包的时候自动copy到目录下。


COMMENTS

1 个回应

Normal

18180966887 2016年01月04日 22:54

你好 请问一下用build.properties应用包配置文件生成的APK不能显示应用图标,且安装时提示解析错误?

回复


需要 后方可回复
如果没有账号可以 一个帐号。