如何使用新的 Android Multidex 支持库启用多索引
Posted
技术标签:
【中文标题】如何使用新的 Android Multidex 支持库启用多索引【英文标题】:How to enable multidexing with the new Android Multidex support library 【发布时间】:2014-12-23 22:34:11 【问题描述】:我想使用新的 Multidex 支持库来打破我的一个应用程序的方法限制。
Google 在 android Lollipop 中引入了一个 multidex 支持库,可以轻松实现 multidex。
需要哪些步骤才能使用此库并构建我的应用程序以支持 multidex?
【问题讨论】:
multidex 支持第三方库到您的应用程序 【参考方案1】:编辑:
Android 5.0(API 级别 21)及更高版本使用支持多索引的 ART。因此,如果您的minSdkVersion
为21 或更高,则不需要multidex 支持库。
修改你的build.gradle
:
android
compileSdkVersion 22
buildToolsVersion "23.0.0"
defaultConfig
minSdkVersion 14 //lower than 14 doesn't support multidex
targetSdkVersion 22
// Enabling multidex support.
multiDexEnabled true
dependencies
implementation 'com.android.support:multidex:1.0.3'
如果您正在运行单元测试,则需要将其包含在您的 Application
类中:
public class YouApplication extends Application
@Override
protected void attachBaseContext(Context base)
super.attachBaseContext(base);
MultiDex.install(this);
或者只是让你的 application
类扩展 MultiDexApplication
public class Application extends MultiDexApplication
欲了解更多信息,请is a good guide.
【讨论】:
如果您正在使用新的构建工具,但这绝对是正确的选择。 @jem88 您已将 gradle 更新到 1.0?您应该使用 2.2.+(查看您的gradle-wrapper.properties
) 关键点:1您的 buildToolsVersion 需要为 21.1.1 或更高版本。 2 将 multiDexEnabled true
添加到 build.gradle 的 defaultConfig 中(注意没有 =
)3 添加 'com.android.support:multidex:1.0.0'
如果我们不使用应用类呢?在AndroidManifest.xml
中将android:name="android.support.multidex.MultiDexApplication"
添加到application
标记是否足够?
23年不需要编译'com.android.support:multidex:1.0.1'
@NaveedAhmad,根据谷歌开发者文档:..if your minSdkVersion is set to 20 or lower you must use...
'compile 'com.android.support:multidex:1.0.1'
。【参考方案2】:
启动multi dexing需要以下步骤:
将 android-support-multidex.jar 添加到您的项目中。 jar 可以在您的 Android SDK 文件夹 /sdk/extras/android/support/multidex/library/libs 中找到
现在您可以让您的应用程序类扩展 MultiDexApplication
public class MyApplication extends MultiDexApplication
或者你像这样覆盖 attachBaseContext:
protected void attachBaseContext(Context base)
super.attachBaseContext(base);
MultiDex.install(this);
我使用了覆盖方法,因为它不会弄乱您的应用程序类的类层次结构。
现在您的应用已准备好使用 multi dex。下一步是说服 gradle 构建一个多索引的 apk。构建工具团队正在努力使这更容易,但目前您需要将以下内容添加到应用程序 build.gradle 的 android 部分
dexOptions
preDexLibraries = false
以下是您的应用程序 build.gradle 的一般部分
afterEvaluate
tasks.matching
it.name.startsWith('dex')
.each dx ->
if (dx.additionalParameters == null)
dx.additionalParameters = ['--multi-dex']
else
dx.additionalParameters += '--multi-dex'
更多信息请访问Alex Lipovs blog。
【讨论】:
没有 gradle 怎么用这个? @Janusz 是否可以在没有 gradle 的情况下使用 multidex 选项? 我认为没有 gradle 是不可能的。 什么是 Eclipse Ant 修复,而不是 gradle? 我的项目没有创建 gradle 文件,我创建了一个并按照您的步骤操作,但它不适合我【参考方案3】:简单地说,为了启用 multidex,您需要...
android
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
...
dependencies
implementation 'com.android.support:multidex:1.0.0'
您还必须更改清单文件。在您的清单中,将 MultiDexApplication 类从 multidex 支持库添加到应用程序元素,如下所示
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
【讨论】:
这不会启用多索引。您仍然缺少应用程序类。 感谢您的评论,这适用于我的情况。这是我从developer.android.com/tools/building/multidex.html得到参考的链接 是的,你的权利。除非您正在运行测试,否则您似乎不需要在应用程序类中包含它。 我不明白。我的应用程序清单已经有一个名称标签。我不认为我会用android:name="android.support.multidex.MultiDexApplication
替换它。请指导我..
@mboy :不,MainActivity 和应用程序类是不同的。在此处了解有关应用程序类的更多信息:rominirani.com/android-application-class【参考方案4】:
这是截至 2020 年 10 月的最新方法,适用于 Android X。这来自 Android 的文档“Enable multidex for apps with over 64K methods”。
对于minSdk
>= 21
你不需要做任何事情。所有这些设备都使用原生支持 multidex 的 Android RunTime (ART) VM。
对于minSdk
在您的模块级build.gradle
中,确保填充以下配置:
android
defaultConfig
multiDexEnabled true
dependencies
implementation 'androidx.multidex:multidex:2.0.1'
您需要安装显式的 multidex 支持。文档包括three methods to do so,你必须选择一个。
例如,在您的src/main/AndroidManifest.xml
中,您可以将MultiDexApplication
声明为application:name
:
<manifest package="com.your.package"
xmlns:android="http://schemas.android.com/apk/res/android">
<application android:name="androidx.multidex.MultiDexApplication" />
</manifest>
【讨论】:
对于 minSdk >= 21 不需要 multidex - 这是真的,谢谢!【参考方案5】:在你的 build.gradle 添加这个依赖:
compile 'com.android.support:multidex:1.0.1'
再次在您的 build.gradle 文件中将此行添加到 defaultConfig 块:
multiDexEnabled true
不要从 Application 扩展您的应用程序类,而是从 MultiDexApplication 扩展它;喜欢:
public class AppConfig extends MultiDexApplication
现在你可以开始了!如果您需要,MultiDexApplication
所做的只是
public class MultiDexApplication extends Application
@Override
protected void attachBaseContext(Context base)
super.attachBaseContext(base);
MultiDex.install(this);
【讨论】:
【参考方案6】:build.gradle
multiDexEnabled true
implementation 'androidx.multidex:multidex:2.0.1'
AndroidManifest.xml
<application
android:name="androidx.multidex.MultiDexApplication"
【讨论】:
【参考方案7】:第 1 步:更改 build.grade
defaultConfig
...
// Enabling multidex support.
multiDexEnabled true
dependencies
...
compile 'com.android.support:multidex:1.0.0'
第 2 步:在应用程序类上设置
public class MyApplication extends Application
@Override
public void onCreate()
super.onCreate();
MultiDex.install(this);
第 3 步:更改grade.properties
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
它会工作的!谢谢。
【讨论】:
我收到“找不到 MultiDex 的符号”。以前有人遇到过这个问题吗?【参考方案8】:首先你应该尝试使用 Proguard(这会清除所有未使用的代码)
android
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
buildTypes
release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
【讨论】:
所以不需要MultiDexApplication
和androidx:multidex
?为什么其他答案提供了另外两个步骤?【参考方案9】:
添加到 AndroidManifest.xml:
android:name="android.support.multidex.MultiDexApplication"
或
MultiDex.install(this);
在您的自定义应用程序的 attachBaseContext 方法中
或您的自定义应用程序扩展 MultiDexApplication
在你的 build.gradle 中添加 multiDexEnabled = true
defaultConfig
multiDexEnabled true
dependencies
compile 'com.android.support:multidex:1.0.0'
【讨论】:
@Harsha 不建议使用它,但尝试将 largeHeap 添加到清单文件 android:largeHeap="true" android:allowBackup="true" 都添加了 将此添加到 gradle 文件中 >>>>>>>>> dexOptions javaMaxHeapSize "4g" 【参考方案10】:使用 androidx,经典支持库不再起作用。
简单的解决方案是使用以下代码
在您的build.gradle
文件中
android
...
...
defaultConfig
...
...
multiDexEnabled true
...
dependencies
...
...
implementation 'androidx.multidex:multidex:2.0.1'
在您的清单中,只需将 name 属性添加到应用程序标签
<manifest ...>
<application
android:name="androidx.multidex.MultiDexApplication"
...
...>
...
...
</application>
</manifest>
如果您的应用程序面向 API 21 或更高版本,则默认启用 multidex。
现在,如果您想摆脱在尝试支持 multidex 时遇到的许多问题 - 首先尝试通过设置 minifyEnabled true
来使用代码收缩。
【讨论】:
【参考方案11】:如果你想在你的项目中启用多 dex,那么就去 gradle.builder
并将其添加到您的依赖项中
dependencies
compile 'com.android.support:multidex:1.0.0'
那么你必须添加
defaultConfig
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
然后打开一个类并将其扩展为Application 如果您的应用使用扩展了 Application 类,您可以重写 oncrete() 方法并调用
MultiDex.install(this)
启用多重索引。
最后添加到您的清单中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
【讨论】:
什么是gradle.builder
?
你的 gradle 文件位于你的 android studio 项目中【参考方案12】:
以上所有答案都很棒
还要添加这个,否则你的应用会像我一样无缘无故崩溃
compileOptions
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
【讨论】:
【参考方案13】:只需在 build.gradle 中添加这个片段也可以正常工作
android
compileSdkVersion 22
buildToolsVersion "23.0.0"
defaultConfig
minSdkVersion 14 //lower than 14 doesn't support multidex
targetSdkVersion 22
**// Enabling multidex support.
**multiDexEnabled true****
【讨论】:
【参考方案14】:Multi_Dex.java
public class Multi_Dex extends Application
@Override
protected void attachBaseContext(Context base)
super.attachBaseContext(base);
MultiDex.install(this);
【讨论】:
以上是关于如何使用新的 Android Multidex 支持库启用多索引的主要内容,如果未能解决你的问题,请参考以下文章
在路径上找不到类“android.support.multidex.MultiDexApplication”:DexPathList
如何在没有 Gradle 的 Eclipse 中的 Android 项目上启用 multidex
如何安装android-support-multidex.jar
使用 Multidex 的 Android proguard