首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >隐藏库的类- Android

隐藏库的类- Android
EN

Stack Overflow用户
提问于 2016-08-29 14:19:56
回答 4查看 6.7K关注 0票数 19

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

这3个项目的内部编译如下(build.gradle):

库项目:

  • 项目A

编译项目(“:projectA”)编译project(":projectB")

  • Project B

编译project(':projectC')

主项目:

代码语言:javascript
复制
compile(name: 'projectA', ext: 'aar')
compile(name: 'projectB', ext: 'aar')
compile(name: 'projectC', ext: 'aar')

我想对“库项目”做一些事情,以便在主项目中,如果我从库项目中单击任何类,我应该不能看到代码,或者它应该是加密的。

例如,如果ProjectA中有InterfaceA,并且主项目的主活动实现了该接口,如果我在接口中“按住Ctrl键并单击”,结果应该类似于我上面指定的结果。

我知道Proguard做了一些类似的事情,但只有当你在构建一个发布的.apk时,我才需要编译后的库得到同样的结果。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-31 20:58:32

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

  • 您可以使用Gradle为Android
  • Libraries,构建库组件,就像应用程序一样,可以在开发中构建或发布构建类型
  • 可以配置为在组件(应用程序或库)上运行,但只能在发布构建类型中运行。看这里:https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard
  • If组件是缩小的(强烈建议),然后你需要告诉Progaurd“根”类是什么,否则它会把库缩小到字面上什么都没有。这可以通过向配置文件添加一条规则来实现:

公共类your.package.name { -keep *;}

这里有一个更广泛的示例:http://proguard.sourceforge.net/manual/examples.html#library

但是,也有一些限制:

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

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

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

当您对您的库进行增量发布时,也需要该文件,以便模糊处理与先前发布的版本一致。如果你不这样做,客户就不能直接替换你的库,并且将不得不对他们的应用程序进行完整的重建(和链接)。

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

票数 9
EN

Stack Overflow用户

发布于 2016-09-06 23:50:41

您可以将所有不想公开的方法都设置为默认方法,这样它们就不能在原始项目之外使用。此外,您应该将库从应用程序项目中分离出来,编译它们,并将它们用作外部依赖项。如果你不想发布这个库的源代码,那就不要把它添加到编译选项中。如果您以外的其他人需要使用您的库,请使用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

票数 2
EN

Stack Overflow用户

发布于 2016-09-06 19:17:24

2个步骤:

  1. 将库添加到本地maven存储库
  2. 使用maven依赖项而不是项目依赖项。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39199669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档