Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android多索引项目设置_Java_Android_Classloader - Fatal编程技术网

Java Android多索引项目设置

Java Android多索引项目设置,java,android,classloader,Java,Android,Classloader,我正在通过以下帖子创建一个多索引项目设置: 一切都进行得很成功,接下来,我想将secondary dex分离到一个库项目中 UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Lcom/example/dex/Library Interface; at com.android.dx.merge.DexMerger.readSortableTypes(DexM

我正在通过以下帖子创建一个多索引项目设置:

一切都进行得很成功,接下来,我想将secondary dex分离到一个库项目中

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)
  • 主要项目内容:

    com.example.dex*

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

    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)
    

    两个项目都需要参考图书馆界面,有没有办法分享这个课程?谢谢

    Android开发中的多索引问题

    TimesNow安卓应用程序是安卓系统中功能最丰富的应用程序之一

    推送通知、新闻提要、录制视频和上传、与谷歌(Plus)、推特(Twitter)和Facebook链接,以及《纽约时报新闻小时》(Times Now Newshour)的嵌入式版本(其本身就是一个完整的应用程序)等功能都能实时协同工作,代码的复杂性和数量带来了技术挑战,即使有,也很少有,其他Android开发人员面临的问题——尤其是在旧版本的平台上

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

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

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

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

    然而,我们不可能以这种方式拆分我们的应用程序——我们有太多的类是通过Android框架和不同的SDK直接访问的

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

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

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

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

    按照我们的代码,发布应用程序TimesNow 1.0.0版并不容易

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

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

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

    我们构建了代码并在设备上运行,它成功地运行了,这给了我们一个微笑和自信,我们处理了一个很大的问题,这是许多开发人员至今还没有处理过的

    因此,如果您愿意面对这个问题,我们将提供一些提示/说明来处理这个问题

  • 在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
    
  • 编辑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()
    }
    
    ........
    }
    
    public class MyApp extends MultiDexApplication {
    ....
    ....
    }
    
  • 编辑应用程序类并添加以下蓝色粗体线

    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()
    }
    
    ........
    }
    
    public class MyApp extends MultiDexApplication {
    ....
    ....
    }
    
    现在你已经解决了这个问题。 请参阅此处的开发人员网站,了解有关此问题的更多信息以及如何处理此问题


  • 是否忘记从主项目中删除库接口定义?