[Android]Dagger2Metrics - 测量DI图表初始化的性能(翻译)

news/2024/5/19 3:15:00


以下内容为原创,欢迎转载,转载请注明
来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5098943.html

Dagger2Metrics - 测量DI图表初始化的性能

原文:http://frogermcs.github.io/dagger2metrics-measure-performance-of-graph-initialization/

几个月前我们通过 Dagger 2 - graph creation performance 经历了一些可能会遇到的问题。多亏 TraceView 这个工具我们可以很确切地看到初始化所有需要的依赖需要多少时间。但是这并不简单 - 我们必须要在我们代码中找出需要开始和停止测量的地方,然后在Android Studio中dump和分析它们。为了让它变得更简单,我们准备了一个简单的库,它可以帮助我们捕捉潜在的性能问题。

Dagger2Metrics

Dagger 2 初始化过程的性能测量库

下面的描述内容是从 Dagger2Metrics Github 项目网站拷贝过来的。

如果你在Android应用中使用Dagger 2来进行依赖注入,你可能知道它最大的一处优化就是Google(原来是Square)的优秀工程师通过使用非反射代码实现。

即使有了所有的这些优化以及完全的非动态代码生成,但是仍然有潜在的性能问题隐藏在我们的代码中和所有通过Dagger 2注入的第三方代码中。

性能的问题通常是慢慢地变慢的,所以在每天的开发中是很难意识到我们的app(或者Activity、或者其他View)启动50ms或者更长。又一次变成150ms,又一次变成100ms...

使用Dagger2Metrics,你将可以看到初始化所有需要的依赖需要多少时间(以及这些依赖之间的依赖关系)。

dagger2metrics.png

准备开始

在你的build.gradle中:

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'com.frogermcs.dagger2metrics:dagger2metrics-plugin:0.2'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'com.frogermcs.dagger2metrics'

在你的Application类中:

public class ExampleApplication extends Application {

 @Override
 public void onCreate() {
     super.onCreate();
     //Use it only in debug builds
     if (BuildConfig.DEBUG) {
         Dagger2Metrics.enableCapturing(this);
     }
  }
 }

这样就完成了。在你的app中,你将会看到notification,它可以打开所有已完成的初始化的一个简单的概述。

dagger2metrics-notification.png

它是怎么工作的?

Dagger2Metrics会捕捉所有的初始化,通过 - 所有带有 @Module -> @Provides 注解的方法和@Inject注解的构造方法。

总之,你会看到大多数顶级注入依赖地依赖关系树。每一个依赖显示了提供这些对象到Dagger 2对象图表需要多少时间(构建本身所用时间以及所有的依赖)。

dagger2metrics.png

为什么我看不到所有(子)依赖?

测量树不会显示那些已经提供给Dagger图表的依赖,所以只有从头开始构建的才会显示出来。主要是因为可读性以及另外一个简单的理由就是 - 我们不想在大多数没有错误的情况下去测量Dagger 2的性能。我们应该确保我们的代码尽可能快地提供依赖。

自定义

Dagger2Metrics 有3种默认级别的警告:

Dagger2Metrics.WARNING_1_LIMIT_MILLIS // 30ms
Dagger2Metrics.WARNING_2_LIMIT_MILLIS // 50ms
Dagger2Metrics.WARNING_3_LIMIT_MILLIS // 100ms

你可以根据你的需要对它们进行调整。

例子app

你可以查看 GithubClient 项目 - 一个展示怎么使用Dagger 2的Android app的例子。最近的版本在debug build中使用了Dagger2Metrics。

更多关于Dagger 2

如果你刚开始接触Dagger 2,下面的资源列表可以帮助你:

GithubClient - 基于Dagger 2依赖注入框架的Github API 客户端实现的例子。

Blog posts:

  • Dagger 1 to 2 migration process
  • Introdution to Dependency Injection
  • Dagger 2 API
  • Dagger 2 - custom scopes
  • Dagger 2 - graph creation performance

代码:

以上描述的完整代码可见Github repository。

作者

Miroslaw Stanek

Head of Mobile Development @ Azimo


[Android]使用Dagger 2依赖注入 - DI介绍(翻译):

http://www.cnblogs.com/tiantianbyconan/p/5092083.html


[Android]使用Dagger 2依赖注入 - API(翻译):

http://www.cnblogs.com/tiantianbyconan/p/5092525.html


[Android]使用Dagger 2依赖注入 - 自定义Scope(翻译):

http://www.cnblogs.com/tiantianbyconan/p/5095426.html


[Android]使用Dagger 2依赖注入 - 图表创建的性能(翻译):

http://www.cnblogs.com/tiantianbyconan/p/5098943.html


[Android]Dagger2Metrics - 测量DI图表初始化的性能(翻译):

http://www.cnblogs.com/tiantianbyconan/p/5193437.html


[Android]使用Dagger 2进行依赖注入 - Producers(翻译):

http://www.cnblogs.com/tiantianbyconan/p/6234811.html


[Android]在Dagger 2中使用RxJava来进行异步注入(翻译):

http://www.cnblogs.com/tiantianbyconan/p/6236646.html


[Android]使用Dagger 2来构建UserScope(翻译):

http://www.cnblogs.com/tiantianbyconan/p/6237731.html


[Android]在Dagger 2中Activities和Subcomponents的多绑定(翻译):

http://www.cnblogs.com/tiantianbyconan/p/6266442.html


http://www.niftyadmin.cn/n/3863238.html

相关文章

SSL/TLS协议簇加解密流程

一、概述 SSL协议是最早Netscape公司开发的安全通信协议,用于浏览器安全通信。到SSL Version3,提交作为IFTF草案,已经广泛的应用Intetnet通信。之后IETF对SSLv3稍作改动并更名为TLS1.0,对应RFC2246,之后的TLS1.1、TLS1…

openssl生成证书命令详解

1、生成csr openssl req -new -newkey rsa:2048 -nodes -keyout 您的域名.key -out 您的域名.csr req命令主要用于生成和处理PKCS#10证书请求。 -new 生成新的证书请求以及私钥,默认为1024比特。 -newkey rsa:bits 用于生成新的rsa密钥以及证书请求。如果用户不…

pyextend库-unpack列表集合字符串解包函数

pyextend - python extend lib unpack (iterable, count, fillNone) 参数: iterable: 实现 __iter__的可迭代对象, 如 str, tuple, dict, list count: 需要拆分的数量, 如数值大于 len(iterable) 则使用 fill 的值进行后续填充 fill: 默认值填充 使用范例: Exampl…

spring Bean使用案例 无参数构造方式

1、导入spring包&#xff08;四个基本核心包&#xff09; 2、在src目录新建xml 3、xml导入schema约束 <beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLo…

[置顶]白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现

离去年“马尔可夫链进行彩票预测”已经一年了&#xff0c;同时我也计划了一个彩票数据框架的搭建&#xff0c;分析和预测的框架&#xff0c;会在今年逐步发表&#xff0c;拟定了一个目录&#xff0c;大家有什么样的意见和和问题&#xff0c;可以看看&#xff0c;留言我会在后面…

spring Bean使用案例 静态方法方式 和工厂模式

参考上一篇文章spring Bean使用案例 无参数构造方式 静态方法 1、新建一个类 package spring_day_1; /** * * author linwen *静态方法创建对象 */ public class TastDome2 { public static TastDome add(){ return new TastDome(); } } 2、编写xml…

sublime开启vim模式

学习目标&#xff1a;在sublime下开启vim模式&#xff0c;了解基本vim的编辑快捷键。 下载安装Sublime Text 3 &#xff1a;http://www.sublimetext.com/3Vim/Vi&#xff1a; Vim/Vi 是一个文本编辑器&#xff0c;没有菜单&#xff0c;只有命令&#xff0c;适合写前端代码。高效…

Spring官方文档翻译(1~6章)

spring官方文档&#xff1a;http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ 一、Spring框架概述 Spring框架是一个轻量级的解决方案&#xff0c;可以一站式地构建企业级应用。Spring是模块化的&#xff0c;所以可以只使用其中需要的部分。…