multiDex:分包

QuibblerQuibbler 2020-04-29 约 8 分钟 1745 次阅读

multiDex:分包

开发的APP功能越来越多,引入的库也越来越多,很容易达到“界限”65536,因为Android中一个Dex文件最多存储65536个方法(short类型的范围)。这时候就要开启“分包”multiDex。

1、Android 5.0之后分包

Android 5.0也就是API 21之后ART虚拟机支持MultiDex。直接在build.gradle文件中直接配置multiDexEnabled true,开启分包。

android {
	    defaultConfig {
	        ...
	        minSdkVersion 21 
	        targetSdkVersion 29
	        multiDexEnabled true
	    }
	    ...
	}

2、Android 1.6~5.0分包

系统只加载一个主dex,其它的dex采用MultiDex手段来加载。MultiDex支持安卓1.6 到 5.0之间的版本,低于1.6就不支持没办法了。

2.1、配置依赖

除了在build.gradle文件中添加配置:multiDexEnabled true

android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 23
            multiDexEnabled true
        }
        ...
    }

还需要引入support依赖:MultiDex

dependencies {
        ...
        implementation 'com.android.support:multidex:1.0.3'
    }

2.2、使用MultiDex

APP自定义Application继承MultiDexApplication

public class MyApplication extends MultiDexApplication {
    
    }

或者不继承,在Application的attachBaseContext(Context base)中开启分包

public class MyApplication{
    
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(this);
        }
        
    }

MultiDexApplication也是在attachBaseContext(Context base)方法中去加载安装分包

public class MultiDexApplication extends Application {
    
        public MultiDexApplication() {
        }
        
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(this);
        }
        
    }

2.3、MultiDex部分源码

看看MultiDex的install()方法

public static void install(Context context) {
        Log.i("MultiDex", "Installing application");
        if (IS_VM_MULTIDEX_CAPABLE) {
            Log.i("MultiDex", "VM具有Multidex支持,MultiDex支持库已禁用.");
        } else if (VERSION.SDK_INT < 4) {
            throw new RuntimeException("MultiDex installation failed. SDK " + VERSION.SDK_INT 
                                        + " is unsupported. Min SDK version is " + 4 + ".");
        } else {
            try {
                ApplicationInfo applicationInfo = getApplicationInfo(context);
                if (applicationInfo == null) {
                    Log.i("MultiDex", "No ApplicationInfo available, 
                                      i.e. running on a test Context: MultiDex support library is disabled.");
                    return;
                }
                doInstallation(context, new File(applicationInfo.sourceDir), 
                              new File(applicationInfo.dataDir), "secondary-dexes", "", true);
            } catch (Exception var2) {
                Log.e("MultiDex", "MultiDex installation failure", var2);
                throw new RuntimeException("MultiDex installation failed (" + var2.getMessage() + ").");
            }
            Log.i("MultiDex", "install done");
        }
    }

可以看见MultiDex对当前系统版本进程了判断:

①如果系统版本大于android 5.0 ART虚拟机 天然支持MultiDex

②系统版本低于android 1.6 抛出异常

③doInstallation MultiDex 处理

参考博客:

        Android multidex 使用 与 实现原理

        MultiDex使用

        Gradle配置Multidex

        multiDexEnabled遇坑简记

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w