`
scliu0718
  • 浏览: 52334 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Android之Maven集成Ant多渠道打包

 
阅读更多

在网上找了这方面的东西,貌似比较少,对maven也不是太了解,所以就想了个比较笨的办法,即用ant执行mvn命令来执行pom.xml文件,

maven只负责做打包和签名,其它的多渠道操作都是ant中处理。


ant.xml部分做循环的操作:

1. 文件替换

2. pom.xml中<appName>标签的修改

3. 执行mvn命令,打apk包及签名

Ant核心代码:

<?xml version="1.0" encoding="utf-8"?>
<project name="test" basedir="." default="run" xmlns:artifact="urn:maven-artifact-ant">
	<!-- ant build的引用 -->
	<property file="project.properties" />
	<property file="ant.properties" />
	<property file="build.properties" />

	<!-- SDK目录(获取操作系统环境变量env.ANDROID_SDK_HOME的值) -->
	<property name="sdk-folder" value="D:/Program Files/android-sdk-windows" />

	<property name="antcontrib_jar_path" value="C:/Users/Win7/Desktop/MavenAPK/ant-contrib-1.0b3.jar" />
	<property name="appName" value="AppName" />

	<property name="assetKey" value="${ant.contrib.asset.key}" />
	<property name="nowpath" value="${assetKey}" />
	<!-- 渠道名:渠道号 -->
	<property name="assetPathKey" value="${nowpath}" />

	<property name="classPath" value="a.b.ControlAnt" />
	<property name="javacPath" value="a/b/ControlAnt.java" />

	<property name="mavenPath" value="${M2_HOME}/bin" />

	<!-- 使用第三方的ant包,使ant支持for循环-->
	<taskdef resource="net/sf/antcontrib/antcontrib.properties">
		<classpath>
			<pathelement location="${antcontrib_jar_path}" />
		</classpath>
	</taskdef>

	<!-- SDK指定平台目录 -->
	<property name="sdk-platform-folder" value="${sdk-folder}/platforms/android-4" />
	<!-- SDK中tools目录 -->
	<property name="sdk-tools" value="${sdk-folder}/tools" />
	<!-- SDK指定平台中tools目录 -->
	<property name="sdk-platform-tools" value="${sdk-platform-folder}/tools" />

	<!-- 编译需要的jar; 如果项目使用到地图服务则需要maps.jar -->
	<property name="android-jar" value="${sdk-platform-folder}/android.jar" />

	<!-- 编译后的文件放置目录 -->
	<property name="outdir-target" value="target" />
	<!-- 清单文件 -->
	<property name="manifest-xml" value="AndroidManifest.xml" />
	<!-- 源文件目录 -->
	<property name="resource-dir" value="res" />
	<property name="asset-dir" value="assets" />
	<!-- java源文件目录 -->
	<property name="srcdir" value="src" />
	<property name="srcdir-ospath" value="${basedir}/${srcdir}" />
	<!-- 外部类库所在目录 -->
	<property name="external-lib" value="libs" />
	<property name="external-lib-ospath" value="${basedir}/${external-lib}" />

	<!-- 生成class目录 -->
	<property name="outdir-classes-ospath" value="${basedir}/${outdir-target}" />

	<!-- 替换文件key : value -->
	<property name="assetchannelname" value="" />
	<property name="assetchannelvalue" value="" />

	<!-- 循环修改路徑名 -->
	<target name="run">
		<foreach target="update_replace_path" list="${assetKey}" param="assetchannel" delimiter=",">
		</foreach>
	</target>


	<!-- 修改nowpath,并根据nowpath替换文件、打包 -->
	<target name="update_replace_path">
		<echo>
			  master.xml I passed PARAMETER passed-info with value ---------${assetchannel}
		</echo>
		<replaceregexp flags="nowpath" byline="false" encoding="UTF-8">
			<regexp pattern='nowpath=(.*)' />
			<substitution expression='nowpath=${assetchannel}' />
			<fileset dir="${basedir}" includes="ant.properties" />
		</replaceregexp>

		<mkdir dir="${outdir-classes-ospath}/classes" />

		<!-- 此java类就做了一件事,通过循环的值assetchannel(path名称)读取到对应的值赋给nowpath -->
		<javac srcdir="src" includes="${javacPath}" destdir="${outdir-classes-ospath}" classpath="${outdir-classes-ospath}">
		</javac>

		<java classname="${classPath}">
			<arg value="${assetchannel}" />
			<classpath>
				<pathelement path="./bin/classes" />
			</classpath>
		</java>

		<antcall target="maven-apk">
		</antcall>
	</target>


	<!--根据path值循环替换文件 -->
	<target name="deploy">
		<echo level="info">Modify the asset files...</echo>
		<foreach target="modify_content_by_path" list="${assetPathKey}" param="assetpathchannel" delimiter=",">
		</foreach>

		<!-- 清理 -->
		<delete includeemptydirs="true" verbose="true">
			<fileset dir="${outdir-classes-ospath}" excludes="*.apk,classes">
			</fileset>
		</delete>
	</target>

	<!-- 替换需修改的文件并修改AppName -->
	<target name="modify_content_by_path">
		<!-- 获取渠道名字 -->
		<propertyregex override="true" property="assetchannelname" input="${assetpathchannel}" regexp="(.*)::" select="\1" />
		<!-- 获取渠道号码 -->
		<propertyregex override="true" property="assetchannelvalue" input="${assetpathchannel}" regexp="::(.*)" select="\1" />

		<echo level="info">Replace ----- ${assetchannelname}......${assetchannelvalue}.........</echo>

		<if>
			<equals arg1="${appName}" arg2="${assetchannelname}" />
			<then>
				<!-- 修改pom文件的appName标签,确定打包后的apk名称 -->
				<replaceregexp flags="g" byline="false" encoding="UTF-8">
					<regexp pattern='\x3CappName\x3E(.*)\x3C/appName\x3E' />
					<substitution expression="<appName>${assetchannelvalue}</appName>" />
					<fileset dir="${basedir}" includes="pom.xml" />
				</replaceregexp>
			</then>
			<else>
				<!-- 开始替换文件 -->
				<available property="file.exist" file="${assetchannelname}" />
				<if>
					<isset property="file.exist" />
					<then>
						<filter filtersfile="${assetchannelname}" />
						<copy file="${assetchannelname}" overwrite="true" preservelastmodified="true" todir="./${assetchannelvalue}" verbose="true">
						</copy>
					</then>
					<else>
						<echo level="error">Error: "${assetchannelname}" 文件不存在</echo>
					</else>
				</if>
			</else>
		</if>
	</target>

	<target name="maven-apk" depends="deploy">
		<!-- 通过 执行maven命令来打apk包,前提是先配置maven到环境变量  -->
		<exec command="mvn.bat">
			<arg value="-f" />
			<arg value="${basedir}/pom.xml" />
			<arg value="compile" />
			<arg value="package" />
		</exec>

		<echo level="verbose">--------BUILD SUCCESSFULL---------</echo>
	</target>

</project>


配置信息:

ant.properies: ----> 属性配置信息,由于在maven中的setting.xml配置了keystore信息,所以此配置可略掉

build.properies: ----> 需替换的文件配置信息,可把ant.properties整合

ant.properies:

key.store=LS.keystore
key.alias=LS
key.store.password=xxxxxxx
key.alias.password=xxxxxxx
jdk.version=1.6


build.properties:

#Update nowpath value
#Mon Apr 08 13:29:02 CST 2013
ant.contrib.asset.key=path,path1,path2
path2=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt2
path=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt
path1=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt1
nowpath=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt2



AntControl.java根据path/path1/path2修改nowpath的值,如果没有此需求可以省略这一步。(在ant中循环ant.contrib.asset.key的值path为${assetchanel},

以${assetchanel}为key取出"E:\......"的时候取的值总为key的值,path本来就是value,应该有办法的,有人知道的话告诉我一下,所以又定义 了一个nowpath

而且还是在java中去修改,这样比较麻烦)。

AntControl.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
//This class is a util class , in order to pack apk file. 
public class ControlAnt {

	public static void main(String[] args) {
		try {
			InputStream in = new FileInputStream("build.properties");
			Properties properties = new Properties();

			properties.load(in);

			//路径名
			String str = (String) properties.get(args[0]);
			String property = properties.getProperty(str, str);
			//通过路径名拿到路径value,然后赋给nowpath
			properties.setProperty("nowpath", property);

			FileOutputStream fos = new FileOutputStream("build.properties");
			properties.store(fos, "Update" + " nowpath " + "value");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


以下是maven模块的配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<artifactId>MavenAnt</artifactId>
	<groupId>a.b</groupId>
	<version>2.1.2</version>
	<packaging>apk</packaging>
	<name>MavenAnt</name>

	<properties>
	    <!-- ant中修改此标签,决定打包后apk名称,达到多渠道打包目的 -->
		<appName>MavenAnt</appName>
	</properties>

	<dependencies>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>android</artifactId>
			<version>2.1.2</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>${appName}</finalName>

		<plugins>
			<plugin>
				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
				<artifactId>android-maven-plugin</artifactId>
				<version>3.0.0-alpha-14</version>
				<configuration>
					<encoding>UTF-8</encoding>
					<androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
					<assetsDirectory>${project.basedir}/assets</assetsDirectory>
					<resourceDirectory>${project.basedir}/res</resourceDirectory>
					<nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
					<sdk>
						<path>${env.ANDROID_HOME}</path>
						<platform>8</platform>
					</sdk>
					<deleteConflictingFiles>true</deleteConflictingFiles>
					<undeployBeforeDeploy>true</undeployBeforeDeploy>
				</configuration>
				<extensions>true</extensions>
			</plugin>

			<!-- 精减打包 -->
			<!--plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> 
				<version>1.2.1</version> <executions> <execution> <id>zipalign</id> <goals> 
				<goal>exec</goal> </goals> <phase>install</phase> <configuration> <executable>${ANDROID_HOME}/tools/zipalign</executable> 
				<arguments> <argument>-f</argument> <argument>4</argument> <argument>target/${appName}.apk</argument> 
				<argument>target/${appName}-sign.apk</argument> </arguments> <tasks> </tasks> 
				</configuration> </execution> <execution> </execution> </executions> </plugin -->

			<!-- 签名 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jarsigner-plugin</artifactId>
				<version>1.2</version>
				<executions>
					<execution>
						<id>signing</id>
						<goals>
							<goal>sign</goal>
						</goals>
						<phase>package</phase>
						<inherited>true</inherited>
						<configuration>
							<archiveDirectory></archiveDirectory>
							<encoding>UTF-8</encoding>
							<includes>
								<argument>target/${appName}.apk</argument>
							</includes>
							<removeExistingSignatures>true</removeExistingSignatures>
							<keystore>${keyFilePath}</keystore>
							<storepass>${storePassword}</storepass>
							<keypass>${keyPassword}</keypass>
							<alias>${keyAlias}</alias>
							<deleteConflictingFiles>true</deleteConflictingFiles>
						</configuration>
					</execution>
				</executions>
			</plugin>

		</plugins>
	</build>
</project>

在setting.xml中的profiles中添加:

<!-- 打包新增 -->
	<profile>
		<id>sign</id>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
		<properties>
			<keyFilePath>C:\Users\Win7\Desktop\Task\LS.keystore</keyFilePath>
			<storePassword>xxxxxxx</storePassword>
			<keyPassword>xxxxxxx</keyPassword>
			<keyAlias>LS</keyAlias>
		</properties>
	</profile>



分享到:
评论

相关推荐

    maven-ant-tasks-2.1.3.zip

    《Maven Ant Tasks 2.1.3:构建与集成利器》 在软件开发领域,Maven 和 Ant 是两种广泛使用的构建工具。Maven 以其强大的依赖管理和项目生命周期管理功能著称,而 Ant 则以其灵活性和可定制性受到开发者青睐。然而...

    maven-ant-tasks.jar

    还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 maven-ant-tasks.jar

    Maven 与 Ant 之比较

    标题“Maven 与 Ant 之比较”表明了本文将探讨两种在Java开发中广泛使用的构建工具——Maven和Ant。它们的主要功能是管理和自动化项目的构建过程,包括编译源代码、运行测试、打包应用以及部署。通过对两者进行对比...

    android maven

    Android Maven 插件是将Android项目与Maven构建系统集成的一种工具。在传统的Android开发中,我们通常使用Gradle作为构建系统,但Maven在Java领域有着广泛的应用,因此对于那些习惯于Maven或者需要利用Maven生态的...

    android-maven-gradle-plugin,与android库项目兼容的gradle的maven插件.zip

    Android Maven Gradle 插件,作为Android库项目与Maven集成的重要桥梁,是开发者进行高效、灵活的项目管理和依赖管理的关键。本文将深入探讨这一插件的原理、使用方法及其在当前Android构建系统中的角色。 首先,...

    Maven2.Ant.Junit合集

    Maven2的构建过程分为多个阶段,如编译(compile)、测试(test)、打包(package)、验证(verify)、集成测试(integration-test)、部署(deploy)等。开发者可以根据需求选择执行其中的部分或全部阶段。Maven的...

    通向架构师的道路(第二十三天)maven与ant的奇妙整合.docx

    Maven 与 Ant 的奇妙整合 Maven 和 Ant 是两种常见的自动化构建工具,它们都有其独特的优点和缺点。在本文中,我们将探讨如何将 Maven 和 Ant 整合,以充分发挥两者的优势。 一、Maven 介绍 Maven 是一款基于项目...

    AndroidStrudio gradle 多渠道打包 外部依赖

    本主题将深入探讨如何使用Android Studio和Gradle进行多渠道打包以及处理外部库依赖。 **一、多渠道打包** 多渠道打包是Android应用发布时的一个常见需求,它允许我们为不同的市场或推广渠道创建定制的应用版本。...

    maven-ant-tasks-2.1.3-src

    The Mavent Ant Tasks allow several of Maven's artifact handling features to be used from within an Ant build. These include: Dependency management - including transitive dependencies, scope ...

    maven打包 maven打jar包详细步骤

    本文将详细讲解如何使用Maven来打包一个Java项目,并创建JAR文件。 首先,Maven有三个主要生命周期阶段:`clean`、`default`(也称为`compile`)和`install`。每个阶段包含一系列的阶段(或者称为目标,如`compile`...

    Android-maven配置multidex打包

    工程大了以后,不可避免就会出现方法数目超出65536的限制,很幸运的是新的android提供了多dex打包的方式可以解决这个问题。本资源就是演示如何用android-maven-plugin打多dex包。

    Gradle maven工件发布与maven、maven发布、android maven Gradle插件的演练

    【maven】说明:Gradle maven工件发布与maven、maven发布、android maven Gradle插件的演练。该项目包含..., (Gradle maven artifacts publishing walkaround with maven , maven-publish , android-maven gradle ...

    maven-ant-tasks:Apache Maven ant任务的镜像

    这使得开发者能够在Ant构建脚本中使用Maven的特性,如自动下载项目依赖、执行生命周期阶段(如编译、测试、打包、部署)等。 以下是一些使用maven-ant-tasks的关键知识点: 1. **安装与引入**:首先,你需要在Ant...

    maven ant thrift0.9.0

    标题 "maven ant thrift0.9.0" 涉及到的是三个关键的软件开发工具:Thrift 0.9.0、Apache Ant 和 Apache Maven。这些工具在Java和其他编程语言的开发环境中广泛使用,特别是在构建和部署分布式系统时。 Thrift ...

    android-maven-publish:对标准Maven Publish插件的修改,使其与android-library项目兼容(aar)

    4. **多渠道发布**:`android-maven-publish`允许你将库发布到多个Maven仓库,包括本地Maven仓库、JFrog Artifactory、Sonatype Nexus等。 5. **Groovy DSL支持**:插件使用Groovy DSL编写构建脚本,使得配置更加...

    maven+bat打包

    "maven+bat打包"是指使用Apache Maven,一个流行的Java项目管理工具,结合批处理脚本(BAT)来自动化项目的打包过程。这种方式可以极大地提高开发效率,确保每次构建的一致性和可重复性。下面将详细介绍这个过程及其...

    maven 过滤文件夹打包

    "maven 过滤文件夹打包"这个主题涉及到的是如何利用Maven的资源过滤功能来实现针对不同运行环境的配置文件打包。下面将详细解释这一过程。 在开发环境中,我们通常会有多种配置文件,比如`application-dev....

    maven下通用的ant配置文件

    maven下通用的ant配置文件,只要0积分。只需修改11行末尾的target/自己的工程名即可。

    maven多环境配置打包

    【标题】:“maven多环境配置打包” 在Java开发中,常常需要针对不同的运行环境(如开发、测试、生产)进行不同的配置。Maven作为Java项目管理的重要工具,提供了强大的多环境配置打包功能,帮助开发者有效地管理和...

    Maven打包,指定classes路径

    以上就是关于"Maven打包,指定classes路径"的知识点,主要涉及到Maven的资源配置和插件定制。理解并掌握这些配置可以帮助开发者更高效地管理和构建Java Web应用。同时,记得在实际项目中根据实际情况调整`pom.xml`,...

Global site tag (gtag.js) - Google Analytics