彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(二)
2017-01-09 15:52
561 查看
在上一篇博客中,我给大家详细介绍了ant实现Android多分包技术,具体可以点击查看:彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(一);接下来的这篇博客我将带领大家一起学习使用Gradle构建Android项目多分包。
说到Gradle,就不得不提到使用AndroidStudio进行开发,首先看一下在AndroidStudio中我们整个项目的框架。
这里,为了实现多分包技术,我们首先需要使用Android SDK Build Tools 21.1及以上的版本,接着修改工程中app目录下的build.gradle文件,在defaultConfig中添加multiDexEnabled true这个配置项。完成后还需要在dependencies中添加multidex的依赖:
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
32
33
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
32
33
2
3
4
5
6
7
1
2
3
4
5
6
7
2
3
1
2
3
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
通常我们在build.gradle文件中添加afterEvaluate区域,并在其内部采用–main-dex-list选项来指定主dex中要包含的类。
castielmaindexlist.txt
需要注意的是,multidex的jar包中的9个类必须也要打到主包中,否则程序会因为找不到multidex相关类而抛出异常。
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
(1)应用启动速度会降低
(2)部分android 4.0以下的设备可能会出现兼容问题
参考内容:《Android开发艺术探索》
增加多分包配置
说到Gradle,就不得不提到使用AndroidStudio进行开发,首先看一下在AndroidStudio中我们整个项目的框架。这里,为了实现多分包技术,我们首先需要使用Android SDK Build Tools 21.1及以上的版本,接着修改工程中app目录下的build.gradle文件,在defaultConfig中添加multiDexEnabled true这个配置项。完成后还需要在dependencies中添加multidex的依赖:
compile 'com.android.support:multidex:1.0.0'1
1
具体代码如下:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "24.0.1" defaultConfig { applicationId "com.xingyu.castiel" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:multidex:1.0.0' testCompile 'junit:junit:4.12' }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
32
33
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
32
33
代码中加入multidex功能
方案一:在manifest文件中指定Application为MultiDexApplication
<application android:name="android.support.multidex.MultiDexApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> ……>1
2
3
4
5
6
7
1
2
3
4
5
6
7
方案二:让应用的Application继承MultiDexApplication
public class MyApplication extends MultiDexApplication{ …… }1
2
3
1
2
3
方案三:重写Application的attachBaseContext方法,该方法放到onCreate前执行
public class MyApplication extends Application{ @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
指定dex文件所包含的类
通常我们在build.gradle文件中添加afterEvaluate区域,并在其内部采用–main-dex-list选项来指定主dex中要包含的类。
自定义的主包类列表
castielmaindexlist.txt 需要注意的是,multidex的jar包中的9个类必须也要打到主包中,否则程序会因为找不到multidex相关类而抛出异常。
// 我主包中包含的类 com/xingyu/castiel/MainActivity.class // multidex android/support/multidex/MultiDex.class android/support/multidex/MultiDexApplication.class android/support/multidex/MultiDexExtractor$1.class android/support/multidex/MultiDexExtractor.class android/support/multidex/MultiDex$V14.class android/support/multidex/MultiDex$V19.class android/support/multidex/MultiDex$V4.class android/support/multidex/ZipUtil$CentralDirectory.class android/support/multidex/ZipUtil.class1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
多分包技术可能带来的问
(1)应用启动速度会降低 (2)部分android 4.0以下的设备可能会出现兼容问题
参考内容:《Android开发艺术探索》
相关文章推荐
- Dex文件结构
- Eclipse + Gradle实现APK分包
- gradle相关
- Qt使用socket传送图片
- apk格式分析及逆向
- IOCP 二进制协议 分包
- 源码分析:MultiDex实现原理分析
- 从.java到.dex文件(命令行,基础HelloWorld.java示例。)
- Android 开发系列(6) - 使用 winrar 和 dex2jar 对 apk 反编译成 jar
- android分包
- Eclipse项目 转为 Studio项目,遇见Error:Error converting bytecode to dex:
- Mutildex解决Android应用Dex方法数限制
- android APK加固篇-1. 动态加载的Dex文件的生成
- TCP Socket 分包办法
- Android 安卓Studio 分包具体实现 multidex-publishing
- Dalvik指令格式
- Android中Dex分包实践
- Android 一种在Dalvik虚拟机上多Dex加载优化的方案
- android方法数限制原因
- AndroidStudio分包导致的NoClassDefFoundError解决办法