隐藏库的类 - 安卓

2022-09-02 10:46:58

我有3个项目,在第4个(主项目)中用作库。

这3个项目相互兼容,如下所示(build.gradle):

图书馆项目:

  • 项目 A

    compile project(":projectA")
    compile project(":projectB")
    
  • 项目 B

    compile project(':projectC')
    

主要项目:

compile(name: 'projectA', ext: 'aar')
compile(name: 'projectB', ext: 'aar')
compile(name: 'projectC', ext: 'aar')

我想对“库项目”做一些事情,这样在主项目中,如果我从库项目内单击任何类,我应该无法看到代码,或者它应该被加密。

例如,如果 ProjectA 中有,并且主项目的主要活动实现了该接口,则如果我“Ctrl-Click”进入该接口,则结果应类似于我上面指定的内容。InterfaceA

我知道Proguard做了类似的事情,但只有当你正在构建一个发布.apk,我需要编译的库相同的结果。


答案 1

许多项目使用 ProGuard 来实现此保护。

但是,存在一些限制:

  • ProGuard 的主要用途是从字节码中删除尽可能多的调试信息、行号和名称,而不改变字节码的实际功能。它替换成员和参数的名称,例如,用无意义的类替换非公共类,例如可能成为。正如任何代码维护者都会提到的那样,错误的成员和变量名称使维护变得非常困难。vehicleLicensePlate_a
  • ProGuard 可以通过尽可能多地优化(计算定义为表达式的常量、尝试内联等)来(略微)修改字节码。此处列出了优化措施:http://proguard.sourceforge.net/FAQ.html#optimization)
  • ProGuard 不加密字节码 - JVM 需要查看实际的字节码,否则无法运行该程序。

因此,混淆只会使逆向工程和理解库变得更加困难,它不能使这项任务成为不可能。

最后一个指针:ProGuard 转储一个文件,其中包含已更改内容的列表,尤其是行号。当您从客户那里获得堆栈跟踪时(或通过Crashlytics等在线工具),您可以恢复混淆,以便进行调试。在任何发布-生成过程中,都需要找到保存此文件的方法。

当您对库进行增量发布时,也需要此文件,以便模糊处理与以前发布的版本一致。否则,客户将无法直接替换你的库,并且必须对其应用进行完整的重建(和链接)。

虽然ProGuard是一个免费且简单的选项,可以正常工作,但还有其他免费和付费的混淆器。有些还提供了更多功能,但它们基本上是相同的,并且 ProGuard 与 IDE、工具和服务的兼容性非常好。


答案 2

您可以将所有不希望公开的方法设置为默认值,以便不能在原始项目之外使用它们。此外,还应将库与应用项目分开,编译它们,并将它们用作外部依赖项。如果您不希望发布库的源代码,请不要将其添加到编译选项中。如果您需要使用您的库以外的其他人,请使用bintray发布它,或者只是将编译的aar/jar文件添加到应用程序项目中。

以下是整个过程的指南:https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

或者,您可以使用maven构建库项目(我发现它比使用gradle容易得多),请在此处查看示例:https://github.com/simpligility/android-maven-plugin/tree/master/src/test/projects/libraryprojects

和一个具体项目:https://github.com/fcopardo/BaseViews-Android


推荐