首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么只添加multiDexEnabled很好

为什么只添加multiDexEnabled很好
EN

Stack Overflow用户
提问于 2020-02-16 06:36:13
回答 2查看 178关注 0票数 1

最近,我一直在努力解决android系统中的多重运行问题,我脑海中浮现了这个问题:

在android项目中启用multiDex

如果您只添加这一行:

代码语言:javascript
运行
复制
// gradle build config
multiDexEnabled true

该应用程序将编译和工作良好。

但是真正的解决方案是:

multiDexEnabled true

  • Add

  • 添加支持库androidx.multidex

  • Override Application类.

为什么只添加multiDexEnabled true 并成功运行?剩下的两个步骤是吗?

我没在考虑什么吗?

顺便说一下,我的minSdkVersion是15

EN

回答 2

Stack Overflow用户

发布于 2020-02-16 07:18:39

这里是Google自己的链接。

当应用程序及其引用的库超过65,536个方法时,您会遇到一个构建错误,表明应用程序已达到Android构建体系结构的极限:

代码语言:javascript
运行
复制
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

构建系统的旧版本报告了一个不同的错误,这表明了相同的问题:

代码语言:javascript
运行
复制
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

这两种错误条件都显示一个公共数字: 65536。这个数字表示代码在单个Dalvik Executable (DEX)字节码文件中可以调用的引用总数。本页面解释了如何通过启用一个名为multidex的应用程序配置来克服这个限制,它允许应用程序构建和读取多个DEX文件。

关于64K参考极限的

Android应用程序(APK)文件以Dalvik executable (DEX)文件的形式包含可执行字节码文件,其中包含用于运行应用程序的编译代码。Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536个--包括您自己代码中的Android框架方法、库方法和方法。在计算机科学中,术语Kilo,K,表示1024 (或2^10)。因为65,536等于64×1024,这个限制被称为'64K参考极限‘。

Android5.0之前的Multidex支持

Android5.0之前的平台版本(API级别21)使用Dalvik运行时来执行应用程序代码。默认情况下,Dalvik将每个APK的应用程序限制为一个classes.dex字节码文件。为了克服这个限制,您可以将multidex支持库添加到您的项目中:

代码语言:javascript
运行
复制
dependencies {
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}

如果不使用AndroidX,则添加以下支持库依赖项:

代码语言:javascript
运行
复制
implementation 'com.android.support:multidex:1.0.3'

build.gradle

  • 修改模块级的

  • 文件以启用multidex,并将multidex库添加为依赖项,如下所示:

代码语言:javascript
运行
复制
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

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

根据是否覆盖应用程序类,

  1. 执行下列操作之一:

如果不覆盖应用程序类,请编辑清单文件以在标记中设置android:name,如下所示:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

如果确实覆盖了应用程序类,请将其更改为扩展MultiDexApplication (如果可能的话)如下:

代码语言:javascript
运行
复制
public class MyApplication extends MultiDexApplication { ... }

或者,如果您确实重写了应用程序类,但是无法更改基类,则可以重写attachBaseContext()方法并调用MultiDex.install(this)来启用multidex

代码语言:javascript
运行
复制
public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}
票数 0
EN

Stack Overflow用户

发布于 2020-02-16 07:01:25

当应用程序超过了方法/dex大小限制(64K)时,就会发生这种情况。

由于您的minSdk是15,所以必须手动添加MultiDex,这在Api 21+上是不需要的。

在Pre-21上执行以下支持MultiDex的操作

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

使应用程序类扩展MultiDexApplication

代码语言:javascript
运行
复制
public class Application extends MultiDexApplication {}

如果您根本不想使用..,则可以使用MultiDex来删除未使用的类和方法。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60246016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档