我想使用新的 Multidex 支持库来打破我的一个应用程序的方法限制。
借助 Android Lollipop,Google 引入了一个 multidex 支持库,可以轻松实现 multidex。
需要哪些步骤才能使用这个库并构建我的具有 multidex 支持的应用程序?
我想使用新的 Multidex 支持库来打破我的一个应用程序的方法限制。
借助 Android Lollipop,Google 引入了一个 multidex 支持库,可以轻松实现 multidex。
需要哪些步骤才能使用这个库并构建我的具有 multidex 支持的应用程序?
编辑:
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 {
}
有关更多信息,这是一个很好的指南。
启动多 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 博客上找到。
简单地说,为了启用 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>
这是截至 2020 年 10 月使用 Android X 的最新方法。这来自 Android 的文档“为具有超过 64K 方法的应用启用 multidex ”。
minSdk
>= 21你不需要做任何事情。所有这些设备都使用原生支持 multidex 的 Android RunTime (ART) VM。
minSdk
< 21在您的模块级别build.gradle
中,确保填充以下配置:
android {
defaultConfig {
multiDexEnabled true
}
}
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
}
您需要安装显式的 multidex 支持。该文档包括三种方法,您必须选择一种。
例如,在您的 中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>
在你的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);
}
}
构建.gradle
multiDexEnabled true
implementation 'androidx.multidex:multidex:2.0.1'
AndroidManifest.xml
<application
android:name="androidx.multidex.MultiDexApplication"
第 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
它会工作的!谢谢。
首先,您应该尝试使用 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'
}
}
}
添加到 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'
}
}
使用 androidx,经典的支持库不再起作用。
简单的解决方案是使用以下代码
在你的build.gradle
文件中
android{
...
...
defaultConfig {
...
...
multiDexEnabled true
}
...
}
dependencies {
...
...
implementation 'androidx.multidex:multidex:2.0.1'
}
在您的清单中,只需将 name 属性添加到 application 标签
<manifest ...>
<application
android:name="androidx.multidex.MultiDexApplication"
...
...>
...
...
</application>
</manifest>
如果您的应用程序面向 API 21 或更高版本,则默认启用 multidex。
现在,如果您想摆脱在尝试支持 multidex 时遇到的许多问题 - 首先尝试通过设置来使用代码收缩minifyEnabled true
。
如果你想在你的项目中启用多 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>
以上所有答案都很棒
还要添加这个,否则你的应用程序会像我的一样崩溃,没有任何理由
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
只需在 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****
}
}
Multi_Dex.java
public class Multi_Dex extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}