日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一個(gè)能讓你了解所有函數(shù)調(diào)用順序的Android庫(kù)

背景

創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè),為客戶提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計(jì),建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價(jià)格優(yōu)惠,收費(fèi)合理。

當(dāng)項(xiàng)目代碼量很大的時(shí)候,或者你作為一名新人要快速掌握代碼的時(shí)候,給函數(shù)打上log,來了解代碼執(zhí)行邏輯,這種方式會(huì)顯然成本太大,要改動(dòng)項(xiàng)目編譯運(yùn)行,NO!太耗時(shí);或者你想debug的方式來給你想關(guān)注的幾個(gè)函數(shù),來了解代碼執(zhí)行邏輯,NO!因?yàn)槟憧隙〞?huì)漏掉函數(shù);也許你可以固執(zhí)的給你寫的項(xiàng)目打滿log說這樣也行,但是你要知道你方法所調(diào)用的jdk的函數(shù)或者第三方aar或者jar再或者android sdk中的函數(shù)調(diào)用順序你怎么辦,還能打log嗎?顯然不行吧,來~這個(gè)項(xiàng)目給讓可以讓你以包名為過濾點(diǎn)過濾你想要知道所有函數(shù)調(diào)用順序。

效果奉上

動(dòng)作簡(jiǎn)介:首先點(diǎn)擊MainActivity的自定義MyTextView然后進(jìn)入SecondActivity再點(diǎn)擊textview之后finish跳轉(zhuǎn)回MainActivity

下面是庫(kù)處理過所得到的函數(shù)調(diào)用順序order.txt文件(我這里屏蔽了jdk函數(shù),第三方庫(kù)函數(shù),以及android sdk中函數(shù),換句話說我就保留了我自己包名中的函數(shù)順序)

832 ent     67593 .....com.zjw.appmethodorder.MainActivity.onClick (Landroid/view/View;)VMainActivity.java
832 ent     99956 ..........com.zjw.appmethodorder.MainActivity.onPause ()VMainActivity.java
832 ent     99970 ...........com.zjw.appmethodorder.BaseActivity.onPause ()VBaseActivity.java
832 ent    100472 ............com.zjw.appmethodorder.BaseActivity.baseOnPause ()VBaseActivity.java
832 ent    128540 ........com.zjw.appmethodorder.SecondActivity.
 
   ()VSecondActivity.java 832 ent    128562 .........com.zjw.appmethodorder.BaseActivity.
  
    ()VBaseActivity.java 832 ent 213911 ........com.zjw.appmethodorder.SecondActivity.onCreate (Landroid/os/Bundle;)VSecondActivity.java 832 ent 213928 .........com.zjw.appmethodorder.BaseActivity.onCreate (Landroid/os/Bundle;)VBaseActivity.java 832 ent 258414 ..........com.zjw.appmethodorder.BaseActivity.baseOnCreate ()VBaseActivity.java 832 ent 1440503 .........com.zjw.appmethodorder.SecondActivity.onResume ()VSecondActivity.java 832 ent 1440563 ..........com.zjw.appmethodorder.BaseActivity.onResume ()VBaseActivity.java 832 ent 1445675 ...........com.zjw.appmethodorder.BaseActivity.baseOnResume ()VBaseActivity.java 832 ent 2954291 .................com.zjw.appmethodorder.MyTextView.onWindowVisibilityChanged (I)VMyTextView.java 832 ent 3065664 ........com.zjw.appmethodorder.MainActivity.onStop ()VMainActivity.java 832 ent 3065701 .........com.zjw.appmethodorder.BaseActivity.onStop ()VBaseActivity.java 832 ent 3069155 ..........com.zjw.appmethodorder.BaseActivity.baseOnStop ()VBaseActivity.java 832 ent 3139519 .......com.zjw.appmethodorder.SecondActivity.click (Landroid/view/View;)VSecondActivity.java 832 ent 3146300 ........com.zjw.appmethodorder.SecondActivity.finish ()VSecondActivity.java 832 ent 3183478 ..........com.zjw.appmethodorder.SecondActivity.onPause ()VSecondActivity.java 832 ent 3183498 ...........com.zjw.appmethodorder.BaseActivity.onPause ()VBaseActivity.java 832 ent 3183843 ............com.zjw.appmethodorder.BaseActivity.baseOnPause ()VBaseActivity.java 832 ent 3209420 ........com.zjw.appmethodorder.MainActivity.
   
     ()VMainActivity.java 832 ent 3209438 .........com.zjw.appmethodorder.BaseActivity.
    
      ()VBaseActivity.java 832 ent 3283359 ........com.zjw.appmethodorder.MainActivity.onCreate (Landroid/os/Bundle;)VMainActivity.java 832 ent 3283378 .........com.zjw.appmethodorder.BaseActivity.onCreate (Landroid/os/Bundle;)VBaseActivity.java 832 ent 3330938 ..........com.zjw.appmethodorder.BaseActivity.baseOnCreate ()VBaseActivity.java 832 ent 4363295 .....................com.zjw.appmethodorder.MyTextView.
     
       (Landroid/content/Context;Landroid/util/AttributeSet;)VMyTextView.java 832 ent 4436094 ..................com.zjw.appmethodorder.MyTextView.onFinishInflate ()VMyTextView.java 832 ent 4449689 .........com.zjw.appmethodorder.MainActivity.initView ()VMainActivity.java 832 ent 4539427 .........com.zjw.appmethodorder.MainActivity.onResume ()VMainActivity.java 832 ent 4539467 ..........com.zjw.appmethodorder.BaseActivity.onResume ()VBaseActivity.java 832 ent 4543597 ...........com.zjw.appmethodorder.BaseActivity.baseOnResume ()VBaseActivity.java 832 ent 4917854 .................com.zjw.appmethodorder.MyTextView.onAttachedToWindow ()VMyTextView.java 832 ent 4918658 .................com.zjw.appmethodorder.MyTextView.onWindowVisibilityChanged (I)VMyTextView.java 832 ent 5090653 ...................................com.zjw.appmethodorder.MyTextView.onMeasure (II)VMyTextView.java 832 ent 5355203 ..................................com.zjw.appmethodorder.MyTextView.onMeasure (II)VMyTextView.java 832 ent 5456681 .......................................com.zjw.appmethodorder.MyTextView.onSizeChanged (IIII)VMyTextView.java 832 ent 5467577 ....................................com.zjw.appmethodorder.MyTextView.onLayout (ZIIII)VMyTextView.java 832 ent 5876623 ...........................................com.zjw.appmethodorder.MyTextView.onDraw (Landroid/graphics/Canvas;)VMyTextView.java 832 ent 6121967 ........com.zjw.appmethodorder.SecondActivity.onStop ()VSecondActivity.java 832 ent 6121986 .........com.zjw.appmethodorder.BaseActivity.onStop ()VBaseActivity.java 832 ent 6123689 ..........com.zjw.appmethodorder.BaseActivity.baseOnStop ()VBaseActivity.java 832 ent 6127522 ........com.zjw.appmethodorder.SecondActivity.onDestroy ()VSecondActivity.java 832 ent 6127679 .........com.zjw.appmethodorder.BaseActivity.onDestroy ()VBaseActivity.java 832 ent 6133301 ..........com.zjw.appmethodorder.BaseActivity.baseOnDestroy ()VBaseActivity.java 
     
    
   
  
 

OK!發(fā)現(xiàn)是不是很炫酷啊,下面來介紹該庫(kù)的原理(求star!!!)

原理

本庫(kù)其實(shí)并沒有什么黑科技,本庫(kù)也沒有java代碼,核心就是2個(gè)build.gradle中的task。首先,原理就是基于android sdk中提供的工具----traceview,和dmtracedump。traceview會(huì)生成.trace文件,該文件記錄了函數(shù)調(diào)用順序,函數(shù)耗時(shí),函數(shù)調(diào)用次數(shù)等等有用的信息。而dmtracedump 工具就是基于trace文件生成報(bào)告的工具,具體用法不細(xì)說。

dmtracedump 工具大家一般用的多的選項(xiàng)就是生成html報(bào)告,或者生成調(diào)用順序圖片(看起來很不直觀)。首先說說為什么要用traceview,和dmtracedump來作為得到函數(shù)調(diào)用順序的,因?yàn)檫@個(gè)工具既然能知道cpu執(zhí)行時(shí)間和調(diào)用次數(shù)以及函數(shù)調(diào)用樹(看出函數(shù)調(diào)用順序很費(fèi)勁)比如android studio是這樣呈現(xiàn).trace文件的解析視圖的

或者這樣的

是網(wǎng)上找的,侵刪) 用上面這2個(gè)圖發(fā)現(xiàn)你要清晰知道函數(shù)調(diào)用看懂了才是見鬼了?;蛘呤褂胐mtracedump 工具解析生成的html長(zhǎng)下面這樣(dmtracedump 生成圖片就不說了 生成出的圖片也根本看不出順序這個(gè)就略過了)

一開始我以為 Method 序列號(hào)有戲于是乎沖動(dòng)的我把帶序號(hào)的東西內(nèi)容復(fù)制出來寫了一個(gè)腳本對(duì)他們進(jìn)行排序代碼如下:

 
 
 
 
  1.  import java.io.BufferedReader;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.Collections;
  7. import java.util.regex.Matcher;
  8. import java.util.regex.Pattern;
  9. public class Sort implements Comparable {
  10. static String uri = "D:/Application/eclipse/javaworkspace/Testc/JB/1.text";
  11. String str = "";
  12. String content = "";
  13. public Sort(String str,String content) {
  14. super();
  15. this.str = str;
  16. this.content = content;
  17. }
  18. public static void main(String[] args) throws IOException {
  19. // TODO Auto-generated method stub
  20. ArrayList list = new ArrayList<>();
  21. BufferedReader in = new BufferedReader(new FileReader(uri));
  22. String a = "";
  23. while ((a = in.readLine()) != null) {
  24. //System.out.println(Long.valueOf(getIndexStr(a)));
  25. if(a.contains("com.zjw.appmethodorder")){
  26. list.add(new Sort(getIndexStr(a),a));
  27. }
  28. }
  29. Collections.sort(list);
  30. for (Sort sort : list) {
  31. System.out.println(sort.content);
  32. }
  33. }
  34. public static String getIndexStr(String str) {
  35. String regEx = "(?<=\\[)(\\S+)(?=\\])";// 匹配[]中的數(shù)字
  36. Pattern p = Pattern.compile(regEx);
  37. Matcher m = p.matcher(str.trim());
  38. while (m.find()) {
  39. return m.group().trim();
  40. }
  41. return "";
  42. }
  43. @Override
  44. public int compareTo(Sort o) {
  45. // TODO Auto-generated method stub
  46. //return 0;
  47. return (int) (Long.valueOf(str) - Long.valueOf(o.str));
  48. }

結(jié)果發(fā)現(xiàn)過濾后的東西序列號(hào)是按順序的但是并不是代碼執(zhí)行的邏輯順序。我擦怎么辦,工具代碼也寫了,居然不是我想要的結(jié)果,好在花了一些時(shí)間發(fā)現(xiàn)dmtracedump -ho 選項(xiàng),經(jīng)過研究發(fā)現(xiàn),這玩意輸出的內(nèi)容居然是按邏輯順序從上到下的,于是基于這一點(diǎn)我寫一個(gè)項(xiàng)目,其實(shí)核心就是2個(gè)task完成了了解所有函數(shù)調(diào)用順序的目的。

  1. //核心任務(wù):在captures文件目錄下輸出 基于最新.trace文件的函數(shù)調(diào)用信息的txt版本
  2. //說明:dmtracedump 為 android sdk自帶工具,要執(zhí)行dmtracedump命令則需要先添加環(huán)境變量
  3. task AppOutPutMethodOrder() {
  4.     doLast {
  5.         def capturesDirPath = project.getProjectDir().getParentFile().path + File.separator + "captures";
  6.         def capturesDir = new File(capturesDirPath);
  7.         capturesDir.traverse {
  8.             if (it.isFile() && it.name.endsWith(".trace")) {
  9.                 def orderName = it.name.replace("trace", "txt")
  10.                 def orderFile = new File(capturesDirPath, orderName)
  11.                 orderFile.write("")
  12.                 def dmtracedumpDir = getDmtraceDumpDir();
  13.                 //說明:dmtracedump 為 android sdk自帶工具,要執(zhí)行dmtracedump命令則需要先添加環(huán)境變量
  14.                 def baseComand = dmtracedumpDir + "dmtracedump  -ho " + it.absolutePath + " >> " + orderFile.absolutePath
  15.                 println baseComand
  16.                 String osNameMatch = System.getProperty("os.name").toLowerCase();
  17.                 if (osNameMatch.contains("windows")) {
  18.                     ("cmd /c start  /b " + baseComand).execute()
  19.                 } else {
  20.                     ["bash", "-c", baseComand].execute()
  21.                 }
  22.             }
  23.         }
  24.     }
  25. }
  26. /**
  27.  * read the sdk dir from local.properties
  28.  * eg :
  29.  *  sdk.dir = /home/env/sdk
  30.  *  so:
  31.  *   dmtracedump.dir = /home/env/sdk/platform-tools
  32.  *
  33.  * @return the dir which dmtracedump tools exists
  34.  */
  35. def getDmtraceDumpDir() {
  36.     def rootDir = project.rootDir
  37.     def localProperties = new File(rootDir, "local.properties")
  38.     def sdkDir = null;
  39.     if (localProperties.exists()) {
  40.         Properties properties = new Properties()
  41.         localProperties.withInputStream { instr ->
  42.             properties.load(instr)
  43.         }
  44.         sdkDir = properties.getProperty('sdk.dir')
  45.     }
  46.     if (sdkDir == null || !(new File(sdkDir).exists())) {
  47.         sdkDir = android.getSdkDirectory().getAbsolutePath()
  48.     }
  49.     if (sdkDir == null || !(new File(sdkDir).exists())) {
  50.         sdkDir = android.plugin.getSdkFolder().getAbsolutePath()
  51.     }
  52.     def dmtraceDumpToolDir = sdkDir + File.separator + "platform-tools" + File.separator
  53.     if (new File(dmtraceDumpToolDir).exists()) {
  54.         return dmtraceDumpToolDir;
  55.     }
  56.     return ""
  57. }
  58. //這里AppFilterMethodOrder 任務(wù)其實(shí)也不需要 執(zhí)行找到 \captures 目錄找到 base_order.txt
  59. //用Notepad++ 使用正則 先過濾 帶 xit 的行 (我們只關(guān)注ent 行就行,ent代表進(jìn)入執(zhí)行函數(shù) xit代表退出函數(shù))再過濾掉你不關(guān)心的包名
  60. // Notepad++ 中過濾將會(huì)使用到的命令行如下
  61. //^.*xit.*$ //去除掉 含有 xit 字符串的行  然后替換為空
  62. // ^((?!XXX).)*$  //去除不包含XXX的行  然后替換為空
  63. //^\s+   //合并空行  然后替換為空
  64. task AppFilterMethodOrder() {
  65.     doLast {
  66.         //TODO 替換為你想要過濾的包名
  67.         def filterPackageName = "com.zjw.appmethodorder"
  68.         if (project.hasProperty("package_name")) {
  69.             filterPackageName = project.getProperty("package_name")
  70.         }
  71.         //處理包名
  72.         def filterSignature = filterPackageName.replaceAll("[.]", "/")
  73.         def capturesDirPath = project.getProjectDir().getParentFile().path + File.separator + "captures";
  74.         def capturesDir = new File(capturesDirPath);
  75.         capturesDir.traverse {
  76.             if (it.isFile() && it.name.endsWith(".txt") && !it.name.contains("--filter")) {
  77.                 def orderName = it.name.replace(".txt", "--filter.txt")
  78.                 def orderTimeName = it.name.replace(".txt", "--timefilter.txt")
  79.  

    網(wǎng)站題目:一個(gè)能讓你了解所有函數(shù)調(diào)用順序的Android庫(kù)
    網(wǎng)頁(yè)鏈接:http://www.dlmjj.cn/article/dpcpdpi.html