文档章节

使用maven构建android项目

chenbilly
 chenbilly
发布于 2014/04/01 11:45
字数 1259
阅读 18834
收藏 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
粉丝 17
博文 9
码字总数 7714
作品 0
杭州
程序员
私信 提问
Android开发、测试持续集成环境Jenkins搭建

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

youthflies
2013/09/28
0
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-maven-plugin使用

0:前言:android-maven-plugin (原名maven-android-plugin) 首要参考文档: (1)https://code.google.com/p/maven-android-plugin/wiki/GettingStarted 引子: 我想用$sudo apt-get insta......

李海珍
2012/11/30
0
0
Android studio gradle配置

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

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

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

韬声依旧在路上
03/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AWS自动部署工具codedeploy的部署概述

1)在AWS lambda平台上部署: 三大部分:要部署的内容 --> 部署的配置 --> 更新的lambda函数版本 部署的流程:上传修订的应用程序-->创建一个应用程序-->指定部署组-->指定部署的配置-->指定...

守护-创造
27分钟前
2
0
好程序员教程分享Javascript设计模式

好程序员教程分享Javascript设计模式 方法一 对象字面量表示法   在对象字面量表示法中,一个对象被描述为一组包含在大括号中,以逗号分隔的 name/value 对。对象内的名称可以是字符串或标...

好程序员IT
33分钟前
2
0
fail-fast和fail-safe的介绍和区别

fail-fast和fail-safe 前言 前段时间公司招的实习生在使用迭代器遍历的时候,对集合内容进行了修改,从而抛出ConcurrentModificationException. 然后给他讲解之余也整理了这一篇文章. fail-fa...

群星纪元
35分钟前
3
0
控制反转 IOC

控制反转(Inversion of Control,缩写为IoC)面向对象设计原则,降低代码耦合度 依赖注入(Dependency Injection,简称DI) 依赖查找(Dependency Lookup):容器提供回调接口和上下文条件给...

SibylY
46分钟前
2
0
网络介绍:Kubernetes设计文档

模型和动机 Kubernetes从Docker默认的网络模型中独立出来形成一套自己的网络模型。该网络模型的目标是:每一个pod都拥有一个扁平化共享网络命名空间的IP,通过该IP,pod就能够跨网络与其它物...

xiangyunyan
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部