Android 解决65536(1),想提高开发效率的必看

defaultConfig {

minSdkVersion 15

targetSdkVersion 30

multiDexEnabled true

}

}

dependencies {

implementation “androidx.multidex:multidex:2.0.1”

}

  • 不使用AndroidX(已弃用)

android {

defaultConfig {

minSdkVersion 15

targetSdkVersion 30

multiDexEnabled true

}

}

dependencies {

implementation ‘com.android.support:multidex:1.0.3’

}

2.根据你是否覆盖 Application 类,执行以下操作之一:

  • 如果你不覆盖 Application 类,请编辑你的清单文件以在 < application > 标记中设置 android:name,如下所示:
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android=“http://schemas.android.com/apk/res/android”

package=“com.scc.demo”>

<application

android:name=“androidx.multidex.MultiDexApplication” >

  • 如果你确实覆盖了 Application 类,请将其更改为扩展 MultiDexApplication(非必须),如下所示:

public class MyApplication extends MultiDexApplication { … }

  • 或者,如果你确实覆盖了 Application 类但无法更改基类,那么你可以覆盖 attachBaseContext() 方法和

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

callMultiDex.install(this) 以启用 multidex:

public class MyApp extends Application {

@Override

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}

}

注意: 在 MultiDex.install() 完成之前,不要通过反射或 JNI 执行 MultiDex.install() 或任何其他代码。 Multidex 跟踪不会跟随这些调用,导致 ClassNotFoundException 或由于 DEX 文件之间的类分区错误而导致验证错误。

现在,当你构建应用程序时,Android 构建工具会根据需要构建一个主要的 DEX 文件 (classes.dex) 和支持的 DEX 文件(classes2.dex、classes3.dex 等)。构建系统然后将所有 DEX 文件打包到你的 APK 中。

在运行时,multidex API 使用特殊的类加载器来搜索所有可用的 DEX 文件以查找你的方法(而不是仅在主 classes.dex 文件中搜索)。

multidex 库的限制

multidex 库有一些已知的限制,当你将其合并到应用程序构建配置中时,你应该注意并测试这些限制:

  • 在启动期间将 DEX 文件安装到设备的数据分区上很复杂,如果辅助 DEX 文件很大,可能会导致应用程序无响应 (ANR) 错误。为避免此问题,请启用代码收缩以最小化 DEX 文件的大小并删除未使用的代码部分。

  • 在 Android 5.0(API 级别 21)之前的版本上运行时,使用 multidex 不足以解决 linearalloc 限制(问题 78035)。此限制在 Android 4.0(API 级别 14)中有所增加,但这并没有完全解决。在低于 Android 4.0 的版本上,你可能会在达到 DEX 索引限制之前达到线性分配限制。因此,如果你的目标 API 级别低于 14,请在平台的这些版本上进行__彻底测试*,因为你的应用程序可能在启动时或加载特定类组时出现问题。

代码缩减可以减少或可能消除这些问题。

在主 DEX 文件中声明所需的类


如果你收到 java.lang.NoClassDefFoundError,那么你必须通过在构建类型中使用 multiDexKeepFilemultiDexKeepProguard 属性声明它们,根据主 DEX 文件中的要求手动指定这些附加类。 如果某个类在 multiDexKeepFile 或 multiDexKeepProguard 文件中匹配,则该类将添加到主 DEX 文件中。

multiDexKeepFile 属性

你在multiDexKeepFile其中指定的文件应每行包含一个类,格式为com/example/MyClass.class. 例如,你可以创建一个如下所示的文件multidex-config.txt:

com/scc/MyClass.class

com/scc/MyOtherClass.class

然后,你可以为构建类型声明该文件,如下所示:

android {

buildTypes {

release {

multiDexKeepFile file(‘multidex-config.txt’)

}

}

}

注意: Gradle 读取相对于build.gradle文件的路径,因此如果multidex-config.txt与build.gradle文件位于同一目录中,则上述示例有效。

multiDexKeepProguard 属性

该multiDexKeepProguard文件使用与 Proguard 相同的格式,并支持整个 Proguard 语法。

你在multiDexKeepProguard其中指定的文件应包含 -keep 任何有效 ProGuard 语法中的选项。例如, -keep com.scc.MyClass.class。你可以创建一个名为的文件 multidex-config.pro,如下所示:

-keep class com.scc.MyClass

-keep class com.scc.MyClassToo

如果要指定包中的所有类,文件如下所示:

-keep class com.scc.** { *; } // com.scc 包中的所有类

然后,你可以为构建类型声明该文件,如下所示:

android {

buildTypes {

release {

multiDexKeepProguard file(‘multidex-config.pro’)

}

}

}

在开发版本中优化 multidex


为了减少更长的增量构建时间,使用 pre-dexing在构建之间重用 multidex 输出。Pre-dexing 依赖于仅在 Android 5.0(API 级别 21)及更高版本上可用的 ART 格式。如果你使用的是 Android Studio 2.3 及更高版本,则在将你的应用程序部署到运行 Android 5.0(API 级别 21)或更高版本的设备时,IDE 会自动使用此功能

注意: 适用于 Gradle 3.0.0及更高版本的Android 插件包括进一步改进以优化构建速度,例如按类进行 dexing(以便仅对你修改的类进行重新索引)。一般来说,为了获得最佳的开发体验,你应该始终升级到 最新版本的 Android Studio和 Android 插件。

但是,如果你从命令行运行 Gradle 构建,则需要将 minSdkVersion 设置为 21 或更高以启用 pre-dexing。保留生产版本设置的一个有用策略是使用产品风格创建两个版本的应用程序 :开发风格和发布风格,具有不同的值minSdkVersion,如下所示。

android {

defaultConfig {

multiDexEnabled true

//最低 API 级别。

minSdkVersion 15

}

productFlavors {

dev {

//(API 级别 21)或更高 .

minSdkVersion 21

}

prod {

// 如果你已经为生产版本配置了 defaultConfig 块

// 你的应用程序,你可以将此块留空,Gradle 会使用其中的配置

// 代替 defaultConfig 块。 你仍然需要包括这种味道。

// 否则,所有变体都使用“dev”配置。

}

}

buildTypes {

release {

minifyEnabled true

proguardFiles getDefaultProguardFile(‘proguard-android.txt’),

‘proguard-rules.pro’

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值