原文链接:https://medium.com/@orhanobut/no-op-versions-for-dev-tools-b0a865934398
开发工具的No-op版本
“在计算机科学中,NOP或NOOP(无操作的简称)是汇编语言指令,编程语言语句或计算机协议命令,它什么都不做。”
wiki
对于每个拉取请求,我们总结了构建信息以及可能的更改,并用电子邮件发送到CI服务器相应的组。
最近我们提交了一个拉取请求,并且有一些有趣的指标。拉取请求增加了apk大小和方法数量。以下数据是报告的一小部分。检查构建报告以获取更多详细信息
前置信息
APK信息(正式版本)
提交的唯一重大变化是引入Facebook Stetho。这是一个很好的调试工具,我们需要一些具体的原因,但绝对不想增加正式apk中的方法数量和大小。
有几个选项可以从正式的apk中丢弃它。
Proguard
我们(还)没有使用它。我想是时候在考虑一次了。
使用无操作版本的库
有些库提供了无操作版本,如LeakCanary。有些则没有(像LeakCanary一样)。
releasecompile编译无操作实现,apk不会包含库中任何冗余代码。
dependencies {
debugCompile '...:leakcanary-android':1.4-beta2''
releaseCompile '...:leakcanary-android-no-op:1.4-beta2'
}
不提供无操作版本的库
例如:Stetho没有这个选项,因此我们必须自己创建它。Stetho有许多可选的配置,因此他们不希望有一个无操作版本。
我们有几个选项来创建自己的无操作版本。基本上所有的行为都做同样的事情,唯一的区别是实现。
为库创建一个模块
创建库的无操作版本作为模块。在这种情况下,我们只使用Stetho的一种方法,所以让我们在模块中创建一个no-op方法。
- 创建模块。File -> New -> New Module
- 创建与同包中的工具完全相同的名称。
- 添加无操作实现
- 在build.gradle指定debugCompile使用工具依赖,releaseCompile使用无操作版本。
- 对于非调试构建,只允许使用无操作实现。
使用DebugApplication
由于大多数调试工具都是在应用程序类中初始化的,所以我们可以利用它。
- 创建调试源码集文件夹。src/debug
- 创建DebugApplication类,该类继承自自定义Application。
- 在DebugApplication中初始化开发工具。
- 在debug源码集中创建AndroidManifest.xml。我们利用manifest合并,并使用“tools:replace”替换DebugApplication中的实际应用程序。这将使用“.DebugApplication”替换“android:name”的标记值。
- 在build.gradle中指定针对debugCompile。
- 对非调试构建,只有无操作实现。
使用DevUtils的变体源码集
由于我们使用几种不同的开发者工具,因此我们更愿意把它们放到不同的源码集中,而不是为每个工具创建一个类,而是创建一个实用工具类,他讲所有逻辑包含在内部,因此我们不必考虑哪个类在那个包里等待。
- 针对每个构建类型创建源码集。src/debug,src/release。
- 创建工具类,例如DevUtils。
- 为每个开发者工具创建适当的脚手架。 即:initStetho,initSomethingElse。
- 在应用中使用DevUtils。DebUtils.initStetho(this)等。
- 在build.gradle中,使用适当的编译选项,通常是debugCompile,除非有其他具有特定工具的生成类型。
每个解决方案都有优缺点,但总的来说,使用无操作版本来构建apk是非常好的。对所有人都好。