文档章节

使用maven构建android项目

chenbilly
 chenbilly
发布于 2014/04/01 11:45
字数 1259
阅读 18939
收藏 18

更好的阅读效果,请查看原文地址:http://keepcleargas.bitbucket.org/android/2014/04/01/using-maven-to-package-android.html

###为什么引入maven构建方式### 做过java后台开发的人员应该都知道,maven使用解决依赖包管理问题的,同时优化测试,打包,部署等流程的.

在android里,

  • maven可以管理你的依赖包
  • 打包成apklib,管理自己的组件库
  • 动态配置你的发布渠道(此点非常方便)
  • 签名,打包,混淆一条龙服务.

###开始使用maven###

引入pom.xml

<code>

<?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>
<groupId>com.test</groupId>
<artifactId>apkDeplorer</artifactId>
<version>1.0.0</version>
<packaging>apk</packaging>
<name>apkDeplorer</name>

<dependencies>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <version>4.1.1.4</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>support-v4</artifactId>
        <version>r7</version>
    </dependency>
</dependencies>

<properties>
    <keystore.filename>apkDeplorer.keystore</keystore.filename>
    <keystore.storepass>kison.chen@zaozao</keystore.storepass>
    <keystore.keypass>kison.chen@zaozao</keystore.keypass>
    <keystore.alias>kison-android-app</keystore.alias>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <finalName>${project.artifactId}-${project.version}-${manifest.metadata.id}</finalName>
    <sourceDirectory>src/main/java</sourceDirectory>
    <resources>
        <resource>
            <directory>.</directory>
            <filtering>true</filtering>
            <targetPath>../filtered-resources</targetPath>
            <includes>
                <include>AndroidManifest.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*</include>
            </includes>
            <excludes>
                <exclude>**/env-*.properties</exclude>
            </excludes>
        </resource>
    </resources>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.6.0</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <id>run</id>
                        <goals>
                            <goal>deploy</goal>
                            <goal>run</goal>
                        </goals>
                        <phase>install</phase>
                    </execution>
                </executions>
                <configuration>
                    <proguardConfig>proguard-project.txt</proguardConfig>
                    <proguardSkip>${project.build.proguardSkip}</proguardSkip>
                    <manifestDebuggable>${manifest.debuggable}</manifestDebuggable>
                    <androidManifestFile>target/filtered-resources/AndroidManifest.xml
                    </androidManifestFile>
                    <release>${project.build.release}</release>
                    <run>
                        <debug>${project.build.debug}</debug>
                    </run>
                    <runDebug>${project.build.runDebug}</runDebug>
                    <sign>
                        <debug>${project.build.sign.debug}</debug>
                    </sign>
                    <undeployBeforeDeploy>true</undeployBeforeDeploy>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>com.jayway.maven.plugins.android.generation2</groupId>
            <artifactId>android-maven-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <sdk>
                    <platform>15</platform>
                </sdk>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>keytool-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <keystore>${keystore.filename}</keystore>
                <storepass>${keystore.storepass}</storepass>
                <keypass>${keystore.keypass}</keypass>
                <alias>${keystore.alias}</alias>
                <dname>CN=iKoding, OU=iKoding, O=iKoding, C=CN</dname>
                <sigalg>SHA1withDSA</sigalg>
                <validity>10000</validity>
                <keyalg>DSA</keyalg>
                <keysize>1024</keysize>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <encoding>UTF8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>resources</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>debug</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <filters>
                <filter>src/main/resources/env-debug.properties</filter>
            </filters>
        </build>
        <properties>
            <project.build.debug>true</project.build.debug>
            <project.build.runDebug>false</project.build.runDebug>
            <project.build.proguardSkip>true</project.build.proguardSkip>
            <project.build.release>false</project.build.release>
            <project.build.sign.debug>true</project.build.sign.debug>
            <manifest.debuggable>true</manifest.debuggable>
        </properties>
    </profile>
    <profile>
        <id>release</id>
        <properties>
            <project.build.debug>false</project.build.debug>
            <project.build.runDebug>false</project.build.runDebug>
            <project.build.proguardSkip>false</project.build.proguardSkip>
            <project.build.release>true</project.build.release>
            <project.build.sign.debug>false</project.build.sign.debug>
            <manifest.debuggable>false</manifest.debuggable>
        </properties>
        <build>
            <filters>
                <filter>src/main/resources/env-release.properties</filter>
            </filters>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jarsigner-plugin</artifactId>
                    <version>1.2</version>
                    <executions>
                        <execution>
                            <id>sign</id>
                            <goals>
                                <goal>sign</goal>
                            </goals>
                            <phase>package</phase>
                            <inherited>true</inherited>
                            <configuration>
                                <includes>
                                    <include>${project.build.outputDirectory}/*.apk</include>
                                </includes>
                                <keystore>${keystore.filename}</keystore>
                                <storepass>${keystore.storepass}</storepass>
                                <keypass>${keystore.keypass}</keypass>
                                <alias>${keystore.alias}</alias>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <!-- 渠道profiles -->
    <profile>
        <id>channel-test</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <manifest.metadata.id>test</manifest.metadata.id>
            <manifest.metadata.channel>test</manifest.metadata.channel>
        </properties>
    </profile>
    <profile>
        <id>channel-91</id>
        <properties>
            <manifest.metadata.id>91-market</manifest.metadata.id>
            <manifest.metadata.channel>91 market</manifest.metadata.channel>
        </properties>
    </profile>
    <profile>
        <id>channel-yingyonghui</id>
        <properties>
            <manifest.metadata.id>yingyonghui-market</manifest.metadata.id>
            <manifest.metadata.channel>yingyonghui market</manifest.metadata.channel>
        </properties>
    </profile>
    <profile>
        <id>channel-tongbutui</id>
        <properties>
            <manifest.metadata.id>tongbutui-market</manifest.metadata.id>
            <manifest.metadata.channel>tongbutui market</manifest.metadata.channel>
        </properties>
    </profile>
    <profile>
        <id>channel-tengxun</id>
        <properties>
            <manifest.metadata.id>tengxun-market</manifest.metadata.id>
            <manifest.metadata.channel>tengxun market</manifest.metadata.channel>
        </properties>
    </profile>
    <profile>
        <id>channel-anzhi</id>
        <properties>
            <manifest.metadata.id>anzhi-market</manifest.metadata.id>
            <manifest.metadata.channel>anzhi market</manifest.metadata.channel>
        </properties>
    </profile>
    <profile>
        <id>channel-gfan</id>
        <properties>
            <manifest.metadata.id>gfan</manifest.metadata.id>
            <manifest.metadata.channel>gfan</manifest.metadata.channel>
        </properties>
    </profile>
</profiles>

</project> </code>

###安装本地依赖包###

由于国内的第三方库多未以maven形式打包,故我们要手动将jar包安装到本地maven库.(高德地图为例) {% highlight xml %} mvn install:install-file -DgroupId=com.autonavi -DartifactId=libamapv3 -Dversion=v3 -Dfile=/Users/keepcleargas/Downloads/AMapSDKV2Demo/libs/armeabi/libamapv3.so -Dpackaging=so -DgeneratePom=true -Dclassifier=armeabi

mvn install:install-file -DgroupId=com.autonavi -DartifactId=location -Dversion=2.0.0 -Dfile=/Users/keepcleargas/Downloads/AMapSDKV2Demo/libs/MapApiLocation.jar -Dpackaging=jar -DgeneratePom=true

{% endhighlight %} 添加依赖包到pom.xml {% highlight xml %} <dependency> <groupId>com.autonavi</groupId> <artifactId>libamapv3</artifactId> <version>v3</version> <classifier>armeabi</classifier> <scope>runtime</scope> <type>so</type> </dependency> <dependency> <groupId>com.autonavi</groupId> <artifactId>map</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.autonavi</groupId> <artifactId>ApiLocation</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.autonavi</groupId> <artifactId>ApiSearch</artifactId> <version>2.0.0</version> </dependency> {% endhighlight %}

###android的maven版本构建###

由于在maven central中 android版本只有4.1.1.4

我们需要一个工具来安装新版的android sdk. Maven Android SDK Deployer.

根据Maven Android SDK Deployer的wiki 文案,mvn install -P 4.4 在pom.xml导入 4.4.2的安卓包.

{% highlight xml %}

    <dependency>
        <groupId>android</groupId>
        <artifactId>android</artifactId>
        <version>4.4.2_r3</version>
        <scope>provided</scope>
    </dependency>

{% endhighlight %}

###构建中可能出现的问题###

  • maven版本问题 使用过程中可能会出现版本问题,笔者这里用的是maven 3.1.1,com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.2
  • .9图片问题 {% highlight xml %} ERROR: 9-patch image Project/res/drawable- hdpi/input_03_mid.9.png malformed. [INFO] Must have one-pixel frame that is either transparent or white. [INFO] ERROR: Failure processing PNG image Project/res/drawable-hdpi/input_03_mid.9.png {% endhighlight %}

将.9图片标准化 即可

###命令执行 ###

{% highlight xml %} mvn clean package

打包,但不部署。 mvn clean install

打包,部署并运行。 mvn clean package android:redeploy android:run

这个命令通常用于手机上已经安装了要部署的应用,但签名不同,所以我们打包的同时使用redeploy命令将现有应用删除并重新部署,最后使用run命令运行应用。 mvn android:redeploy android:run

不打包,将已生成的包重新部署并运行。 mvn android:deploy android:run

部署并运行已生成的包,与redeploy不同的是,deploy不会删除已有部署和应用数据。

mvn clean install -Prelease,channel-91

打包签名,的渠道为channel-91的apk {% endhighlight %}

###参考文献###

© 著作权归作者所有

chenbilly
粉丝 16
博文 9
码字总数 7714
作品 0
杭州
程序员
私信 提问
Android开发、测试持续集成环境Jenkins搭建

传统java项目开发都会利用maven、ant在hudson、jenkins中持续集成,开发、测试、每日构建,保证代码质量。maven默认不支持android,但是我们可以利用maven-android-plugin插件来让maven支持a...

youthflies
2013/09/28
6.9K
3
为 JAX-RS web 服务开发 Spring Android 客户端

具象状态传输 (Representational State Transfer,REST)软件体系结构基于资源表示的传输。RESTful web 服务是一种基于 REST 和 HTTP 协议的 web 服务,并被作为一个 URI 路径可用。此 web ...

IBMdW
2011/09/28
3.1K
1
Android studio gradle配置

Gradle 基本概念 首先我们学习几个gradle 的脚本语法,掌握了这几个语法,你就能非常简单的用gradle构建打包android项目了。 首先,我们来看下一个最简单android 。 build.gradle //设置脚本...

习惯_搬砖
2014/11/07
56.9K
1
越写悦快乐之重拾Android开发之构建工具

今天的越写悦快乐系列文章为大家带来Android开发必备的构建工具Gradle的基本使用和简要说明。犹记得2015年刚上手Android开发的时候还使用的是Maven来构建Android应用程序,使用的开发环境还是...

韬声依旧在路上
03/21
0
0
码云 Android apk 在线构建功能上线啦

duang duang duang …… 各位看官,开源中国码云 Android 项目构建新功能上线啦!! 码云支持的项目中, ant/maven/gradle的配置文件支持脚本。而每个人写出的构建脚本千变万化,因此码云对支...

局长
2016/08/29
11.4K
53

没有更多内容

加载失败,请刷新页面

加载更多

JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
20分钟前
42
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
30分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
32分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
38分钟前
4
0
Apache Kudu 不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink 进行扩展。 使用的Apache Kudu 的Java 客户端。突然有天发现作业无法提交,一直报错。 后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验...

吐槽的达达仔
48分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部