如何混淆两个不同的 .aar 的包名称而不发生重复 class 冲突?
How can I obfuscate the package names for two different `.aar` without having duplicate class collision?
假设我有 3 个子项目(模块):
:libraryA
:libraryB
:app
:app
取决于 :libraryA
和 :libraryB
。在我的图书馆中,我有:
// libraryA
com.example.libraryA.Class1
// libraryB
com.example.libraryB.Class2
当我 运行 R8 (like proguard) 在这两个库上时,它们生成以下 类:
// libraryA - Class1
a.a.a.a
// libraryB - Class2
a.a.a.a
(note that 2 different classes end up having the same signature)
当我构建一个使用 :libraryA
和 :libraryB
的混淆 .aar
的 :app
变体时,我遇到以下构建失败:
Caused by: com.android.tools.r8.utils.b: Type a.a.a.a is defined multiple times:
一种解决方案是在我的库混淆规则中使用 -keeppackagenames
-keeppackagenames com.example.**
但我实际上想混淆包名。我在这里有什么选择?
是否可以在唯一但确定的基础上混淆包名称?例如,我希望发生以下情况:
com.example.libraryA
-> a.a.a
com.example.libraryB
-> a.a.b
这将避免任何潜在的冲突。这样的事情可以实现吗?
当您使用 R8 打包库进行分发时,您必须使用 -keeppackagenames
,否则库的消费者可能会得到重复的 类。
有选项 -flattenpackagehierarchy
和 -repackageclasses
来控制未保留 类 的去向。对于 R8 库本身 we use both.
但是,当您构建使用库的最终应用程序时,包括库在内的所有应用程序都将作为一个整体进行混淆处理,因此在用作依赖项时不必对库进行混淆处理。
假设我有 3 个子项目(模块):
:libraryA
:libraryB
:app
:app
取决于 :libraryA
和 :libraryB
。在我的图书馆中,我有:
// libraryA
com.example.libraryA.Class1
// libraryB
com.example.libraryB.Class2
当我 运行 R8 (like proguard) 在这两个库上时,它们生成以下 类:
// libraryA - Class1
a.a.a.a
// libraryB - Class2
a.a.a.a
(note that 2 different classes end up having the same signature)
当我构建一个使用 :libraryA
和 :libraryB
的混淆 .aar
的 :app
变体时,我遇到以下构建失败:
Caused by: com.android.tools.r8.utils.b: Type a.a.a.a is defined multiple times:
一种解决方案是在我的库混淆规则中使用 -keeppackagenames
-keeppackagenames com.example.**
但我实际上想混淆包名。我在这里有什么选择?
是否可以在唯一但确定的基础上混淆包名称?例如,我希望发生以下情况:
com.example.libraryA
->a.a.a
com.example.libraryB
->a.a.b
这将避免任何潜在的冲突。这样的事情可以实现吗?
当您使用 R8 打包库进行分发时,您必须使用 -keeppackagenames
,否则库的消费者可能会得到重复的 类。
有选项 -flattenpackagehierarchy
和 -repackageclasses
来控制未保留 类 的去向。对于 R8 库本身 we use both.
但是,当您构建使用库的最终应用程序时,包括库在内的所有应用程序都将作为一个整体进行混淆处理,因此在用作依赖项时不必对库进行混淆处理。