Android-maven配置multidex打包

来源:互联网 发布:免费可视化数据软件 编辑:程序博客网 时间:2024/06/10 21:41

转自:http://blog.csdn.net/goldenfish1919/article/details/42006649


工程大了以后,不可避免就会出现方法数目超出65536的限制,很幸运的是新的android提供了多dex打包的方式可以解决这个问题。下面我们就来看下如何用android-maven-plugin打多dex包。

先看下工程结构:


并不是一个标准的maven工程,但是可以通过更改配置来完成打包。工程的代码非常简单,MainActivity有一个按钮,点击按钮跳转到SecondActivity,SecondActivity中引用了fastjson做了一个对象转string的操作,然后弹出toast提示。还有就是DemoMultiDexApplication继承了MultiDexApplication。假如你的Application已经继承了别的类,那么也可以重写attachBaseContext()来实现。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class DemoMultiDexApplication extends MultiDexApplication {  
  2.     /*如果已经继承了别的类,可以重写下面的方法 
  3.     @Override 
  4.     protected void attachBaseContext(Context base) { 
  5.         super.attachBaseContext(base); 
  6.         MultiDex.install(this); 
  7.     } 
  8.     */  
  9. }  
重点看一下pom:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <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">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>com.example.test</groupId>  
  5.     <artifactId>multidexdemo</artifactId>  
  6.     <version>1.0.0</version>  
  7.     <packaging>apk</packaging>  
  8.     <name>multidexdemo</name>  
  9.     <properties>  
  10.         <sign.keystore>${project.basedir}/debug.keystore</sign.keystore>  
  11.         <sign.alias>androiddebugkey</sign.alias>  
  12.         <sign.storepass>android</sign.storepass>  
  13.     </properties>  
  14.     <dependencies>  
  15.         <dependency>  
  16.             <groupId>com.google.android</groupId>  
  17.             <artifactId>android</artifactId>  
  18.             <version>4.3.0</version>  
  19.             <scope>provided</scope>  
  20.         </dependency>  
  21.         <dependency>  
  22.             <groupId>com.alibaba</groupId>  
  23.             <artifactId>fastjson</artifactId>  
  24.             <version>1.1.45</version>  
  25.         </dependency>  
  26.         <dependency>  
  27.           <groupId>com.android.support</groupId>  
  28.           <artifactId>multidex</artifactId>  
  29.           <version>20</version>  
  30.         </dependency>  
  31.     </dependencies>  
  32.     <repositories>  
  33.         <repository>  
  34.             <id>tbmirror-snapshots</id>  
  35.             <name>taobao mirror snapshots</name>  
  36.             <url>http://mvnrepo.taobao.ali.com/mvn/snapshots</url>  
  37.             <layout>default</layout>  
  38.         </repository>  
  39.         <repository>  
  40.             <id>central</id>  
  41.             <url>http://mvnrepo.taobao.ali.com/mvn/repository</url>  
  42.             <releases>  
  43.                 <enabled>true</enabled>  
  44.             </releases>  
  45.             <snapshots>  
  46.                 <enabled>false</enabled>  
  47.             </snapshots>  
  48.         </repository>  
  49.         <repository>  
  50.             <id>snapshots</id>  
  51.             <url>http://mvnrepo.taobao.ali.com/mvn/snapshots</url>  
  52.             <releases>  
  53.                 <enabled>false</enabled>  
  54.             </releases>  
  55.             <snapshots>  
  56.                 <enabled>true</enabled>  
  57.             </snapshots>  
  58.         </repository>  
  59.     </repositories>  
  60.     <build>  
  61.         <finalName>${project.artifactId}-${project.version}</finalName>  
  62.         <sourceDirectory>src</sourceDirectory>  
  63.         <plugins>   
  64.             <!--编译插件-->  
  65.             <plugin>  
  66.                 <groupId>org.apache.maven.plugins</groupId>  
  67.                 <artifactId>maven-compiler-plugin</artifactId>  
  68.                 <version>3.2</version>  
  69.                 <configuration>  
  70.                     <source>1.6</source>  
  71.                     <target>1.6</target>  
  72.                     <encoding>UTF-8</encoding>  
  73.                 </configuration>  
  74.             </plugin>  
  75.             <!--resource插件-->  
  76.             <plugin>   
  77.                 <groupId>org.apache.maven.plugins</groupId>   
  78.                 <artifactId>maven-resources-plugin</artifactId>   
  79.                 <version>2.6</version>   
  80.                 <configuration>   
  81.                 <encoding>UTF-8</encoding>   
  82.                 </configuration>   
  83.             </plugin>  
  84.             <!--签名插件-->  
  85.             <plugin>  
  86.                 <groupId>org.apache.maven.plugins</groupId>  
  87.                 <artifactId>maven-jarsigner-plugin</artifactId>  
  88.                 <version>1.2</version>  
  89.                 <executions>  
  90.                     <execution>  
  91.                         <id>signing</id>  
  92.                         <goals>  
  93.                             <goal>sign</goal>  
  94.                             <goal>verify</goal>  
  95.                         </goals>  
  96.                         <phase>package</phase>  
  97.                         <inherited>true</inherited>  
  98.                         <configuration>  
  99.                             <removeExistingSignatures>true</removeExistingSignatures>  
  100.                             <archiveDirectory />  
  101.                             <includes>  
  102.                                 <include>target/${project.artifactId}-${project.version}.apk</include>  
  103.                             </includes>  
  104.                             <keystore>${sign.keystore}</keystore>  
  105.                             <alias>${sign.alias}</alias>  
  106.                             <storepass>${sign.storepass}</storepass>  
  107.                             <verbose>true</verbose>  
  108.                         </configuration>  
  109.                     </execution>  
  110.                 </executions>  
  111.             </plugin>  
  112.             <!--android-maven-plugin-->  
  113.             <plugin>  
  114.                 <groupId>com.simpligility.maven.plugins</groupId>  
  115.                 <artifactId>android-maven-plugin</artifactId>  
  116.                 <version>4.0.0</version>  
  117.                 <configuration>  
  118.                     <source>1.6</source>  
  119.                     <target>1.6</target>  
  120.                     <encoding>UTF-8</encoding>  
  121.                     <!--设置AndroidManifest,assets,libs,res的路径,如果是标准的maven工程不需要设置-->  
  122.                     <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>  
  123.                     <assetsDirectory>${project.basedir}/assets</assetsDirectory>  
  124.                     <nativeLibrariesDirectory>${project.basedir}/libs</nativeLibrariesDirectory>  
  125.                     <resourceDirectory>${project.basedir}/res</resourceDirectory>  
  126.                     <failOnDuplicatePackages>false</failOnDuplicatePackages>  
  127.                     <!--关闭android:debuggable-->  
  128.                     <release>true</release>  
  129.                     <sdk>  
  130.                         <path>${env.ANDROID_HOME}</path>  
  131.                         <platform>19</platform>  
  132.                     </sdk>  
  133.                     <!--混淆-->  
  134.                     <proguard>  
  135.                         <skip>false</skip>  
  136.                         <config>${project.basedir}/proguard.cfg</config>  
  137.                         <proguardJarPath>${project.basedir}/tools/proguard.jar</proguardJarPath>  
  138.                         <jvmArguments>  
  139.                             <jvmArgument>-Xms256m</jvmArgument>  
  140.                             <jvmArgument>-Xmx512m</jvmArgument>  
  141.                         </jvmArguments>  
  142.                     </proguard>  
  143.                     <dex>  
  144.                         <jvmArguments>  
  145.                             <jvmArgument>-Xms2048m</jvmArgument>  
  146.                             <jvmArgument>-Xmx2048m</jvmArgument>  
  147.                         </jvmArguments>  
  148.                         <!--使用多dex打包-->  
  149.                         <multi-dex>true</multi-dex>  
  150.                         <minimal-main-dex>true</minimal-main-dex>  
  151.                         <dex-arguments>--set-max-idx-number=65536</dex-arguments>  
  152.                         <!--主dex里面的class-->  
  153.                         <main-dex-list>${project.basedir}/MainDexList.txt</main-dex-list>  
  154.                     </dex>  
  155.                     <!--禁用默认的debug签名-->  
  156.                     <sign>  
  157.                           <debug>false</debug>  
  158.                     </sign>  
  159.                     <!-- 对齐 -->  
  160.                     <zipalign>  
  161.                         <verbose>true</verbose>  
  162.                         <inputApk>  
  163.                             ${project.build.directory}/${project.artifactId}-${project.version}.apk  
  164.                         </inputApk>  
  165.                         <outputApk>  
  166.                             ${project.build.directory}/${project.artifactId}-${project.version}__${maven.build.timestamp}.apk  
  167.                         </outputApk>  
  168.                     </zipalign>  
  169.                 </configuration>  
  170.                 <executions>  
  171.                     <execution>  
  172.                         <id>alignApk</id>  
  173.                         <phase>package</phase>  
  174.                         <goals>  
  175.                             <goal>zipalign</goal>  
  176.                         </goals>  
  177.                     </execution>  
  178.                 </executions>  
  179.                 <extensions>true</extensions>  
  180.             </plugin>  
  181.         </plugins>  
  182.     </build>  
  183. </project>  

MainDexList.txt:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. android/support/multidex/MultiDex.class  
  2. android/support/multidex/MultiDex$V4.class  
  3. android/support/multidex/MultiDex$V14.class  
  4. android/support/multidex/MultiDex$V19.class  
  5. android/support/multidex/MultiDexApplication.class  
  6. android/support/multidex/MultiDexExtractor.class  
  7. android/support/multidex/MultiDexExtractor$1.class  
  8. android/support/multidex/ZipUtil.class  
  9. android/support/multidex/ZipUtil$CentralDirectory.class  
  10. com/example/hello/DemoMultiDexApplication.class  
这里面列出了放在主dex中的类。


proguard.cfg:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. -dontpreverify  
  2. -repackageclasses ''  
  3. -allowaccessmodification  
  4. -optimizations !code/simplification/arithmetic  
  5. -keepattributes *Annotation*  
  6. -keep public class * extends android.app.Activity  
  7. -keep public class * extends android.app.Application  
  8. -keep public class * extends android.app.Service  
  9. -keep public class * extends android.content.BroadcastReceiver  
  10. -keep public class * extends android.content.ContentProvider  
  11. -keep public class * extends android.view.View {  
  12.     public <init>(android.content.Context);  
  13.     public <init>(android.content.Context, android.util.AttributeSet);  
  14.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  15.     public void set*(...);  
  16. }  
  17. -keepclasseswithmembers class * {  
  18.     public <init>(android.content.Context, android.util.AttributeSet);  
  19. }  
  20. -keepclasseswithmembers class * {  
  21.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  22. }  
  23. -keepclassmembers class * implements android.os.Parcelable {  
  24.     static android.os.Parcelable$Creator CREATOR;  
  25. }  
  26. -keepclassmembers class **.R$* {  
  27.     public static <fields>;  
  28. }  
  29. -keep class com.example.hello.Person{*;}  
  30. -keep class android.support.multidex.*{*;}  
  31. -dontwarn com.alibaba.fastjson.**  
  32. -keep class com.alibaba.fastjson.**{*;}  
  33. -keep class com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter { *; }  
  34. -keep class com.alibaba.fastjson.support.spring.FastJsonJsonView { *; }  
  35. -dontwarn com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter  
  36. -dontwarn com.alibaba.fastjson.support.spring.FastJsonJsonView  

签名的时候就是使用的默认的keystore来签名的。


所使用的maven环境:


以上就是所有要做的了。

另外就是maven打好的包很可能启动不起来,可以用adb logcat来抓取logcat的日志。


完整的工程在这:http://download.csdn.net/detail/goldenfish1919/8274385


拷贝文件用的plugin:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <plugin>  
  2.                 <groupId>org.apache.maven.plugins</groupId>  
  3.                 <artifactId>maven-resources-plugin</artifactId>  
  4.                 <version>2.5</version>  
  5.                 <executions>  
  6.                     <execution>  
  7.                         <id>copy-resources</id>  
  8.                         <phase>validate</phase>  
  9.                         <goals>  
  10.                             <goal>copy-resources</goal>  
  11.                         </goals>  
  12.                         <configuration>  
  13.                             <outputDirectory>${basedir}/res/drawable/</outputDirectory>  
  14.                             <resources>  
  15.                                 <resource>  
  16.                                     <directory>${basedir}/securityjpg/</directory>  
  17.                                     <filtering>true</filtering>  
  18.                                     <includes>  
  19.                                         <include>*.jpg</include>  
  20.                                     </includes>  
  21.                                 </resource>  
  22.                             </resources>  
  23.                         </configuration>  
  24.                     </execution>  
  25.                 </executions>  
  26.             </plugin>  

多个源码目录:
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <build>  
  2.        <finalName>${project.artifactId}-${project.version}</finalName>  
  3.        <sourceDirectory>src</sourceDirectory>  
  4.        <resources>  
  5.            <resource>  
  6.                <targetPath>${basedir}/src/</targetPath>  
  7.                <directory>${basedir}/src1/</directory>  
  8.                <includes>  
  9.                    <include>**</include>  
  10.                </includes>  
  11.                <filtering>true</filtering>  
  12.            </resource>  
  13.            <resource>  
  14.                <targetPath>${basedir}/src/</targetPath>  
  15.                <directory>${basedir}/src2/</directory>  
  16.                <includes>  
  17.                    <include>**</include>  
  18.                </includes>  
  19.                <filtering>true</filtering>  
  20.            </resource>  
  21.            <resource>  
  22.                <targetPath>${basedir}/src/</targetPath>  
  23.                <directory>${basedir}/src3/</directory>  
  24.                <includes>  
  25.                    <include>**</include>  
  26.                </includes>  
  27.                <filtering>true</filtering>  
  28.            </resource>  
  29.        </resources>  
  30. </build>  


参考:

http://www.infoq.com/cn/news/2014/11/android-multidex

https://github.com/simpligility/android-maven-plugin

http://stackoverflow.com/questions/26530654/android-multidex-support-library-using-eclipse

https://github.com/lsuski/maven-multidex-sample

http://simpligility.github.io/android-maven-plugin/dex-mojo.html



0 0
原创粉丝点击