性能優(yōu)化工具(十二)-使用 CPU Profiler 檢查 CPU Activity 和函數(shù)跟蹤

CPU Profiler 可幫助您實(shí)時(shí)檢查應(yīng)用的 CPU 使用率和線程 Activity古话,并記錄函數(shù)跟蹤,以便您可以優(yōu)化和調(diào)試您的應(yīng)用代碼。

一偶洋、 為什么要分析 CPU 使用率

最大限度減少應(yīng)用的 CPU 使用率具有許多優(yōu)勢(shì)晾嘶,如提供更快更順暢的用戶體驗(yàn)妓雾,以及延長(zhǎng)設(shè)備電池續(xù)航時(shí)間。 它還可幫助應(yīng)用在各種新舊設(shè)備上保持良好性能垒迂。 與應(yīng)用交互時(shí)械姻,您可以使用 CPU Profiler 監(jiān)控 CPU 使用率和線程 Activity。 不過(guò)机断,如需了解應(yīng)用如何執(zhí)行其代碼的詳細(xì)信息楷拳,您應(yīng)記錄和檢查函數(shù)跟蹤。

對(duì)于應(yīng)用進(jìn)程中的每個(gè)線程吏奸,您可以查看一段時(shí)間內(nèi)執(zhí)行了哪些函數(shù)欢揖,以及在其執(zhí)行期間每個(gè)函數(shù)消耗的 CPU 資源。 您還可以使用函數(shù)跟蹤來(lái)識(shí)別調(diào)用方被調(diào)用方苦丁。 調(diào)用方指調(diào)用其他函數(shù)的函數(shù)浸颓,而被調(diào)用方是指被其他函數(shù)調(diào)用的函數(shù)。 您可以使用此信息確定哪些函數(shù)負(fù)責(zé)調(diào)用常常會(huì)消耗大量特定資源的任務(wù),并嘗試優(yōu)化應(yīng)用代碼以避免不必要的工作产上。

如果您想收集可幫助您檢查原生系統(tǒng)進(jìn)程的詳細(xì)系統(tǒng)級(jí)數(shù)據(jù)棵磷,并解決掉幀引起的界面卡頓,您應(yīng)使用 systrace晋涣。

或者仪媒,如果您想導(dǎo)出您使用 Debug 類捕獲的 .trace 文件,您應(yīng)使用 Traceview谢鹊。

二算吩、 CPU Profiler 概覽

當(dāng)您打開 CPU Profiler 時(shí),它將立即開始顯示應(yīng)用的 CPU 使用率和線程 Activity佃扼。 您應(yīng)該會(huì)看到類似圖 1 的一些內(nèi)容:

圖 1. CPU Profiler

如圖 1 所示偎巢,CPU Profiler 的默認(rèn)視圖包括以下內(nèi)容:

  1. Event 時(shí)間線: 顯示應(yīng)用中在其生命周期不同狀態(tài)間轉(zhuǎn)換的 Activity,并表明用戶與設(shè)備的交互兼耀,包括屏幕旋轉(zhuǎn) Event压昼。 如需了解有關(guān) Event 時(shí)間線的更多信息,包括如何啟用它瘤运,請(qǐng)閱讀 啟用高級(jí)分析窍霞。
  2. CPU 時(shí)間線: 顯示應(yīng)用的實(shí)時(shí) CPU 使用率(以占總可用 CPU 時(shí)間的百分比表示)以及應(yīng)用使用的總線程數(shù)。 此時(shí)間線還顯示其他進(jìn)程的 CPU 使用率(如系統(tǒng)進(jìn)程或其他應(yīng)用)拯坟,以便您可以將其與您的應(yīng)用使用率進(jìn)行對(duì)比但金。 通過(guò)沿時(shí)間線的水平軸移動(dòng)鼠標(biāo),您還可以檢查歷史 CPU 使用率數(shù)據(jù)郁季。
  3. 線程 Activity 時(shí)間線: 列出屬于應(yīng)用進(jìn)程的每個(gè)線程并使用下面列出的顏色沿時(shí)間線標(biāo)示它們的 Activity冷溃。 在您記錄一個(gè)函數(shù)跟蹤后,您可以從此時(shí)間線中選擇一個(gè)線程以在跟蹤窗格中檢查其數(shù)據(jù)梦裂。
    • 綠色: 表示線程處于活動(dòng)狀態(tài)或準(zhǔn)備使用 CPU秃诵。 即,它正在“運(yùn)行中”或處于“可運(yùn)行”狀態(tài)塞琼。
    • 黃色: 表示線程處于活動(dòng)狀態(tài)菠净,但它正在等待一個(gè) I/O 操作(如磁盤或網(wǎng)絡(luò) I/O),然后才能完成它的工作彪杉。
    • 灰色: 表示線程正在休眠且沒有消耗任何 CPU 時(shí)間毅往。 當(dāng)線程需要訪問(wèn)尚不可用的資源時(shí)偶爾會(huì)發(fā)生這種情況。 線程進(jìn)入自主休眠或內(nèi)核將此線程置于休眠狀態(tài)派近,直到所需的資源可用攀唯。
  4. 記錄配置: 允許您選擇以下選項(xiàng)之一以確定分析器記錄函數(shù)跟蹤的方式。
    • Sampled: 一個(gè)默認(rèn)配置渴丸,在應(yīng)用執(zhí)行期間頻繁捕獲應(yīng)用的調(diào)用堆棧侯嘀。 分析器比較捕獲的數(shù)據(jù)集以推導(dǎo)與應(yīng)用代碼執(zhí)行有關(guān)的時(shí)間和資源使用信息另凌。 基于“Sampled”的跟蹤的固有問(wèn)題是,如果應(yīng)用在捕獲調(diào)用堆棧后進(jìn)入一個(gè)函數(shù)并在下一次捕獲前退出該函數(shù)戒幔,則分析器不會(huì)記錄該函數(shù)調(diào)用吠谢。 如果您對(duì)此類生命周期很短的跟蹤函數(shù)感興趣,您應(yīng)使用“Instrumented”跟蹤诗茎。
    • Instrumented: 一個(gè)默認(rèn)配置工坊,在運(yùn)行時(shí)設(shè)置應(yīng)用以在每個(gè)函數(shù)調(diào)用的開始和結(jié)束時(shí)記錄時(shí)間戳。 它收集時(shí)間戳并進(jìn)行比較敢订,以生成函數(shù)跟蹤數(shù)據(jù)王污,包括時(shí)間信息和 CPU 使用率。 請(qǐng)注意楚午,與設(shè)置每個(gè)函數(shù)關(guān)聯(lián)的開銷會(huì)影響運(yùn)行時(shí)性能昭齐,并可能會(huì)影響分析數(shù)據(jù),對(duì)于生命周期相對(duì)較短的函數(shù)矾柜,這一點(diǎn)更為明顯司浪。 此外,如果應(yīng)用短時(shí)間內(nèi)執(zhí)行大量函數(shù)把沼,則分析器可能會(huì)迅速超出它的文件大小限制,且不能再記錄更多跟蹤數(shù)據(jù)吁伺。
    • Edit configurations: 允許您更改上述“Sampled”和“Instrumented”記錄配置的某些默認(rèn)值饮睬,并將它們另存為自定義配置。 如需了解更多信息篮奄,請(qǐng)轉(zhuǎn)到創(chuàng)建記錄配置部分捆愁。
  5. 記錄按鈕: 用于開始和停止記錄函數(shù)跟蹤。 如需了解更多信息窟却,請(qǐng)轉(zhuǎn)到記錄和檢查函數(shù)跟蹤部分 昼丑。

注: 分析器還會(huì)報(bào)告 Android Studio 和 Android 平臺(tái)添加到您的應(yīng)用進(jìn)程(如 JDWPProfile Saver夸赫、Studio:VMStats菩帝、Studio:Perfa 以及 Studio:Heartbeat,盡管它們?cè)诰€程 Activity 時(shí)間線中顯示的確切名稱可能有所不同)的線程 CPU 使用率茬腿。 這表示 CPU 時(shí)間線中應(yīng)用的 CPU 使用率還可反映這些線程使用的 CPU 時(shí)間呼奢。 您可以在線程 Activity 時(shí)間線中查看其中的一些線程并監(jiān)控其 Activity。 (不過(guò)切平,由于分析器線程執(zhí)行原生代碼握础,因此,您無(wú)法為它們記錄函數(shù)跟蹤數(shù)據(jù)悴品。)Android Studio 將報(bào)告此數(shù)據(jù)禀综,以便當(dāng)線程 Activity 及 CPU 使用率實(shí)際上是由應(yīng)用代碼引發(fā)時(shí)简烘,您可以輕松識(shí)別。

三定枷、 記錄和檢查函數(shù)跟蹤

要開始記錄函數(shù)跟蹤孤澎,從下拉菜單中選擇 SampledInstrumented 記錄配置,或選擇您創(chuàng)建的自定義記錄配置依鸥,然后點(diǎn)擊 Record

亥至。 與應(yīng)用交互并在完成后點(diǎn)擊 Stop recording

。 分析器將自動(dòng)選擇記錄的時(shí)間范圍贱迟,并在函數(shù)跟蹤窗格中顯示其跟蹤信息姐扮,如圖 2 所示。如果您想檢查另一個(gè)線程的函數(shù)跟蹤衣吠,只需從線程 Activity 時(shí)間線中選中它茶敏。

圖 2. 記錄函數(shù)跟蹤后的 CPU Profiler
  1. 選擇時(shí)間范圍: 用于確定您要在跟蹤窗格中檢查所記錄時(shí)間范圍的哪一部分。 當(dāng)您首次記錄函數(shù)跟蹤時(shí)缚俏,CPU Profiler 將在 CPU 時(shí)間線中自動(dòng)選擇您的記錄的完整長(zhǎng)度惊搏。 如果您想僅檢查所記錄時(shí)間范圍一小部分的函數(shù)跟蹤數(shù)據(jù),您可以點(diǎn)擊并拖動(dòng)突出顯示的區(qū)域邊緣以修改其長(zhǎng)度忧换。
  2. 時(shí)間戳: 用于表示所記錄函數(shù)跟蹤的開始和結(jié)束時(shí)間(相對(duì)于分析器從設(shè)備開始收集 CPU 使用率信息的時(shí)間)恬惯。 在選擇時(shí)間范圍時(shí),您可以點(diǎn)擊時(shí)間戳以自動(dòng)選擇完整記錄亚茬,如果您有多個(gè)要進(jìn)行切換的記錄酪耳,則此做法尤其有用。
  3. 跟蹤窗格: 用于顯示您所選的時(shí)間范圍和線程的函數(shù)跟蹤數(shù)據(jù)刹缝。 僅在您至少記錄一個(gè)函數(shù)跟蹤后此窗格才會(huì)顯示碗暗。 在此窗格中,您可以選擇想如何查看每個(gè)堆疊追蹤(使用跟蹤標(biāo)簽)梢夯,以及如何測(cè)量執(zhí)行時(shí)間(使用時(shí)間引用下拉菜單)言疗。
  4. 選擇后,可通過(guò) Top Down 樹颂砸、Bottom Up 樹噪奄、調(diào)用圖表火焰圖的形式顯示您的函數(shù)跟蹤。 您可以在下文中了解每個(gè)跟蹤窗格標(biāo)簽的更多信息人乓。
  5. 從下拉菜單中選擇以下選項(xiàng)之一梗醇,以確定如何測(cè)量每個(gè)函數(shù)調(diào)用的時(shí)間信息:
    • Wall clock time:壁鐘時(shí)間信息表示實(shí)際經(jīng)過(guò)的時(shí)間。
    • Thread time:線程時(shí)間信息表示實(shí)際經(jīng)過(guò)的時(shí)間減去線程沒有消耗 CPU 資源的任意時(shí)間部分撒蟀。 對(duì)于任何給定函數(shù)叙谨,其線程時(shí)間始終少于或等于其壁鐘時(shí)間。 使用線程時(shí)間可以讓您更好地了解線程的實(shí)際 CPU 使用率中有多少是給定函數(shù)消耗的保屯。

四手负、 使用 Call Chart 標(biāo)簽檢查跟蹤

Call Chart 標(biāo)簽提供函數(shù)跟蹤的圖形表示形式涤垫,其中,水平軸表示函數(shù)調(diào)用(或調(diào)用方)的時(shí)間段和時(shí)間竟终,并沿垂直軸顯示其被調(diào)用者蝠猬。 對(duì)系統(tǒng) API 的函數(shù)調(diào)用顯示為橙色,對(duì)應(yīng)用自有函數(shù)的調(diào)用顯示為綠色统捶,對(duì)第三方 API(包括 Java 語(yǔ)言 API)的函數(shù)調(diào)用顯示為藍(lán)色榆芦。 下面的圖 3 展示了一個(gè)調(diào)用圖表示例,并描繪了給定函數(shù)的 self time喘鸟、children time 以及總時(shí)間的概念匆绣。 您可以在如何使用 Top Down 和 Bottom Up 檢查跟蹤部分詳細(xì)了解這些概念。

圖 3.一個(gè)調(diào)用圖表示例什黑,描繪了函數(shù) D 的 self崎淳、children 及總時(shí)間

提示: 若要跳轉(zhuǎn)到某個(gè)函數(shù)的源代碼,請(qǐng)右鍵點(diǎn)擊該函數(shù)并選擇 Jump to Source愕把。 這適用于任一跟蹤窗格標(biāo)簽拣凹。

五、 使用 Flame Chart 標(biāo)簽檢查跟蹤

Flame Chart 標(biāo)簽提供一個(gè)倒置的調(diào)用圖表恨豁,其匯總相同的調(diào)用堆棧嚣镜。 即,收集共享相同調(diào)用方順序的完全相同的函數(shù)橘蜜,并在火焰圖中用一個(gè)較長(zhǎng)的橫條表示它們(而不是將它們顯示為多個(gè)較短的橫條菊匿,如調(diào)用圖表中所示)。 這樣更方便您查看哪些函數(shù)消耗最多時(shí)間扮匠。 不過(guò),這也意味著水平軸不再代表時(shí)間線凡涩,相反棒搜,它表示每個(gè)函數(shù)相對(duì)的執(zhí)行時(shí)間。

為幫助說(shuō)明此概念活箕,請(qǐng)考慮以下圖 4 中的調(diào)用圖表力麸。 請(qǐng)注意,函數(shù) D 多次調(diào)用 B(B1育韩、B2 和 B3)克蚂,其中一些對(duì) B 的調(diào)用也調(diào)用了 C(C1 和 C3)。

圖 4.包含多個(gè)共享通用調(diào)用方順序的函數(shù)調(diào)用的調(diào)用圖表

由于 B1筋讨、B2 和 B3 共享相同的調(diào)用方順序 (A → D → B)埃叭,因此,可將它們匯總在一起悉罕,如下所示赤屋。 同樣立镶,將 C1 和 C3 匯總在一起,因?yàn)樗鼈円补蚕硐嗤恼{(diào)用方順序 (A → D → B → C)—請(qǐng)注意类早,未包含 C2媚媒,因?yàn)樗哂胁煌恼{(diào)用方順序 (A → D → C)。

圖 5. 匯總共享相同調(diào)用堆棧的相同函數(shù)

匯總的函數(shù)調(diào)用用于創(chuàng)建火焰圖涩僻,如圖 6 所示缭召。請(qǐng)注意,對(duì)于火焰圖中任何給定的函數(shù)調(diào)用逆日,消耗最多 CPU 時(shí)間的被調(diào)用方首先顯示嵌巷。

圖 6.圖 4 中顯示的調(diào)用圖表的火焰圖表示形式

六、 使用 Top Down 和 Bottom Up 檢查跟蹤

Top Down 標(biāo)簽顯示一個(gè)函數(shù)調(diào)用列表屏富,在該列表中展開函數(shù)節(jié)點(diǎn)會(huì)顯示函數(shù)的被調(diào)用方晴竞。 圖 7 顯示圖 3 中調(diào)用圖表的“Top Down”圖表。圖表中的每個(gè)箭頭都從調(diào)用方指向被調(diào)用方狠半。

如圖 7 所示噩死,在“Top Down”標(biāo)簽中展開函數(shù) A 的節(jié)點(diǎn)可顯示它的被調(diào)用方,即函數(shù) B 和 D神年。 然后已维,展開函數(shù) D 的節(jié)點(diǎn)可顯示它的被調(diào)用方,即函數(shù) B 和 C 等等已日。 與 Flame chart 標(biāo)簽相似垛耳,“Top Down”樹匯總共享相同調(diào)用堆棧的相同函數(shù)的跟蹤信息。 也就是說(shuō)飘千,Flame chart 標(biāo)簽可提供Top down 標(biāo)簽的圖形化表示形式堂鲜。

Top Down 標(biāo)簽提供以下信息以幫助說(shuō)明在每個(gè)函數(shù)調(diào)用上所花費(fèi)的 CPU 時(shí)間(時(shí)間也可以用線程總時(shí)間占所選時(shí)間范圍的持續(xù)時(shí)間的百分比表示):

  • Self: 表示函數(shù)調(diào)用在執(zhí)行自己的代碼(而非被調(diào)用方的代碼)上所花的時(shí)間,如圖 3 中的函數(shù) D 所示护奈。
  • Children: 表示函數(shù)調(diào)用在執(zhí)行自己的被調(diào)用方(而非自己的代碼)上所花的時(shí)間缔莲,如圖 3 中的函數(shù) D 所示。
  • 總和: 函數(shù)的 SelfChildren 時(shí)間的總和霉旗。 這表示應(yīng)用在執(zhí)行函數(shù)調(diào)用上所花的總時(shí)間痴奏,如圖 3 中函數(shù) D 所示。
圖 7. Bottom Up
圖 8.Top Down

Bottom Up 標(biāo)簽顯示一個(gè)函數(shù)調(diào)用列表厌秒,在該列表中展開函數(shù)節(jié)點(diǎn)將顯示函數(shù)的調(diào)用方读拆。 通過(guò)使用圖 7 中展示的跟蹤示例,圖 8 為函數(shù) C 提供了一個(gè)“Bottom Up”樹鸵闪。 在“Bottom Up”樹中打開函數(shù) C 的節(jié)點(diǎn)可顯示它獨(dú)有的調(diào)用方檐晕,即函數(shù) B 和 D。 請(qǐng)注意蚌讼,盡管 B 調(diào)用 C 兩次棉姐,但在“Bottom Up”樹中展開函數(shù) C 的節(jié)點(diǎn)時(shí)屠列,B 僅顯示一次。 然后伞矩,展開 B 的節(jié)點(diǎn)顯示其調(diào)用方笛洛,即函數(shù) A 和 D。

Bottom Up 標(biāo)簽用于按照消耗最多(最少)CPU 時(shí)間排序函數(shù)乃坤。 您可以檢查每個(gè)節(jié)點(diǎn)以確定在調(diào)用函數(shù)上哪些調(diào)用方花了最多 CPU 時(shí)間苛让。 與“Top Down”樹相比,“Bottom Up”樹中的每個(gè)函數(shù)的時(shí)間信息引用每個(gè)樹頂部的函數(shù)(頂部模式)湿诊。 CPU 時(shí)間也可表示為在該記錄期間占線程總時(shí)間的百分比狱杰。 下表有助于闡述如何解釋頂部節(jié)點(diǎn)的時(shí)間信息及其調(diào)用方函數(shù)(子節(jié)點(diǎn))。

Self Children 合計(jì)
“Bottom Up”樹頂部的函數(shù)(頂部模式) 表示函數(shù)在執(zhí)行自己的代碼(而非其被調(diào)用方的代碼)上所花的時(shí)間厅须。 與“Top Down”樹相比仿畸,此時(shí)間信息表示在記錄的持續(xù)時(shí)間內(nèi)對(duì)此函數(shù)所有調(diào)用的總和。 表示函數(shù)執(zhí)行它的被調(diào)用方(而非它自己的代碼)上所花的總時(shí)間朗和。 與“Top Down”樹相比错沽,此時(shí)間信息表示在記錄的持續(xù)期間內(nèi)所有對(duì)此函數(shù)被調(diào)用方的調(diào)用總和。 self time 和 children time 的總和眶拉。
調(diào)用方函數(shù)(子節(jié)點(diǎn)) 表示在由調(diào)用方調(diào)用時(shí)被調(diào)用方的總 self time千埃。 以圖 8 中的“Bottom Up”樹為例,被 B 調(diào)用時(shí)忆植,函數(shù) B 的 self time 將等于函數(shù) C 每個(gè)執(zhí)行的 self time 的總和放可。 表示在由調(diào)用方調(diào)用時(shí)被調(diào)用方的總 children time。 以圖 8 中的“Bottom Up”樹為例朝刊,被 B 調(diào)用時(shí)耀里,函數(shù) B 的 children time 將等于函數(shù) C 每個(gè)執(zhí)行的 children time 的總和。 self time 和 children time 的總和拾氓。

注:對(duì)于給定錄制冯挎,當(dāng)分析器到達(dá)文件大小限制時(shí),Android Studio 將停止收集新數(shù)據(jù)(不過(guò)痪枫,這不會(huì)停止記錄)织堂。 在執(zhí)行“Instrumented”跟蹤時(shí)叠艳,這種情況通常會(huì)更快發(fā)生奶陈,因?yàn)榕c“Sampled”跟蹤相比,此類跟蹤在較短時(shí)間里會(huì)收集更多數(shù)據(jù)附较。 如果您將檢查時(shí)間范圍延長(zhǎng)至達(dá)到限制后發(fā)生的記錄時(shí)間吃粒,則跟蹤窗格中的時(shí)間數(shù)據(jù)不會(huì)發(fā)生變化(因?yàn)闆]有新數(shù)據(jù)可用)。 此外拒课,當(dāng)您僅選擇沒有數(shù)據(jù)可用的記錄部分時(shí)徐勃,對(duì)于時(shí)間信息事示,跟蹤窗格將顯示 NaN

七僻肖、 創(chuàng)建記錄配置

您可以從 Android Studio 為您提供的記錄配置中選擇一個(gè)配置肖爵,如 SampledInstrumented,也可以創(chuàng)建自己的記錄配置臀脏。 要?jiǎng)?chuàng)建或編輯自定義配置劝堪,或檢查現(xiàn)有默認(rèn)配置,可通過(guò)從記錄配置下拉菜單中選擇 Edit configurations 來(lái)打開 CPU Recording Configurations 對(duì)話框揉稚。

圖 9.您可以通過(guò) CPU Recording Configurations 對(duì)話框創(chuàng)建或編輯自定義記錄配置秒啦,或檢查現(xiàn)有默認(rèn)配置

您可以通過(guò)從左側(cè)窗格中選擇現(xiàn)有配置來(lái)檢查其設(shè)置,也可按如下方式創(chuàng)建一個(gè)新的記錄配置:

  1. 點(diǎn)擊對(duì)話框左上角的 Add搀玖, 這將創(chuàng)建一個(gè)包含一些默認(rèn)設(shè)置的新配置余境。
  1. 為您的配置命名。

  2. Trace Technology 部分選擇 SampledInstrumented灌诅。 其中每一個(gè)選項(xiàng)都按 CPU Profiler 概覽 中所述運(yùn)行芳来。

  3. 對(duì)于“Sampled”記錄配置,以微秒 (μs) 為單位指定 Sampling interval延塑。 此值表示應(yīng)用調(diào)用堆棧的每個(gè)抽樣之間的持續(xù)時(shí)間绣张。 請(qǐng)記住,您指定的持續(xù)時(shí)間越短关带,您就會(huì)越快到達(dá)所記錄數(shù)據(jù)的文件大小限制侥涵。

  4. 對(duì)于寫入連接設(shè)備的記錄數(shù)據(jù),以兆字節(jié) (MB) 為單位指定 File size limit宋雏。 當(dāng)您停止記錄時(shí)芜飘,Android Studio 將解析此數(shù)據(jù)并將其顯示在分析器窗口中。 因此磨总,如果您增加此限制并記錄大量數(shù)據(jù)嗦明,Android Studio 將花更長(zhǎng)時(shí)間解析文件,并可能會(huì)無(wú)響應(yīng)蚪燕。

    注: 如果您使用運(yùn)行 API 級(jí)別 26 或更高版本的連接設(shè)備娶牌,則對(duì)于跟蹤數(shù)據(jù)的文件大小沒有限制,此值可忽略馆纳。不過(guò)诗良,您仍需留意每次記錄后設(shè)備收集了多少數(shù)據(jù)——Android Studio 可能難以解析大型跟蹤文件。例如鲁驶,當(dāng)應(yīng)用短時(shí)間內(nèi)調(diào)用許多函數(shù)時(shí)鉴裹,如果您記錄抽樣間隔較短的“Sampled”跟蹤或“Instrumented”跟蹤,您很快就會(huì)生成大型跟蹤文件。

  5. 點(diǎn)擊 ApplyOK径荔。 如果您更改了其他記錄配置督禽,則也將應(yīng)用這些更改。

創(chuàng)建新配置后总处,系統(tǒng)將自動(dòng)從記錄配置下拉菜單中選中它狈惫,并且您可以將它用于您的下一次記錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者鹦马。
  • 序言:七十年代末虱岂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子菠红,更是在濱河造成了極大的恐慌第岖,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试溯,死亡現(xiàn)場(chǎng)離奇詭異蔑滓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)遇绞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門键袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摹闽,你說(shuō)我怎么就攤上這事蹄咖。” “怎么了付鹿?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵澜汤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舵匾,道長(zhǎng)俊抵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任坐梯,我火速辦了婚禮徽诲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吵血。我一直安慰自己谎替,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布蹋辅。 她就那樣靜靜地躺著钱贯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晕翠。 梳的紋絲不亂的頭發(fā)上喷舀,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音淋肾,去河邊找鬼硫麻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛樊卓,可吹牛的內(nèi)容都是我干的拿愧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼碌尔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浇辜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起唾戚,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柳洋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叹坦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊镣,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年募书,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绪囱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莹捡,死狀恐怖鬼吵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篮赢,我是刑警寧澤齿椅,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站启泣,受9級(jí)特大地震影響媒咳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜种远,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一涩澡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坠敷,春花似錦妙同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至限次,卻和暖如春芒涡,著一層夾襖步出監(jiān)牢的瞬間柴灯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工费尽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赠群,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓旱幼,卻偏偏與公主長(zhǎng)得像查描,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柏卤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • CPU Profiler 可幫助您實(shí)時(shí)檢查應(yīng)用的 CPU 使用率和線程 Activity冬三,并記錄函數(shù)跟蹤,以便您可...
    iyifei閱讀 5,539評(píng)論 1 28
  • 低性能的APP常見的表現(xiàn)有啟動(dòng)/界面切換慢缘缚、動(dòng)畫掉幀勾笆、卡頓、耗電桥滨,甚至出現(xiàn)應(yīng)用無(wú)響應(yīng)匠襟、程序崩潰的現(xiàn)象。當(dāng)我們著手解...
    都有米閱讀 23,351評(píng)論 8 50
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,111評(píng)論 1 32
  • 原文 https://blog.csdn.net/niubitianping/article/details/72...
    十二書閱讀 1,907評(píng)論 1 1
  • 前言 block可以叫回調(diào)代碼塊该园,是iOS開發(fā)中至關(guān)重要的形式之一酸舍。不同的編程語(yǔ)言都會(huì)用到block, 只是體現(xiàn)形...
    人仙兒a閱讀 411評(píng)論 0 3