«

使用maven构建android项目

时间:2024-3-2 19:19     作者:韩俊     分类: Android


为什么引入maven构建方式

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

在android里,

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

开始使用maven

引入pom.xml

<?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>

安装本地依赖包

由于国内的第三方库多未以maven形式打包,故我们要手动将jar包安装到本地maven库.(高德地图为例)

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

添加依赖包到pom.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>

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的安卓包.

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

构建中可能出现的问题

maven版本问题 使用过程中可能会出现版本问题,笔者这里用的是maven 3.1.1,com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.2
.9图片问题

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

将.9图片标准化 即可

命令执行

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

参考文献

使用Maven构建Android项目
MAVEN Invalid SDK: Platform/API level 16 not available
.9图片问题
maven中使用高德地图
Maven Android SDK Deployer
maven-android-plugin
apkDeplorer-maven打包android的demo

标签: android

热门推荐