隐藏类库 – Android

我有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') 

我想对“图书馆工程”做些什么,所以从主项目内部,如果我点击图书馆工程中的任何一个类,我都不应该看到代码,或者应该encryption。

例如,如果ProjectA中有InterfaceA ,并且主项目的主要活动实现了该接口,如果我在界面中“Ctrl-Click”,结果应该与上面指定的相似。

我知道Proguard做了类似的事情,但只有在构build发行版.apk时,我需要为编译的库创build相同的结果。

Solutions Collecting From Web of "隐藏类库 – Android"

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

  • 您可以使用Gradle为Android构build库组件
  • 像应用程序一样,库可以构build在开发或发布构buildtypes中
  • Proguard可以configuration为在组件(应用程序或库)上运行,但只能在发布构buildtypes中运行。 请参阅此处: https : //sites.google.com/a/android.com/tools/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard
  • 如果组件被缩小(高度build议),那么你需要告诉Progaurd什么是“根”类,否则它会将库缩小到几乎没有。 这可以通过向configuration文件添加规则来实现:

     -keep class your.package.name {public *;} 

    更广泛的例子是: http : //proguard.sourceforge.net/manual/examples.html#library

但是有一些限制:

  • ProGuard的主要用途是从字节码中删除尽可能多的debugging信息,行号和名称,而不改变字节码的实际function。 它取代了成员和参数的名称,非公开的类别,例如vehicleLicensePlate可能变成_a 。 正如任何代码维护者将会涉及的那样,糟糕的成员和variables名称使得维护非常困难。
  • ProGuard可以通过尽可能优化(稍微)修改字节码(计算常量定义为expression式,内联等等。优化在这里列出: http : //proguard.sourceforge.net/FAQ.html#optimization )
  • ProGuard不encryption字节码–JVM需要查看实际的字节码,否则无法运行程序。

所以混淆只会使得逆向工程和理解一个图书馆变得更加困难,它不能使这个任务变得不可能。

最后一个指针:ProGuard转储一个文件,其中包含已更改内容的列表,特别是行号。 当您从客户那里获得堆栈追踪(或通过Crashlytics等在线工具)时,您可以恢复混淆,以便进行debugging。 在任何发布 – 构build过程中,您都需要find一种方法来保存这个文件。

当您创build库的增量版本时,也需要该文件,以便混淆与之前发布的版本保持一致。 如果你不这样做,客户不能直接replace你的库,而必须完成他们的应用程序的重build(和链接)。

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

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

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

或者,你可以使用maven构build库项目(我发现它比使用gradle更容易),看看这里的例子: https : //github.com/simpligility/android-maven-plugin/tree/master/src /testing/项目/ libraryprojects

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

2个步骤:

  1. 添加你的库到本地maven回购

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

你不能这样做。 一个编译的库具有.class文件(字节码),可以使用各种解编译器(如JD-GUI等)进行反编译和查看.Android Studio具有内置的反编译器,可以让用户更轻松地进行控制点击并查看.class文件。 你有最好的select是混淆你的代码。 这里有一些你可以使用的混淆器。 但是请记住,逆向工程是不可能的 。 一切都是可以破解的。