安卓支持多dex库的实现方式

16

由于我的应用程序使用了许多jar包(Drive API、GreenDAO、Text to PDF、Support等),我已经达到了神奇的Dex极限。

我的当前解决方案是,我实际上创建了一个专门用于Google Drive的第二个APK文件,然后从主APK文件中调用它。但现在我发现Android终于通过这个库支持了它。我的问题只是我不知道如何实现它(最好不要使用Gradle)。我找不到任何好的教程。

我正在尝试实现这个东西,但是我都快疯了...我找到了这个

然后我添加了:

 android:name="android.support.multidex.MultiDexApplication"

我的清单文件和

protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
}

进入我的mainactivity.java文件

同时安装了Eclipse的Gradle插件,导出Gradle获取build.gradle文件,然后将其更改为:

apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':android-support-v7-appcompat')
    compile project(':Sync')
    compile project(':gdrive:google-play-services_lib')
}


android {
    compileSdkVersion 14
    buildToolsVersion "21.1.1"


    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src-gen','src']
            resources.srcDirs = ['src-gen','src']
            aidl.srcDirs = ['src-gen','src']
            renderscript.srcDirs = ['src-gen','src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    dexOptions {
      preDexLibraries = false
   }
}

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

但错误仍然是相同的 :(

4个回答

19

博客是旧的解决方案。

使用Android Studio 0.9.2和Gradle插件0.14.1,您只需要:

  1. 将以下内容添加到AndroidManifest.xml中:

android:name="android.support.multidex.MultiDexApplication" 
或者
添加
MultiDex.install(this);

在您自定义应用程序的attachBaseContext方法中

或者您自定义的应用程序扩展了MultiDexApplication

  1. 在您的build.gradle文件中添加multiDexEnabled = true

.

android {
    defaultConfig {
        ...
        multiDexEnabled = true
    }
}

完成了。

抱歉我的英语不好。

相关资源:

http://developer.android.com/tools/building/multidex.html

https://plus.google.com/+XavierDucrohet/posts/1FnzwdcBnyC


我能在Eclipse而不是Android Studio中做这个吗? - Tadej Vengust
2
目前来看,Eclipse的ADT插件已经不再处于活跃开发状态。 - darktiny

16
需要做几件事情:
1. 在您的gradle中,您需要指定multidex并添加支持库:
android {
    defaultConfig {
        ...
        multiDexEnabled true
        ...
    }
}

dependencies {
  ...
  compile 'com.android.support:multidex:1.0.0'
  ...
}

2- 在您的清单文件中,您需要将您的应用程序设置为一个多 dex 应用程序:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.package.name">
    <application
        ...
        android:name="com.package.name.my_application">
        ...
    </application>
</manifest>

3.1- 在您的应用程序类中,您必须要么扩展MultiDexApplication
public class my_application extends MultiDexApplication
{
    ...
}

3.2- 或覆盖 attachBaseContext() 方法:
public class my_application extends Application
{
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

多 dex 支持库的限制
多 dex 支持库有一些已知的限制,当你将其纳入应用程序构建配置时,你应该意识到并进行测试:
- 在启动过程中将 .dex 文件安装到设备的数据分区是复杂的,如果次要 dex 文件很大,则可能导致应用程序无响应 (ANR) 错误。在这种情况下,你应该使用 ProGuard 进行代码缩小以最小化 dex 文件的大小并删除未使用的代码部分。 - 使用 multidex 的应用程序可能无法在运行 Android 4.0(API 级别 14)之前版本的平台的设备上启动,因为存在 Dalvik linearAlloc bug (Issue 22586)。如果你的目标 API 级别低于 14,请确保在这些平台版本上进行测试,因为你的应用程序在启动或加载特定组的类时可能会出现问题。代码缩小可以减少或可能消除这些潜在问题。 - 使用多 dex 配置的应用程序可能在运行时崩溃,因为 Dalvik linearAlloc 限制 (Issue 78035),如果它们做出非常大的内存分配请求。在 Android 4.0(API 级别 14)中增加了分配限制,但在 Android 5.0(API 级别 21)之前的 Android 版本中仍然可能遇到此限制。 - 在 Dalvik 运行时执行时,主 dex 文件需要哪些类存在复杂的要求。Android 构建工具更新处理了 Android 的要求,但是其他包含的库可能有额外的依赖性要求,包括使用内省或从本地代码调用 Java 方法。在多 dex 构建工具更新以允许你指定必须包含在主 dex 文件中的类之前,可能无法使用某些库。
资源:http://developer.android.com/tools/building/multidex.html

这个可以在Eclipse中完成还是只能在Android Studio中完成? - Tadej Vengust
Google已停止支持Eclipse ADT。因此,使用Eclipse也是可能的,但Android Studio是未来的发展方向。我强烈建议将您的项目导出到Android Studio:https://developer.android.com/sdk/installing/migrate.html - string.Empty
3
步骤1:下载安装Android Studio。 步骤2:在Android Studio中使用相同的包名创建一个新项目。 步骤3:将Eclipse项目文件夹中的所有类和资源复制到Android Studio中。 步骤4:点击运行按钮。 - string.Empty
在这里(https://developer.android.com/intl/ja/tools/support-library/features.html#multidex),它说您应该将multidex库添加到gradle中。它没有说您应该添加Multidex.install(this),如Nicolas所示。如果Android开发文档能够添加这些信息,那将会非常有帮助 :-) 感谢Nicolas指出这一点。 - Christine
Eclipse不是集成开发环境,它只是文本编辑器。当我放弃65K ID时,我从Eclipse迁移到了Android Studio。不要浪费时间,只需迁移即可。 - Adnan Abdollah Zaki
显示剩余3条评论

2

更新:

如果您正在使用AndroidX,您可以使用以下代码:

implementation 'androidx.multidex:multidex:2.0.1'

参考所有Google Maven,您可以在其中搜索Google的工件:
https://maven.google.com/web/index.html


2
根据https://developer.android.com/studio/build/multidex.html#avoid上的文档:

如果您的minSdkVersion是21及以上,您所需要做的就是:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

如果你的minSdkVersion是20或以下,你需要使用support库。
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

伴随着

<?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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接