在Android Studio中,有一个特定的文件(src/org/luaj/vm2/lib/jse/JavaMethod.java),我需要从通过Gradle(dependencies {compile 'org.luaj:luaj-jse:3.0.1'})提取的包中覆盖该文件。

我将文件复制到具有完全相同路径的源目录中,并对其进行了更改。对于正在使用它的单个JUnit测试用例,这可以正常工作。看起来它正在为我的项目进行正常编译(此刻无法轻松确认)。

但是,当我尝试通过ProjectType =“Android Tests”的配置一次运行所有测试时,得到了Error:Error converting bytecode to dex:Cause: com.android.dex.DexException: Multiple dex files define Lorg/luaj/vm2/lib/jse/JavaMethod$Overload;

是否需要将特定任务或命令添加到我的Gradle文件中,以确保项目选择本地源目录中的文件?我尝试了Copy tasksourceSets->main->java->exclude命令,但似乎都不起作用(我可能做错了)。我还尝试了this post中“compile”下的“exclude module/group”指令。

运行/调试确认的非默认设置:

  • Type = Android测试
  • Module =我的模块
  • 测试:软件包
  • 中的所有
  • 软件包:“test”

  • 我所有的JUnit测试用例都在“测试”包中。

    任何使该方法起作用的答案都可以。如果不是Gradle,则可能是android list 或本地源文件本身中的东西。

    [2016-07-24编辑]
    当我的Android模拟器运行较低的API时,在正常的编译中也会发生该错误。 API 16和19出错,但API 23没有出错。

    最佳答案

    问题:链接您的应用程序时,链接器会找到两个版本

  • org.luaj:luaj-jse:3.0.1:org.luaj.vm2.lib.jse.JavaMethod和
  • {localProject}:org.luaj.vm2.lib.jse.JavaMethod

  • 如何解决:告诉gradle到,将从组织中排除org.luaj:luaj-jse:3.0.1:org.luaj.vm2.lib.jse.JavaMethod
    android {
        packagingOptions {
            exclude '**/JavaMethod.class'
        }
    }
    

    我没有使用“排除类”进行尝试,但是它可用于删除重复的gpl许可证文件,例如“复制”。

    如果此“排除”不起作用,您可以
  • 将lib org.luaj:luaj-jse:3.0.1下载到本地libs文件夹
  • 使用zip-app打开jar/aar,然后手动删除重复的类。
  • 从依赖项中删除org.luaj:luaj-jse:3.0.1,因为现在它是从lib文件夹
  • 加载的

    09-10 13:52