我有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时,我需要为编译库提供相同的结果。
答案 0 :(得分:7)
许多项目使用ProGuard来实现这种保护。
如果组件被缩小(强烈建议),那么你需要告诉Progaurd“root”类是什么,否则它会将库缩小到几乎没有。这可以通过在配置文件中添加规则来实现:
-keep class your.package.name {public *;}
这里有一个更广泛的例子:http://proguard.sourceforge.net/manual/examples.html#library
但是有一些限制:
vehicleLicensePlate
可能变为_a
。正如任何代码维护者所关联的那样,坏成员和变量名称使维护变得非常困难。因此,混淆只会使反向工程和理解库变得更加困难,它无法使这项任务变得不可能。
最后一个指针: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
答案 2 :(得分:1)
2个步骤:
将您的库添加到本地maven仓库
使用maven依赖而不是项目依赖。
答案 3 :(得分:0)
你做不到。已编译的库具有.class文件(字节码),可以使用各种反编译器(如JD-GUI等)对其进行反编译和查看.Android Studio具有内置的反编译器,使得人们更容易进行ctrl - 单击并查看.class文件。您拥有的最佳选择是对代码进行模糊处理。 Here 是您可以使用的一些混淆器。但请始终牢记,对某些事情进行逆向工程永远不可能。一切都是可以破解的。