Android应用方法数超过64K学习笔记

解决64K问题以及对64K的学习笔记

一、出现64K限制后如何解决

1.优化APP,避免出现64K

1.1 检查项目依赖,减少不必要的依赖库

有时候我们依赖的开源库只是用到这个库的小部分功能,考虑自己实现或者有能力就裁剪下。不能做出一股脑先依赖再说的骚操作。对比类似开源库,选用合适的开源库。

1.2 通过ProGuard 移除未引用的代码

在build.gradle中添加如下

android {
    buildTypes {
        release {
            minifyEnabled true//启用代码压缩
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项。ProGuard 还可优化字节码,移除未使用的代码指令,以及用短名称混淆其余的类、字段和方法。
除了用proguard-android.txt,还可以用proguard-android-optimize.txt在字节码一级(方法内和方法间)执行分析优化,进行优化APK。

2.无法避免,采用MultiDex

2.1 依赖multiDex库
dependencies {
    compile 'com.android.support:multidex:1.0.1'
}
2.2 配置Application Module的build.gradle
android {
    defaultConfig {
        multiDexEnabled true
    }
}
2.3 修改Application类(选择下列任意一种方式)
2.3.1 如果项目没有Application,则可以在AndroidManifest.xml中配置MutilDexApllication
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample">
    <application
        android:name="android.support.multidex.MultiDexApplication"
    </application>
</manifest>
2.3.2 如果你的App已经有自定义的Application(相信大多数都有),那么可以采用继承MultiDexApplication。
public class SampleApplication extends MultiDexApplication {
    @Override
    public void onCreate() {
        super.onCreate();
    }
}
2.3.3 如果不想按照2.3.2的方法,则可以选择覆写attachBaseContext方法并且初始化MultiDex
public class SampleApplication extends Application {

    @Override
    public void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

二、MultiDex库的局限性

1.可能导致应用出现ANR

启动期间在设备数据分区中安装 DEX 文件的过程相当复杂,如果辅助 DEX 文件较大,可能会导致应用无响应 (ANR) 错误。在此情况下,您应该通过 ProGuard 应用代码压缩以尽量减小 DEX 文件的大小,并移除未使用的那部分代码。

2.可能无法运行在Android 4.0(API 14)之前的设备上启动

由于存在 Dalvik linearAlloc 错误(问题 22586),使用 Dalvik 可执行文件分包的应用可能无法在运行的平台版本早于 Android 4.0(API 级别 14)的设备上启动。

3.可能在Android 5.0之前运行期间崩溃

由于存在 Dalvik linearAlloc 限制(问题 78035),因此,如果使用 Dalvik 可执行文件分包配置的应用发出非常庞大的内存分配请求,则可能会在运行期间发生崩溃。尽管 Android 4.0(API 级别 14)提高了分配限制,但在 Android 5.0(API 级别 21)之前的 Android 版本上,应用仍有可能遭遇这一限制。

参考资料

https://developer.android.google.cn/studio/build/multidex.html#keep

猜你喜欢

转载自blog.csdn.net/scau_zhangpeng/article/details/78487213