Android-maven配置multidex打包

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


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

先看下工程结构:

Android-maven配置multidex打包

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

  1. publicclassDemoMultiDexApplicationextendsMultiDexApplication{
  2. /*如果已经继承了别的类,可以重写下面的方法
  3. @Override
  4. protectedvoidattachBaseContext(Contextbase){
  5. super.attachBaseContext(base);
  6. MultiDex.install(this);
  7. }
  8. */
  9. }
重点看一下pom:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <projectxmlns="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.0http://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>taobaomirrorsnapshots</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:

  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:

  1. -dontpreverify
  2. -repackageclasses''
  3. -allowaccessmodification
  4. -optimizations!code/simplification/arithmetic
  5. -keepattributes*Annotation*
  6. -keeppublicclass*extendsandroid.app.Activity
  7. -keeppublicclass*extendsandroid.app.Application
  8. -keeppublicclass*extendsandroid.app.Service
  9. -keeppublicclass*extendsandroid.content.BroadcastReceiver
  10. -keeppublicclass*extendsandroid.content.ContentProvider
  11. -keeppublicclass*extendsandroid.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. publicvoidset*(...);
  16. }
  17. -keepclasseswithmembersclass*{
  18. public<init>(android.content.Context,android.util.AttributeSet);
  19. }
  20. -keepclasseswithmembersclass*{
  21. public<init>(android.content.Context,android.util.AttributeSet,int);
  22. }
  23. -keepclassmembersclass*implementsandroid.os.Parcelable{
  24. staticandroid.os.Parcelable$CreatorCREATOR;
  25. }
  26. -keepclassmembersclass**.R$*{
  27. publicstatic<fields>;
  28. }
  29. -keepclasscom.example.hello.Person{*;}
  30. -keepclassandroid.support.multidex.*{*;}
  31. -dontwarncom.alibaba.fastjson.**
  32. -keepclasscom.alibaba.fastjson.**{*;}
  33. -keepclasscom.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter{*;}
  34. -keepclasscom.alibaba.fastjson.support.spring.FastJsonJsonView{*;}
  35. -dontwarncom.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
  36. -dontwarncom.alibaba.fastjson.support.spring.FastJsonJsonView

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


所使用的maven环境:

Android-maven配置multidex打包

以上就是所有要做的了。

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


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


拷贝文件用的plugin:

  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>

多个源码目录:
  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://*.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