构建 Gradle + Proguard + APKLib
Posted
技术标签:
【中文标题】构建 Gradle + Proguard + APKLib【英文标题】:Build Gradle + Proguard + APKLib 【发布时间】:2014-08-29 10:19:19 【问题描述】:我开发了一个 android 库,由我开发的测试应用程序使用。
我需要对 Android 库的代码进行模糊处理,以便能够将其交付给某些客户,而他们不能看到太多代码。 但因此我需要一个 Android 库,其结构与我的非混淆库相同,以便我仍然可以使用 Eclipse 打开它并在其他应用程序中使用它。
我尝试过使用 Gradle 和 Proguard 来实现,但我在这方面遇到了困难。
首先,我使用插件:“android-library”来构建我的apklib,但我不太了解构建文件夹下创建的文件夹的结构。
哪个文件夹应该包含带有混淆类的新 Android 库项目? 我做对了吗?
此外,我很难过,因为许多原始类似乎没有生成,并且在我构建后就丢失了,但我真的不知道为什么,可能的原因是什么这个?
有没有可能是因为使用了一些不推荐使用的方法,或者类似的东西?
我的最后一个问题是关于在构建期间导入库的正确方法,我的 Android 库正在使用一些外部 jar 来工作,但是如果我在构建期间检查输出,我可以看到我似乎丢失了大部分原始库类:
16:36:33.809 [INFO] [system.out] 库类的原始数量:5366 16:36:33.809 [INFO] [system.out] 库类的最终数量:615
是什么原因造成的? 我知道我的问题很模糊,但我已经为此苦苦挣扎了一天,现在还不能真正改善我的构建。 任何有关如何正确构建使用 Gradle 和 Proguard 混淆的 Android 库的帮助或建议将不胜感激。
编辑:
我找到了一些相关的帖子,但对于 Gradle Using Proguard 生成的输出并不清楚。似乎参加输出是 lib 文件夹下的 .aar 文件,但这并不是我真正想要的。 到目前为止,我通过在我的 Proguard 设置文件中使用一些特殊规则来强制我的一些文件使用 -keep 规则保存(但我真的不明白为什么如果我不保存和混淆它们)不要把这些规则)。然后我使用了在 bundles/release 文件夹中生成的 classes.jar,并将其移动到一个新的 Android Library Project libs 文件夹中,从我原来的 Android Library Project 中复制资源。使我成为一个带有混淆源的 Android 库项目,但看起来不是很干净。
【问题讨论】:
这有什么更新吗?正如您在回复 Ashwin 时提到的,几乎所有人,包括 Xavier 和 Eric Lafortune,都对他们认为您应该做的事情持肯定态度(“Android 库没有被混淆;应用程序被混淆”),而不是回答您的问题(“如何我混淆了我的 Android 库”)。谷歌显然混淆了他们的 Android 库(地图、分析等),那么这是如何做到的呢?使用 DexGuard? 【参考方案1】:首先你不能在eclipse中打开你的混淆代码。因为混淆过程不会生成你想在eclipse中打开的项目结构。混淆是一个保护你的二进制分布式代码而不是源代码的过程.请保持清楚 在你的脑海中。
我认为您需要对您的 android 库项目进行二进制分发。对于 android 库项目的二进制分发,使用的扩展名是 AAR FORMAT 中提到的 aar
这意味着您需要在 build 文件夹下查找生成的 yourlibrary.aar 文件。对于 android 库项目,不要混淆您的代码。因为您的客户很难使用图书馆。
您将在 build/outputs/aar 文件夹中获得 .aar 文件。
我认为这已经足够了。
【讨论】:
感谢您的回答和您的宝贵时间。正如我在帖子中所说,我已经知道生成的 AAR 库,但这并不是我真正想要的。我有点厌倦人们没有真正阅读这些问题,或者对我需要做的事情如此肯定。我也知道我需要保持我的图书馆的入口点不被混淆,以便我的客户可以使用它。无论如何,感谢您提醒我们混淆的真正用途。我知道它不会给我一个可以在 Eclipse 中使用的项目。但请记住,并非所有客户端都能够使用 AAR 库。以上是关于构建 Gradle + Proguard + APKLib的主要内容,如果未能解决你的问题,请参考以下文章
构建android gradle项目时如何禁用proguard生成dump.txt
升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类
使用 Gradle 和 ProGuard 构建的 Android:“输出 jar 必须在输入 jar 之后指定,否则将为空”