Android多dex项目设置

时间:2014-05-22 03:15:30

标签: java android classloader

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

一切都顺利进行,接下来,我想将二级dex分成一个图书馆项目。

  1. 主要项目内容:

    com.example.dex。*

  2. 二级(库)项目内容:

    com.example.dex.lib。*

  3. 但是,我无法共享主项目和图书馆项目所需的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,有没有办法分享这个类?谢谢!

1 个答案:

答案 0 :(得分:0)

Android开发中的Multidex问题

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

借助推送通知,新闻Feed,录制视频和上传,与Google(Plus),Twitter和Facebook的链接以及Times Now Newshour(本身就是一个完整的应用程序)的嵌入式版本,所有这些都在实际中协同工作时间,代码的复杂性和数量创造了技术挑战,其他Android开发人员面临的技术挑战很少 - 特别是在平台的旧版本上。

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

此应用程序导致Java方法的数量急剧增加。

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

经过一番恐慌后,我们意识到我们可以通过使用此处描述的技术将应用程序分解为多个dex文件来解决此问题,该技术侧重于使用辅助dex文件来扩展模块,而不是应用程序的核心部分

但是,我们无法通过这种方式破解我们的应用程序 - 我们的许多类都可以通过Android框架和不同的SDK直接访问。

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

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

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

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

与我们的代码一致,发布我们的App TimesNow版本1.0.0并不容易。

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

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

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

我们构建了代码并在设备上运行它,它运行成功,这让我们脸上露出了笑容并且自信,我们处理了一个大问题,直到现在还没有被许多开发人员处理。

所以,如果您将面对这个问题,我们将提供处理此问题的提示/说明。

  1. 在src和libs级别的项目的app模块中创建一个文本文件(名称为multidex.keep)。 将这些代码行复制并粘贴到此创建的文本文件中
  2. ![在此处输入图片说明] [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. 编辑您的Application类并添加以下蓝色粗线

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

      现在你已经完成了这个问题。 请参阅此处的开发者网站,以了解有关此问题并进行处理的更多信息。