成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

安卓to鴻蒙系列:Logger

系統(tǒng)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[395946]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

目錄

  • Guide
  • Logger源碼分析
  • 知識(shí)點(diǎn)
  • 移植到鴻蒙
  • 思考

Guide

本文基于https://gitee.com/openharmony-tpc/logger 分析Logger的源碼,及移植到鴻蒙需要做的工作。

在安卓to鴻蒙系列:Timber 里我就已經(jīng)提到,我喜歡Logger和Timber一起使用。原因很簡(jiǎn)單,因?yàn)門imber接口簡(jiǎn)潔,Logger的輸出樣式好看。

常規(guī)套路:

  1. FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder() 
  2.         .tag("DwGG")   // (Optional) Global tag for every log. Default PRETTY_LOGGER 
  3.         .build(); 
  4.  
  5. Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy)); 
  6. Timber.plant(new Timber.DebugTree() { 
  7.     @Override 
  8.     protected void log(int priority, String tag, String message, Throwable t) { 
  9.         Logger.log(priority, tag, message, t); 
  10.     } 
  11. }); 

Logger源碼分析

Timber只有一個(gè)文件,600多行代碼,Logger相對(duì)復(fù)雜一些,不過(guò)結(jié)構(gòu)也一樣簡(jiǎn)單,很容易讀懂源碼。和Timber一樣,Logger的擴(kuò)展性也一樣優(yōu)秀。

Timber內(nèi)置了DebugTree(在控制臺(tái)輸出日志)。Logger內(nèi)置了AndroidLogAdapter(控制臺(tái)輸出)、DiskLogAdapter(輸出日志到本地磁盤(pán))

先看圖,有一個(gè)整體的認(rèn)識(shí):

解釋一下上面的圖:

1.Logger 也使用了 委托(delegate)模式,Logger把所以的操作都委托給了Printer printer

2.Printer 是日志能力的抽像(即,定義了日志工具的api),類似于Timber中的Tree。定義的api有:

  • 日志相關(guān)api:v()、d()、i()、e()、wtf(),以及xml()、json()對(duì)xml、json數(shù)據(jù)格式的支持。
  • 設(shè)置臨時(shí)tag:t()
  • LogAdapter相關(guān)api:addAdapter(LogAdapter adapter)、clearLogAdapters()

Printer的默認(rèn)實(shí)現(xiàn)是LoggerPrinter,我們可以自定義自己的實(shí)現(xiàn)。不過(guò),多數(shù)情況下貌似沒(méi)必要。

3.與Timber相比,Logger對(duì)Timber中的Tree進(jìn)一步抽像。以 LogAdapter 適配不同的日志能力,如Android控制臺(tái)輸出(AndroidLogAdapter)、保存到磁盤(pán)(DiskLogAdapter)。

從類名上,我們也能看出用了適配器(apapter)模式

當(dāng)然我們也可以定義鴻蒙HiLog控制臺(tái)輸出的LogAdapter(取個(gè)名字:HarmonyLogAdapter)

4.FormatStrategy 格式化原始數(shù)據(jù),決定了LogAdapter輸出日志的樣式。

AndroidLogAdapter中的默認(rèn)實(shí)現(xiàn)是PrettyFormatStrategy(可以顯示線程信息、統(tǒng)一的tag:"PRETTY_LOGGER"、線程棧);

DiskLogAdapter中的默認(rèn)實(shí)現(xiàn)是CsvFormatStrategy(csv文件的格式);

5.LogStrategy 最終決定FormatStrategy輸出日志的目標(biāo)(如:控制臺(tái)LogcatLogStrategy、磁盤(pán)DiskLogStrategy)

更詳細(xì)的分析請(qǐng)移步:Android日志系統(tǒng)第三方庫(kù)------Logger 源碼分析

知識(shí)點(diǎn)

1.臨時(shí)tag的實(shí)現(xiàn)方法

很簡(jiǎn)單,Logger.t("臨時(shí)tag").d(xxx);設(shè)置臨時(shí)tag。使用一次就刪除。最終也是委托給Printer來(lái)實(shí)現(xiàn)。

為了性能,LoggerPrinter和Timber一樣,也使用ThreadLocal以空間換時(shí)間。

2.多線程支持方面,只有LoggerPrinter的synchronized void log()加了鎖。

個(gè)人認(rèn)為,應(yīng)該把LoggerPrinter的addAdapter(LogAdapter adapter)和 clearLogAdapters()都加上鎖。

因?yàn)閘og()方法加鎖,所以一定要保證此方法的執(zhí)行效率。 不然,如果一個(gè)線程寫(xiě)日志太耗時(shí),會(huì)影響其它線程的執(zhí)行。

3.接上一條,DiskLogStrategy 在寫(xiě)文件時(shí),在獨(dú)立的HandlerThread線程中執(zhí)行,可以保證LoggerPrinter的void log()方法的執(zhí)行時(shí)間。

移植到鴻蒙

通過(guò)上面的分析,我們可以知道,移植到鴻蒙需要的工作有:

1.實(shí)現(xiàn)HarmonyLogAdapter提供 控制臺(tái)輸出 的能力,其中PrettyFormatStrategy基本可以復(fù)用,只要修改LogcatLogStrategy的實(shí)現(xiàn),用HiLog替換android.util.Log相關(guān)的操作。

  1. public PrettyFormatStrategy build() { 
  2.   if (logStrategy == null) { 
  3.     logStrategy = new LogcatLogStrategy(); 
  4.   } 
  5.   return new PrettyFormatStrategy(this); 

2.修改DiskLogAdapter提供 輸出日志到文件 的能力。其中CsvFormatStrategy基本可以復(fù)用,只要修改日志文件路徑的設(shè)置以及Handler相關(guān)的類。

  1. String diskPath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
  2. String folder = diskPath + File.separatorChar + "logger"
  3. HandlerThread ht = new HandlerThread("AndroidFileLogger." + folder); 
  4. ht.start(); 
  5. Handler handler = new DiskLogStrategy.WriteHandler(ht.getLooper(), folder, MAX_BYTES); 

修改為:

  1. String folder = "/storage/emulated/0/" + File.separatorChar + "logger"
  2. String newThreadName = "FileLogger" + folder; 
  3. EventRunner ht = EventRunner.create(newThreadName); 
  4. EventHandler handler = new DiskLogStrategy.WriteHandler(ht, folder, MAX_BYTES); 

同理DiskLogStrategy里的Handler也要改為EventHandler。

思考 

上圖是最終的效果。從代碼中可以看到HiLogLabel是固定的,所以domain和tag都是固定的。而為了實(shí)現(xiàn)自定義tag的目的,把自定義tag輸出到了message里,所以我們可以看到兩個(gè)"PRETTY_LOGGER",視覺(jué)上不太完美。

  1. public class LogcatLogStrategy implements LogStrategy { 
  2.     static final String DEFAULT_TAG = "NO_TAG"
  3.     static final String TAG_LOG = "[PRETTY_LOGGER] "
  4.     static final int DOMAIN_ID = 0xD000F00; 
  5.     static final HiLogLabel LABEL_LOG = new HiLogLabel(3, DOMAIN_ID, TAG_LOG); 

優(yōu)化的方法可以參考 Timber_ohos的實(shí)現(xiàn)。

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2021-04-26 09:46:10

鴻蒙HarmonyOS應(yīng)用

2021-05-11 14:43:16

鴻蒙HarmonyOS應(yīng)用

2021-07-26 10:09:43

鴻蒙HarmonyOS應(yīng)用

2019-06-20 16:07:12

鴻蒙安卓操作系統(tǒng)

2020-09-10 09:30:03

鴻蒙安卓操作系統(tǒng)

2013-11-04 14:49:34

安卓

2018-02-09 08:59:47

安卓FuchsiaiOS

2019-07-12 16:00:25

華為禁令開(kāi)發(fā)

2021-05-18 15:44:13

IOS安卓鴻蒙

2021-06-04 05:13:22

鴻蒙

2013-04-24 11:33:50

安卓

2013-10-17 10:17:41

安卓

2014-12-09 11:15:06

郵箱安卓移動(dòng)端

2021-02-25 10:40:00

數(shù)據(jù)

2020-09-29 13:03:45

安卓應(yīng)用開(kāi)發(fā)工具開(kāi)發(fā)

2011-10-18 13:33:02

思亞諾CMMBDTV

2019-06-11 13:41:45

華為鴻蒙操作系統(tǒng)

2024-01-31 17:52:04

2022-07-28 12:06:46

HarmonyOS華為

2013-12-12 16:51:43

安卓進(jìn)化AndroidGoogle
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久九九色 | 在线看一区二区三区 | 久久久久久国产 | 亚洲国产网站 | www.伊人.com | 久久33 | 中文字幕精品一区 | 国产精品视频免费播放 | 日韩中文字幕一区二区 | 巨大荫蒂视频欧美另类大 | 久久精品欧美一区二区三区不卡 | 四色永久| 欧美 日韩 国产 在线 | 99精品网站| 中文字幕日韩一区 | 一区二区中文字幕 | 日韩一级一区 | 日韩国产中文字幕 | 欧美二区三区 | 中文字幕视频在线观看 | 97国产一区二区精品久久呦 | 91精品国产欧美一区二区 | 欧美一级大黄 | 一区二区三区高清 | 亚洲人成人一区二区在线观看 | 国产成人高清在线观看 | 九九热在线视频 | 欧美日韩中文字幕 | 日本成人三级电影 | 亚洲精品1区2区3区 91免费看片 | 日韩成人在线看 | 中文字幕一区二区三区在线观看 | 又爽又黄axxx片免费观看 | 色综合久 | 狠狠色综合网站久久久久久久 | 高清视频一区二区三区 | 岛国午夜 | 皇色视频在线 | 国产精品日韩一区二区 | 日本人做爰大片免费观看一老师 | 伊人网伊人网 |