【发布时间】: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