如何使用 ProGuard(或任何其他方式)隐藏库 Jar 中的公共类?

Posted

技术标签:

【中文标题】如何使用 ProGuard(或任何其他方式)隐藏库 Jar 中的公共类?【英文标题】:How to hide public classes in library Jar using ProGuard (or any other way)? 【发布时间】:2013-07-13 13:53:55 【问题描述】:

我想构建一个库,但我不希望将某些类暴露给开发人员,但我确实希望将它们暴露给我的库代码并轻松进行测试。

有没有办法使用 ProGuard 或任何其他方式(如 android SDK 中使用的@hide 表示法)隐藏特定的公共类?

【问题讨论】:

exposed to my code 你的意思是你的代码在你的库中,还是在其他地方? 暴露于我库中的代码 那他们为什么是public?您的库是否如此复杂以至于需要多个软件包?或者他们是public,因为超类/接口需要它? 超类需要一些,我还需要一种方法在我的测试中实例化它们。 @hide 注释有效,因为编译时 JAR(构建路径中的 android.jar)与运行时 JAR 不同。您只有一个 JAR,因此不可能使用@hide 风格的技巧。 “我还需要一种在我的测试中实例化它们的方法”——将您的仪器测试与类本身放在同一个包中,此时它们可以使用包私有类和方法。 【参考方案1】:

混淆的全部意义在于它为外面的人隐藏了方法,但库内的引用被更新了。通常,您将拥有一个

void myMethodWithAVeryExplicitName() 
    // Do Stuff


void otherMethod() 
    // Call the first method
    myMethodWithAVeryExplicitName();

它将被混淆为:

void a() 
    // Do Stuff


void b() 
    // Call the first method
    a();

那么 Proguard 有很多选项用于混淆或保留公共类、扩展特定类的类、成员......

【讨论】:

【参考方案2】:

也许门面 (http://en.wikipedia.org/wiki/Facade_pattern) 会有所帮助。此模式的目的与您的问题相似。它提供了一个简化的外部世界,同时将所有的花里胡哨的东西保留在图书馆内。

【讨论】:

以上是关于如何使用 ProGuard(或任何其他方式)隐藏库 Jar 中的公共类?的主要内容,如果未能解决你的问题,请参考以下文章

带有 proguard 的 Kotlin AAR 库:如何只保留类和方法名?

使用 Android 库项目设置 ProGuard

如何使用 Proguard 缩小 Flutter 应用程序?

iOS 应用可以访问设备视频库中视频的字幕或隐藏式字幕吗?

如何使用 proguard 混淆 android 库(.aar)?

在 React 中显示或隐藏元素