带有 applymapping 的混淆器会产生重复的名称

proguard with applymapping produces duplicate names

我正在编写一个 android 模块,该模块作为插件加载到第 3 方应用程序中。 API 由 .jar 提供,它已被混淆并包含一个 mapping.txt 文件。

在我的 proguard 配置中我有:

-dontskipnonpubliclibraryclasses
-dontshrink
-dontoptimize

-applymapping "mapping.txt"

...

问题是,仅在我的模块中使用的 class 被映射到与库 .jar 中使用的 class 相同的名称(但我不使用).当它们在运行时加载时,这会导致 IncompatibleClassChangeError.

我可以清楚地看到生成的映射文件中的重复项:

mine:
timber.log.Timber -> b.a.a:

jars:
gnu.nmea.ContainsPosition -> b.a.a:

有什么方法可以让混淆器重用混淆名称?

你应该使用规则

-repackageclasses <packagename>

在您的 Android 模块中。 这会将所有混淆的 类 移动到这个(唯一的)包中,避免名称冲突。

示例:您的模块名为 com.foo.mymodule,那么您将添加

 -repackageclasses com.foo.mymodule.internal

所有混淆的 类 都将在那里结束。