Android-maven配置multidex打包

转载请标明出处: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()来实现。

public class DemoMultiDexApplication extends MultiDexApplication {
	/*如果已经继承了别的类,可以重写下面的方法
	@Override
	protected void attachBaseContext(Context base) {
		super.attachBaseContext(base);
		MultiDex.install(this);
	}
	*/
}

重点看一下pom:

<?xml version="1.0" encoding="utf-8"?>
<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">
    <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>
    <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>
                    <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>
                </configuration>
                <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

这里面列出了放在主dex中的类。

proguard.cfg:

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
    public static <fields>;
}
-keep class com.example.hello.Person{*;}
-keep class android.support.multidex.*{*;}
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.**{*;}
-keep class com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter { *; }
-keep class com.alibaba.fastjson.support.spring.FastJsonJsonView { *; }
-dontwarn com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
-dontwarn com.alibaba.fastjson.support.spring.FastJsonJsonView

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

所使用的maven环境:

以上就是所有要做的了。

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

完整的工程在这:http://download.csdn.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

时间: 2024-10-15 11:14:26

Android-maven配置multidex打包的相关文章

Maven配置和打包以及使用Eclipse构建Maven项目

Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.本文仅对Eclipse中如何安装.配置和使用Maven进行了介绍.完全step by step. 如果觉得本文对你有用,请移步到:http://download.csdn.net/detail/qjyong/5582071 下载PDF版,http://download.csdn.net/detail/qjyong/5582087 下载配套示例项目源代码. 1.   Eclipse-jee的安装 进入ecli

maven配置profile,按指定环境打包

日常开发中,经常会处理开发环境.测试环境.生产环境的配置文件,一旦项目大了之后各种配置文件太多,每次修改配置文件切换各种环境时容易遗漏,解决方案可以使用maven配置profile来实现,修改pom.xml如下: 1.新增profiles,与build同级 <profiles> <profile> <!-- 测试环境 --> <id>test</id> <properties> <profiles.active>test&

maven配置tomcat插件,及在maven打包时文件名不包含版本号

maven配置tomcat插件,及在maven打包时文件名不包含版本号 <build> <!-- 指定文件名,在打包时文件名不包含版本号 --> <finalName>${project.artifactId}</finalName> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> &l

maven 配置自动本地/线上不同配置自动打包

工程结构:在resource下新建开发,线上不同文件夹存放不同配置文件 pom.xml配置文件 <!-- maven配置不同环境打包 --> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7&l

Maven配置、第三方依赖jar包打包以及Profiles多环境配置

由一次打包部署失败引发的深入探索┑( ̄▽  ̄)┍ 一.Maven配置 1.概览 <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/xsd/

Maven配置笔记

android-m2e插件与maven 自定义用户配置路径 不管插件还是maven,默认的用户配置路径是统一的:${user.home}/.m2/settings.xml 但是插件可以通过eclipse设置用户配置的路径(配置方法参考<ADT+Android-m2e环境搭建>):而maven不能永久指定,只能在每次使用mvn命令时加上"-s 新路径"参数. 依赖 如果使用android-m2d,在eclipse中写好依赖配置(<dependency>),保存之后

android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题!

ndroid-Easy-MultiDex 项目地址:TangXiaoLv/Android-Easy-MultiDex 简介:Android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题! 注 1:不想看前半部分的话可以直接跳过到最下面配置部分.注 2:本插件是基于DexKnifePlugin 1.5.6优化改造而来,感谢 ceabie 的无私奉献. 填坑之路 坑 1:65536 ,So easy! 原因:Dalvik 的 invoke-kind 指令集中,method refere

Android兼容包multidex的开发和构建方法

在Android开发中,函数方法超过65k限制后,我们就常常会用到multidex分包解决,但是multidex的配置,对系统apk的构建.签名.打包复杂性大大的增加,严重的降低了构建效率.那这个问题怎么处理呢? 为解决这个问题,通常我们使用的方法就是在Gradle productFlavors新建出来一个 development flavor 和 production flavor 来满足我们不同构建需求. 为了更直观的给大家展示具体的操作,我们通过一个例子来演示如何设置这些flavors在G

android studio下 library打包文件(.aar)和本地引用

关键点: 利用Gradle发布本地maven库支持android library 打包文件(*.aar) 的本地引用 开发环境: windows7 64位操作系统 android studio0.5.8 (1) 安装maven1.在安装maven之前,先确保已经安装JDK1.6及以上版本,并且配置好环境变量.2.下载maven3,最新版本是Maven3.2.1 ,下载地址:http://maven.apache.org/download.html 下载apache-maven-3.2.1-bin