Android平臺的一個非侵入式的性能監控組件:BlockCanary
來自: https://github.com/moduth/blockcanary/blob/master/README_CN.md
BlockCanary
BlockCanary是一個Android平臺的一個非侵入式的性能監控組件,應用只需要實現一個抽象類,提供一些該組件需要的上下文環境,就可以在平時使用應用的時候檢測主線程上的各種卡慢問題,并通過組件提供的各種信息分析出原因并進行修復。
取名為BlockCanary則是為了向LeakCanary致敬,順便本庫的UI部分是從LeakCanary改來的,之后可能會做一些調整。
引入
dependencies {
// 如果希望在release包也開啟監控可以直接用compile
// compile 'com.github.moduth:blockcanary:1.0.2'
debugCompile 'com.github.moduth:blockcanary:1.0.2'
releaseCompile 'com.github.moduth:blockcanary-no-op:1.0.2'
}</pre> </div>
PS: 由于該庫使用了 getMainLooper().setMessageLogging();
, 請確認是否與你的app沖突.
使用方法在Application中:
public class DemoApplication extends Application {
@Override
public void onCreate() {
...
// 在主進程初始化調用哈
BlockCanary.install(this, new AppBlockCanaryContext()).start();
}
}
實現自己的監控上下文:
public class AppBlockCanaryContext extends BlockCanaryContext {
// 實現各種上下文,包括應用標示符,用戶uid,網絡類型,卡慢判斷闕值,Log保存位置等
}
功能及原理見BlockCanary — 輕松找出Android App界面卡頓元兇.
如何分析log除了圖形界面可以供開發、測試階段直接看卡頓原因外,更多的使用場景其實在于大范圍的log采集和分析:如線上環境和monkey,或者測試同學們在整個測試階段的log收集和分析。
對于分析,主要可以從以下維度
- 卡頓時間
- 同堆棧的卡頓出現次數 進行排序和歸類。
接著說說對各個log分析的過程。
- 首先可以根據手機性能,如核數、機型、內存來判斷對應耗時是不是應該判定為卡頓。如一些差的機器,或者內存本身不足的時候。
- 根據CPU情況,是否是app拿不到cpu,被其他應用拿走了。
- 看timecost和threadtimecost,如果兩者差得很多,則是主線程被等待或者資源被搶占。
- 看卡頓發生前最近的幾次堆棧,如果堆棧相同,則可以判定為是改出發生卡頓,否則需要比較分析。 </ul>
Demo工程
請參考本項目下的demo module,點擊三個按鈕會觸發對應的耗時事件,消息欄則會彈出block的notification,點擊可以進去查看詳細信息。
貢獻者
該庫最初由 markzhai 創建, 并在 魔都三帥 組織下與 nimengbo 和 zzz40500 共同維護和更新.
特別鳴謝Mr.Bao, android-cjj, chiahaolu在項目早期做出的貢獻。
修改日志
貢獻
如果你希望貢獻代碼到BlockCanary,你可以fork本repository然后發一個PR。
協議
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</pre>