使用 maven 构建 android 项目

1,886 阅读2分钟

为什么引入maven构建方式

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

在android里,

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

开始使用maven

引入pom.xml


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

    4.0.0
    com.test
    apkDeplorer
    1.0.0
    apk
    apkDeplorer

    
        
            com.google.android
            android
            4.1.1.4
            provided
        
        
            com.google.android
            support-v4
            r7
        
    

    
        apkDeplorer.keystore
        kison.chen@zaozao
        kison.chen@zaozao
        kison-android-app
        UTF-8
    

    
        ${project.artifactId}-${project.version}-${manifest.metadata.id}
        src/main/java
        
            
                .
                true
                ../filtered-resources
                
                    AndroidManifest.xml
                
            
            
                src/main/resources
                true
                
                    **/*
                
                
                    **/env-*.properties
                
            
        
        
            
                
                    com.jayway.maven.plugins.android.generation2
                    android-maven-plugin
                    3.6.0
                    true
                    
                        
                            run
                            
                                deploy
                                run
                            
                            install
                        
                    
                    
                        proguard-project.txt
                        ${project.build.proguardSkip}
                        ${manifest.debuggable}
                        target/filtered-resources/AndroidManifest.xml
                        
                        ${project.build.release}
                        
                            ${project.build.debug}
                        
                        ${project.build.runDebug}
                        
                            ${project.build.sign.debug}
                        
                        true
                    
                
            
        
        
            
                com.jayway.maven.plugins.android.generation2
                android-maven-plugin
                3.8.0
                
                    
                        15
                    
                
            
            
                org.codehaus.mojo
                keytool-maven-plugin
                1.2
                
                    ${keystore.filename}
                    ${keystore.storepass}
                    ${keystore.keypass}
                    ${keystore.alias}
                    CN=iKoding, OU=iKoding, O=iKoding, C=CN
                    SHA1withDSA
                    10000
                    DSA
                    1024
                
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.6
                    1.6
                    UTF8
                
            
            
                org.apache.maven.plugins
                maven-resources-plugin
                2.6
                
                    
                        initialize
                        
                            resources
                        
                    
                
            
        
    

    
        
            debug
            
                true
            
            
                
                    src/main/resources/env-debug.properties
                
            
            
                true
                false
                true
                false
                true
                true
            
        
        
            release
            
                false
                false
                false
                true
                false
                false
            
            
                
                    src/main/resources/env-release.properties
                
                
                    
                        org.apache.maven.plugins
                        maven-jarsigner-plugin
                        1.2
                        
                            
                                sign
                                
                                    sign
                                
                                package
                                true
                                
                                    
                                        ${project.build.outputDirectory}/*.apk
                                    
                                    ${keystore.filename}
                                    ${keystore.storepass}
                                    ${keystore.keypass}
                                    ${keystore.alias}
                                
                            
                        
                    
                
            
        
        
        
            channel-test
            
                true
            
            
                test
                test
            
        
        
            channel-91
            
                91-market
                91 market
            
        
        
            channel-yingyonghui
            
                yingyonghui-market
                yingyonghui market
            
        
        
            channel-tongbutui
            
                tongbutui-market
                tongbutui market
            
        
        
            channel-tengxun
            
                tengxun-market
                tengxun market
            
        
        
            channel-anzhi
            
                anzhi-market
                anzhi market
            
        
        
            channel-gfan
            
                gfan
                gfan
            
        
    

安装本地依赖包

由于国内的第三方库多未以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


          com.autonavi
           libamapv3
           v3
           armeabi
            runtime
            so
  
  
              com.autonavi
              map
              2.0.0
  
  
               com.autonavi
               ApiLocation
               2.0.0
  
   
               com.autonavi
               ApiSearch
                2.0.0
   

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


            android
            android
            4.4.2_r3
            provided
        

构建中可能出现的问题

  • 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

参考文献