IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    android+maven问题记录

    蔡晓建 (mc02cxj@gmail.com)发表于 2014-02-19 00:00:00
    love 0

    参考材料

    • https://code.google.com/p/maven-android-plugin/wiki/GettingStarted
    • http://books.sonatype.com/mvnref-book/reference/android-dev.html
    • http://www.ikoding.com/build-android-project-with-maven/
    • https://github.com/mosabua/maven-android-sdk-deployer
    • http://rgladwell.github.io/m2e-android/
    • http://wiki.eclipse.org/M2E_plugin_execution_not_covered

    前提条件

    • JDK 1.6+
    • Android SDK r21.1+
    • Maven 3.1.1+
    • Set environment variable ANDROID_HOME to the path of your installed Android SDK and add $ANDROID_HOME/tools as well as $ANDROID_HOME/platform-tools to your $PATH. (or on Windows %ANDROID_HOME%\tools and %ANDROID_HOME%\platform-tools)

    特别注意maven的版本号

    maven配置

    请设置环境变量M2_HOME,并把settings.xml放到M2_HOME/conf中去。

    eclipse配置

    对于eclipse来说,除了要maven插件,还需要m2e-android插件。

    dependency中support-v4的版本号只有很旧r7

    其实除了support-v4,像android也有类似的问题。有一种解决方案是采用maven-android-sdk-deployer。 我测试过之后,发现这个解决方案虽然可行,但实际上比较麻烦。我直接在公司内的代理仓库上安装了新版本的。

    Plugin execution not covered by lifecycle configuration

    pom.xml很可能出现下面的错误提示:

    1
    2
    3
    
    Plugin execution not covered by lifecycle configuration:
     com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.2:consume-aar
     (execution: default-consume-aar, phase: compile)
    

    虽然不影响编译,但是很怪,可以通过下面的配置进行排除:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    
      
          
              org.eclipse.m2e
              lifecycle-mapping
              1.0.0
              
                  
                      
                          
                              
                                  com.jayway.maven.plugins.android.generation2
                                  android-maven-plugin
                                  3.8.2
                                  
                                      manifest-update
                                      generate-sources
                                      proguard
                                      consume-aar
                                  
                              
                              
                                   />
                              
                          
                      
                  
              
          
      
    
    

    可以参考M2E_plugin_execution_not_covered

    OutOfMemory或创建不了虚拟机

    有时候会出现内存溢出或创建不了虚拟机的错误。考虑设置内存大小

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    
      com.jayway.maven.plugins.android.generation2
      android-maven-plugin
      
          
              
                  -Xms256m
                  -Xmx512m
              
          
      
    
    

    出现maven打包太慢的情况

    经过测量,在dex成classes.dex的阶段比较慢,dx工具有提供一些参数进行优化.

    • incremental 增量打包,开发阶段可以开启,可以比较明显的缩短打包时间
    • optimize 是否优化classes.dex,开发阶段可以关闭
    1
    2
    3
    4
    
    
      true
      false
    
    

    libpng error: Not a PNG file

    如果直接把jpg格式换个名字,变成png,编译会报下面的错误,导致后面编译的.9图片也出问题(混淆问题的原因)

    1
    2
    
    [INFO] libpng error: Not a PNG file
    [INFO] ERROR: Failure processing PNG image E:\projects\G3ESOP\ESOP-Hubei2\res\drawable-xhdpi\more_about_pic1.png
    

    ‘build.plugins.plugin.version’ is missing

    1
    2
    3
    
    [WARN] 'build.plugins.plugin.version' is missing fororg.apache.maven.plugins:maven.compiler.plugin
    It is highly recommended to fix these problems because they threaten the stability of your build.
    For this reason, future Maven versions might no longer support building such malformed projects.
    

    很简单,给maven.compiler.plugin这个插件添加version属性。 其实所有引用的插件都应该指定版本,不然都会有类似的提示。

    关于编码

    对于源码的编码格式和编译版本,应该进行指定:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    
      org.apache.maven.plugins
      maven-compiler-plugin
      3.1
      
          1.6
          1.6
          UTF8
      
    
    

    对于资源处理的话,可能出现下面的提示:

    1
    
    [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
    

    这个应该设置成UTF-8,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    
          
              org.apache.maven.plugins
              maven-resources-plugin
              2.6
              
                  UTF-8
              
          
    

    maven-jarsigner-plugin对带特殊字符的口令的处理

    这个弄了好久,最后发现得把密码用引用引起来。切记切记。

    后来,发现在linux这样又不能支持。所以只能用profile解决。

    部分代码在jdk7中编译后dex出错

    参考jdk7编译的bug记录,暂时只用jdk6编译

    jdk6不支持android-19的proguard

    原因是android-19的API实现了一些jdk7的特性,在proguard会找不到这些api。 由于和上一个问题有些冲突,暂时不考虑proguard。后续考虑考虑上jdk7。

    如何添加.so支持

    例如下面的百度地图SDK,需要加入一个so文件,在百度SDK里边是这样调用的:

    1
    
    System.loadLibrary("BaiduMapSDK_v2_3_1");
    

    如果要用maven集成的话,可以用下面的配置(已经部署到代理仓库):

    1
    2
    3
    4
    5
    6
    7
    8
    
    
      com.baidu
      libBaiduMapSDK_v2_3_1
      2.3.1
      armeabi
      runtime
      so
    
    

    如何转换成eclipse项目

    项目目录中只有pom.xml,如果要导入eclipse的话,可以考虑使用下面的命令生成.project和.classpath文件

    1
    
    mvn eclipse:eclipse
    

    生成之后可能会有M2_REPO变量找不到的问题,可以在eclipse中通过window>Preferences>Maven>Installations>Add进行添加maven安装位置。

    否则的话,可以按以下方法添加M2_REPO: Window > Preferences > Java > Build Path > Classpath Variables 新增一个M2_REPO变量指向你maven本地仓库。

    常用命令

    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不会删除已有部署和应用数据



沪ICP备19023445号-2号
友情链接