Android-maven配置multidex打包
转自:http://blog.****.net/goldenfish1919/article/details/42006649
工程大了以后,不可避免就会出现方法数目超出65536的限制,很幸运的是新的android提供了多dex打包的方式可以解决这个问题。下面我们就来看下如何用android-maven-plugin打多dex包。
先看下工程结构:
并不是一个标准的maven工程,但是可以通过更改配置来完成打包。工程的代码非常简单,MainActivity有一个按钮,点击按钮跳转到SecondActivity,SecondActivity中引用了fastjson做了一个对象转string的操作,然后弹出toast提示。还有就是DemoMultiDexApplication继承了MultiDexApplication。假如你的Application已经继承了别的类,那么也可以重写attachBaseContext()来实现。
- publicclassDemoMultiDexApplicationextendsMultiDexApplication{
- /*如果已经继承了别的类,可以重写下面的方法
- @Override
- protectedvoidattachBaseContext(Contextbase){
- super.attachBaseContext(base);
- MultiDex.install(this);
- }
- */
- }
- <?xmlversion="1.0"encoding="utf-8"?>
- <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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example.test</groupId>
- <artifactId>multidexdemo</artifactId>
- <version>1.0.0</version>
- <packaging>apk</packaging>
- <name>multidexdemo</name>
- <properties>
- <sign.keystore>${project.basedir}/debug.keystore</sign.keystore>
- <sign.alias>androiddebugkey</sign.alias>
- <sign.storepass>android</sign.storepass>
- </properties>
- <dependencies>
- <dependency>
- <groupId>com.google.android</groupId>
- <artifactId>android</artifactId>
- <version>4.3.0</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.1.45</version>
- </dependency>
- <dependency>
- <groupId>com.android.support</groupId>
- <artifactId>multidex</artifactId>
- <version>20</version>
- </dependency>
- </dependencies>
- <repositories>
- <repository>
- <id>tbmirror-snapshots</id>
- <name>taobaomirrorsnapshots</name>
- <url>http://mvnrepo.taobao.ali.com/mvn/snapshots</url>
- <layout>default</layout>
- </repository>
- <repository>
- <id>central</id>
- <url>http://mvnrepo.taobao.ali.com/mvn/repository</url>
- <releases>
- <enabled>true</enabled>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- <repository>
- <id>snapshots</id>
- <url>http://mvnrepo.taobao.ali.com/mvn/snapshots</url>
- <releases>
- <enabled>false</enabled>
- </releases>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- </repository>
- </repositories>
- <build>
- <finalName>${project.artifactId}-${project.version}</finalName>
- <sourceDirectory>src</sourceDirectory>
- <plugins>
- <!--编译插件-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.2</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <!--resource插件-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.6</version>
- <configuration>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <!--签名插件-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jarsigner-plugin</artifactId>
- <version>1.2</version>
- <executions>
- <execution>
- <id>signing</id>
- <goals>
- <goal>sign</goal>
- <goal>verify</goal>
- </goals>
- <phase>package</phase>
- <inherited>true</inherited>
- <configuration>
- <removeExistingSignatures>true</removeExistingSignatures>
- <archiveDirectory/>
- <includes>
- <include>target/${project.artifactId}-${project.version}.apk</include>
- </includes>
- <keystore>${sign.keystore}</keystore>
- <alias>${sign.alias}</alias>
- <storepass>${sign.storepass}</storepass>
- <verbose>true</verbose>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!--android-maven-plugin-->
- <plugin>
- <groupId>com.simpligility.maven.plugins</groupId>
- <artifactId>android-maven-plugin</artifactId>
- <version>4.0.0</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- <encoding>UTF-8</encoding>
- <!--设置AndroidManifest,assets,libs,res的路径,如果是标准的maven工程不需要设置-->
- <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
- <assetsDirectory>${project.basedir}/assets</assetsDirectory>
- <nativeLibrariesDirectory>${project.basedir}/libs</nativeLibrariesDirectory>
- <resourceDirectory>${project.basedir}/res</resourceDirectory>
- <failOnDuplicatePackages>false</failOnDuplicatePackages>
- <!--关闭android:debuggable-->
- <release>true</release>
- <sdk>
- <path>${env.ANDROID_HOME}</path>
- <platform>19</platform>
- </sdk>
- <!--混淆-->
- <proguard>
- <skip>false</skip>
- <config>${project.basedir}/proguard.cfg</config>
- <proguardJarPath>${project.basedir}/tools/proguard.jar</proguardJarPath>
- <jvmArguments>
- <jvmArgument>-Xms256m</jvmArgument>
- <jvmArgument>-Xmx512m</jvmArgument>
- </jvmArguments>
- </proguard>
- <dex>
- <jvmArguments>
- <jvmArgument>-Xms2048m</jvmArgument>
- <jvmArgument>-Xmx2048m</jvmArgument>
- </jvmArguments>
- <!--使用多dex打包-->
- <multi-dex>true</multi-dex>
- <minimal-main-dex>true</minimal-main-dex>
- <dex-arguments>--set-max-idx-number=65536</dex-arguments>
- <!--主dex里面的class-->
- <main-dex-list>${project.basedir}/MainDexList.txt</main-dex-list>
- </dex>
- <!--禁用默认的debug签名-->
- <sign>
- <debug>false</debug>
- </sign>
- <!--对齐-->
- <zipalign>
- <verbose>true</verbose>
- <inputApk>
- ${project.build.directory}/${project.artifactId}-${project.version}.apk
- </inputApk>
- <outputApk>
- ${project.build.directory}/${project.artifactId}-${project.version}__${maven.build.timestamp}.apk
- </outputApk>
- </zipalign>
- </configuration>
- <executions>
- <execution>
- <id>alignApk</id>
- <phase>package</phase>
- <goals>
- <goal>zipalign</goal>
- </goals>
- </execution>
- </executions>
- <extensions>true</extensions>
- </plugin>
- </plugins>
- </build>
- </project>
MainDexList.txt:
- android/support/multidex/MultiDex.class
- android/support/multidex/MultiDex$V4.class
- android/support/multidex/MultiDex$V14.class
- android/support/multidex/MultiDex$V19.class
- android/support/multidex/MultiDexApplication.class
- android/support/multidex/MultiDexExtractor.class
- android/support/multidex/MultiDexExtractor$1.class
- android/support/multidex/ZipUtil.class
- android/support/multidex/ZipUtil$CentralDirectory.class
- com/example/hello/DemoMultiDexApplication.class
proguard.cfg:
- -dontpreverify
- -repackageclasses''
- -allowaccessmodification
- -optimizations!code/simplification/arithmetic
- -keepattributes*Annotation*
- -keeppublicclass*extendsandroid.app.Activity
- -keeppublicclass*extendsandroid.app.Application
- -keeppublicclass*extendsandroid.app.Service
- -keeppublicclass*extendsandroid.content.BroadcastReceiver
- -keeppublicclass*extendsandroid.content.ContentProvider
- -keeppublicclass*extendsandroid.view.View{
- public<init>(android.content.Context);
- public<init>(android.content.Context,android.util.AttributeSet);
- public<init>(android.content.Context,android.util.AttributeSet,int);
- publicvoidset*(...);
- }
- -keepclasseswithmembersclass*{
- public<init>(android.content.Context,android.util.AttributeSet);
- }
- -keepclasseswithmembersclass*{
- public<init>(android.content.Context,android.util.AttributeSet,int);
- }
- -keepclassmembersclass*implementsandroid.os.Parcelable{
- staticandroid.os.Parcelable$CreatorCREATOR;
- }
- -keepclassmembersclass**.R$*{
- publicstatic<fields>;
- }
- -keepclasscom.example.hello.Person{*;}
- -keepclassandroid.support.multidex.*{*;}
- -dontwarncom.alibaba.fastjson.**
- -keepclasscom.alibaba.fastjson.**{*;}
- -keepclasscom.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter{*;}
- -keepclasscom.alibaba.fastjson.support.spring.FastJsonJsonView{*;}
- -dontwarncom.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
- -dontwarncom.alibaba.fastjson.support.spring.FastJsonJsonView
签名的时候就是使用的默认的keystore来签名的。
所使用的maven环境:
以上就是所有要做的了。
另外就是maven打好的包很可能启动不起来,可以用adb logcat来抓取logcat的日志。
完整的工程在这:http://download.****.net/detail/goldenfish1919/8274385
拷贝文件用的plugin:
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.5</version>
- <executions>
- <execution>
- <id>copy-resources</id>
- <phase>validate</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${basedir}/res/drawable/</outputDirectory>
- <resources>
- <resource>
- <directory>${basedir}/securityjpg/</directory>
- <filtering>true</filtering>
- <includes>
- <include>*.jpg</include>
- </includes>
- </resource>
- </resources>
- </configuration>
- </execution>
- </executions>
- </plugin>
多个源码目录:
- <build>
- <finalName>${project.artifactId}-${project.version}</finalName>
- <sourceDirectory>src</sourceDirectory>
- <resources>
- <resource>
- <targetPath>${basedir}/src/</targetPath>
- <directory>${basedir}/src1/</directory>
- <includes>
- <include>**</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- <resource>
- <targetPath>${basedir}/src/</targetPath>
- <directory>${basedir}/src2/</directory>
- <includes>
- <include>**</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- <resource>
- <targetPath>${basedir}/src/</targetPath>
- <directory>${basedir}/src3/</directory>
- <includes>
- <include>**</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- </resources>
- </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