隐藏库类 - Android

Tej*_*jjD 18 java android

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

这三个项目相互编译如下(build.gradle):

图书馆项目:

主要项目:

compile(name: 'projectA', ext: 'aar')
compile(name: 'projectB', ext: 'aar')
compile(name: 'projectC', ext: 'aar')
Run Code Online (Sandbox Code Playgroud)

我想对"图书馆计划"做点什么,所以在主项目中,如果我点击图书馆项目中的任何一个类,我应该要么看不到代码,要么加密.

因此,例如,如果InterfaceA在ProjectA中,并且主项目的主要活动实现了该接口,如果我"按住Ctrl键单击"到界面中,结果应该类似于我上面指定的.

我理解Proguard做了类似的事情,但只有在你构建一个版本.apk时,我需要为编译库提供相同的结果.

And*_*ock 8

许多项目使用ProGuard来实现这种保护.

但是有一些限制:

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

因此,混淆只会使反向工程和理解库变得更加困难,它无法使这项任务变得不可能.

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

在创建库的增量版本时也需要此文件,以使模糊处理与先前发布的版本一致.如果不这样做,客户就无法直接替换您的库,并且必须对其应用程序进行完整的重建(和链接).

虽然ProGuard是一个免费的n-easy选项,但它还有其他免费和付费的混淆器.有些提供了更多功能,但它们基本相同,ProGuard与IDE,工具和服务的兼容性非常好.

  • 你根本做不到.字节码是机器可读的,否则你将无法使用lib,如果它是可读的,适当的反编译器可以恢复实现细节.即使没有反编译器,任何人都可以看到JVM指令.TL; DR:**没有办法保护你的实现**除了混淆代码使得花费太多时间来完成它,所以人们放弃了. (2认同)