【问题标题】:Android Studio: How to compile with customized class but still use module dependencyAndroid Studio:如何使用自定义类进行编译但仍使用模块依赖项
【发布时间】:2017-05-09 23:30:43
【问题描述】:

假设一个 Android 应用使用了一个 jar 库,并且当该库被指定为依赖项时一切正常:

dependencies {
    ...
    ...
    compile 'org.example:example:1.1.1'
    ...
}

但是:org.example 代码中的类之一需要调整。

一种方法是获取源代码并将所有源代码放在java 文件夹中,然后删除模块。进行调整后,将编译整个库。

另一种方法是在.jar 文件中进行调整、编译和替换.class 文件。

这两种方法都有其缺点。

我的问题是:有没有更简单的方法来调整库中的代码?

当我尝试创建包,将需要更改的类放入 java 文件夹时,出现错误:

将字节码转换为 dex 时出错: 原因:com.android.dex.DexException: 多个dex文件定义Lorg/example/ClassNeedingChange;

我只是想知道是否有一个技巧可以在 Java 文件夹中获取代码以覆盖库 jar 文件中的内容。

附加信息:

虽然上面没有具体说明,但需要调整的类被埋在库中,并被库的代码引用;我不直接调用它。对于需要调整的类是我的代码(并且只有我的代码)直接调用的类的简单情况,那么使用 Java 构造扩展类将是一件简单的事情。但是对于这个简单的案例,我不需要发布这个问题。

【问题讨论】:

  • “我只是想知道是否有一个技巧可以在 Java 文件夹中获取代码以覆盖库 jar 文件中的内容。” -- 从 JAR 文件中删除类。虽然,恕我直言,唯一可维护的选项是子类路由或分叉库(“获取源代码......”),尽管我会将它放在项目的单独模块中,而不是将其直接放在项目本身中.
  • 这样做会让未来的维护变得头疼。如果图书馆发生变化怎么办?你必须更新这个。您也可以在 gradle 中本地编译它,并告诉 gradle 查找本地版本,但这仍然会产生相同的维护问题
  • 针对库创建一个 PR 以使其具有您想要的行为?然后每个人都会受益。
  • 什么是“公关”?我想你的意思是要求程序的所有者进行更改?这可能是一种可能性,但需要花费大量时间和精力。
  • PR-拉取请求。进行更改,并将其提交到公共 repo(假设它是开源的)并要求他们将其拉入

标签: java android compilation shared-libraries patch


【解决方案1】:

在您的代码中扩展需要调整的类,并覆盖适当的方法。

Class A extends TweakMe {

 @Override
 public void someTweakedMethod() {
     //Do stuff
  }
}

【讨论】:

  • 如果类是 final 或方法是私有的,那将不起作用。
  • 如果从库的其他各个部分使用需要调整的类,它也将不起作用;那些其他用途不会知道“A”,并会使用“TweakMe”的默认功能。
猜你喜欢
  • 1970-01-01
  • 2017-09-09
  • 2011-10-25
  • 1970-01-01
  • 2017-08-12
  • 2021-03-13
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多