隐藏图书馆类 - Android

时间:2016-08-29 06:19:56

标签: java android

我有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中有InterfaceA,并且主项目的主要活动实现了该界面,如果我" Ctrl-Click"进入界面,结果应该类似于我上面指定的。

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

4 个答案:

答案 0 :(得分:7)

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

但是有一些限制:

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

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

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

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

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

答案 1 :(得分:2)

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

以下是整个过程的指南: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

答案 2 :(得分:1)

2个步骤:

  1. 将您的库添加到本地maven仓库

  2. 使用maven依赖而不是项目依赖。

答案 3 :(得分:0)

你做不到。已编译的库具有.class文件(字节码),可以使用各种反编译器(如JD-GUI等)对其进行反编译和查看.Android Studio具有内置的反编译器,使得人们更容易进行ctrl - 单击并查看.class文件。您拥有的最佳选择是对代码进行模糊处理。 Here 是您可以使用的一些混淆器。但请始终牢记,对某些事情进行逆向工程永远不可能。一切都是可以破解的。