在开始自动化打包具体实践之前,先把Maven的知识点重拾一下。
经验:由于是约定大于自由,所以必要将这些约定烂熟于心,否则很容易遗忘,对知识点的模糊。
下面两篇文章对于Maven的基本认识有一个概要的了解。
Maven入门上
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html
Maven入门下
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-2-405568-zhs.html
对于Maven你必须要了解的几个概念:
骨架(插件),生命周期,目标(任务),依赖,插件。
由于约定大于自由,一般情况下我们是不需要重新构建工程的。但是有时候也会需要,例如生成war,apk等,这时候我们需要重新build。为此我们需要了解build构建的各项配置。
为此我们首先需要先了解如何通过maven构建android项目。然而需求并没那么简单,例如签名,混淆,渠道打包等等。这里真的要吐槽下,网上的资料真心不多。为数不多的实例却让人似懂非懂。知识点的设计都非常模糊,尤其是对于maven本来就不熟悉的我而言,理解起来相当费劲。所以我希望通过现象看本质,将哪些阻碍我理解配置的知识点逐个击破。
属性过滤:
1. Maven是如何在命令执行的过程中将除pom.xml之外的其他配置文件例如(xxx.xml)中${}进行替换。小白就是小白
术语其实是-属性过滤,在使用maven中,这是一个不错的技巧。
2. maven定义变量可以通过在pom定义property属性的key/value,如何使用自定义的properties文件作为来源进行属性过滤?
这个也非常容易实现,在build配置filters的来源便可。
AndoridManversionCode属性过滤问题:
使用Maven对AndroidManifest.xml的versionCode通过属性过滤进行设置时始终无法编译成功,最终通过android-maven-plugin插件的目标manifest-update对原始AndroidManifest.xml的versionCode和versionName进行变更。
疑问:为啥网上的例子需要在target生成AndroidManifest.xml文件。以及他更改versionCode和versionName的方式也跟笔者所述的不同。
[参考](https://gist.github.com/trajano/5941038 )
通过android-maven-plugin来更新原始AndroidManifest.xml的verisonCode和versionName是有局限的。为什么这么说?
当我们需要进行多渠道打包的时候,即需要更改AndroidManifest.xml下的channel时,如下:
利用android-maven-plugin是无法做到的。这时候借助maven-resources-plugin插件就非常方便的解决了。
接下来就是要解决批量打包的问题了:
解决批量打包的关键问题是如何循环执行打包命令?
答案是:bash
下面这段便是批量打包的脚本,那么我们如何去理解他呢?
#!/bin/bash
package(){
mvn clean
while read line
do
mvn -Dchannel=$line package
done < $1
}
package $1
执行批量脚本:
./package channels.txt
(注:$1:channels.txt)
[demo](https://git.oschina.net/techbirds/android_maven_batch_package.git)
参考:
[android + maven](https://github.com/yuanxd/android )
[maven之filter和profile](http://archboy.org/2012/05/21/apache-maven-profile-filtering-multiple-build-environments/ )
[美团Android自动化之旅-生成渠道包] (http://tech.meituan.com/mt-apk-packaging.html )
[Android APK 反编译详解](http://blog.csdn.net/ithomer/article/details/6727581 )
[pom配置详情](http://blog.csdn.net/ithomer/article/details/9332071 )