gpt4 book ai didi

java - Android 多 dex 项目设置

转载 作者:行者123 更新时间:2023-11-29 08:48:46 24 4
gpt4 key购买 nike

我正在按照以下帖子创建多 dex 项目设置:http://android-developers.blogspot.fr/2011/07/custom-class-loading-in-dalvik.html

一切顺利,接下来,我想将二级dex独立成一个library project。

  1. 主要项目内容:

    com.example.dex.*

  2. 二级(图书馆)项目内容:

    com.example.dex.lib.*

但是,我无法共享主要项目和图书馆项目都需要的 com.example.dex.LibraryInterface。

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/example/dex/Library
Interface;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:43)

两个项目都需要引用LibraryInterface,有什么办法可以共享这个类吗?谢谢!

最佳答案

Android 开发中的 Multidex 问题

Times Now Android 应用程序是适用于 Android 的功能最丰富的应用程序之一。

具有推送通知、新闻提要、录制视频和上传、与 Google(Plus)、Twitter 和 Facebook 链接以及嵌入式版本的 Times Now Newshour(本身就是一个完整的应用程序)等功能,所有这些功能都可以实时协同工作-随着时间的推移,代码的复杂性和数量带来了其他 Android 开发者很少(如果有的话)面临的技术挑战,尤其是在平台的旧版本上。

其中一个挑战与 Android 的运行时引擎 Dalvik 虚拟机处理 Java 方法的方式有关。

此 App 导致 Java 方法的数量急剧增加。

在我们进行测试时,我们遇到了一个与超过 65k 方法相关的错误(方法太多问题)。

在有点 panic 之后,我们意识到我们可以通过使用这里描述的技术将我们的应用程序分成多个 dex 文件来解决这个问题,该技术着重于将辅助 dex 文件用于扩展模块,而不是应用程序的核心部分.

但是,我们无法以这种方式分解我们的应用程序——Android 框架和不同的 SDK 直接访问我们的太多类。

这通常是不可能的,但我们检查了 Android 源代码并使用 Java 反射直接修改了它的一些内部结构。

我们当然很高兴和感激 Android 是开源的——否则,这种改变是不可能的。

我们尝试了各种技术来回收空间,包括积极使用 ProGuard/MinifyEnabled 和源代码转换以减少我们的方法数量。

我们尝试的任何方法都没有产生重大影响,我们仍然需要编写更多方法来支持我们新的和改进的新闻提要和时间线中的所有丰富内容类型。

根据我们的代码,发布我们的 App TimesNow 1.0.0 版并不容易。

看来我们必须在从应用程序中删除重要功能之间做出选择。

似乎没有什么可以接受的。我们需要更好的解决方案。

然后我们决定在我们的 APK 中有多个 dex 文件,我们尝试了很多解决方案,但没有获得成功。经过大量工作,我们终于找到了解决方案..

我们构建代码并在设备上运行它,它成功运行,这让我们脸上露出笑容,并自信我们解决了一个迄今为止许多开发人员都没有处理过的大问题。

因此,如果您将要面对此问题,我们在此提供处理此问题的提示/说明。

  1. 在 src 和 libs 级别的项目的应用程序模块中创建一个文本文件(名称为 multidex.keep)。将这些代码行复制并粘贴到您创建的文本文件中

![在此处输入图片描述][1]

android/support/multidex/BuildConfig/class
android/support/multidex/MultiDex$V14/class
android/support/multidex/MultiDex$V19/class
android/support/multidex/MultiDex$V4/class
android/support/multidex/MultiDex/class
android/support/multidex/MultiDexApplication/class
android/support/multidex/MultiDexExtractor$1/class
android/support/multidex/MultiDexExtractor/class
android/support/multidex/ZipUtil$CentralDirectory/class
android/support/multidex/ZipUtil/class
  1. 编辑您的 build.gradle 文件并添加以下蓝色粗体行

    android {
    minSdkVersion 16
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
    applicationId "your.package.name"
    .......... }

    buildTypes {
    release {
    .............................
    }
    }
    // Inside android part of build.gradle
    dexOptions {
    preDexLibraries = false
    }
    }
    dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    ..................
    // Inside dependencies part of build.gradle compile 'com.android.support:multidex:1.0.1'
    ..............
    }


    // Outside android part of build.gradle
    afterEvaluate {
    tasks.matching {
    it.name.startsWith('dex')
    }.each { dx ->
    if (dx.additionalParameters == null) {
    dx.additionalParameters = []
    }
    dx.additionalParameters += '--multi-dex'
    dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
    }

    ........
    }
  2. 编辑您的应用程序类并添加以下蓝色粗线

    public class MyApp extends MultiDexApplication {
    ....
    ....
    }

    现在你已经解决了这个问题。请在此处参阅开发者网站以阅读有关此问题和处理方法的更多信息。

关于java - Android 多 dex 项目设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23797255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com