Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android-Tips淺析(實用Android開發技巧)

Android-Tips淺析(實用Android開發技巧)

編輯:關於Android編程

整理本人實際開發中遇到的一些問題以及解決辦法和一些開發技巧,以後會不定時更新。

tip:利用“目錄”可快速導航

1.追溯sdk中某一個類隨sdk版本升高導致的歷史變遷。(find API changes)

問題來源:SwipeRefreshLayout源碼:判斷子View是否能向上滾動(或者是否滾動到頂部):

    /**
     * @return Whether it is possible for the child view of this layout to
     *         scroll up. Override this if the child view is a custom view.
     */
    public boolean canChildScrollUp() {
        if (android.os.Build.VERSION.SDK_INT < 14) {
            if (mTarget instanceof AbsListView) {
                final AbsListView absListView = (AbsListView) mTarget;
                return absListView.getChildCount() > 0
                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                                .getTop() < absListView.getPaddingTop());
            } else {
                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;
            }
        } else {
            return ViewCompat.canScrollVertically(mTarget, -1);
        }
    }

進入Android開發官網,假如要查看View API的變化,輸入View,選擇android.view.View,如圖:

搜索View

進入View的API參考頁面(文檔頁),如圖:

參考vcj9uPbW99Kq0MXPoqO6PC9wPg0KVmlld8rH1NpBUEkgbGV2ZWwgMcztvNO1xCBWaWV3tcTA4LLjtM7NqLn91/Oy4LXEQVBJIGxldmVsIGNob29zZSBidXR0b24gv8nS1LLpv7Syu82sQVBJIGxldmVsz8K1xFZpZXcgQVBJo6y9+NDQ193P8rXEsum/tCzNrMqxv8nS1L2rsrvNrEFQSSBsZXZlbM/CtcRWaWV3IEFQSb340NC64c/yttSxyKGjDQo8cD7Xt8vdQVBJILHku6++zcrHzai5/cnPyva12sj9zPXKtc/WtcSho7HIyOfO0sPHz+u/tL+0QVBJIGxldmVsIDEzus0gQVBJIGxldmVsIDE01q685NPQyrLDtLHku6+jrL2r1/Oy4EFQSSBsZXZlbMno1sPOqjEzLLLpv7S3vbeowdCx7aO6PC9wPg0KPHA+PGltZyBhbHQ9"gray methods" src="/uploadfile/Collfiles/20160331/2016033109035752.png" title="\" />

我們會發現一些API 是灰色的,當鼠標hover過方法名時,會顯示出一個提示,如圖:
這裡寫圖片描述

這個提示告訴我們:View中的canScrollVertically(int direction) 方法是在API level 14以後才添加的,另外canScrollHorizontally(int direction) 也是API level 14以後才添加的方法。當我把API level 切換到14時,發現上述兩個方法的顏色變為藍色了,說明他們的確是在API level 14添加的:

這裡寫圖片描述

總結:

使用這種方法的好處是不用下載每一個api 版本的源代碼,也可以很方便的對比他們之間的變化。開發參考除了可以對比方法的變化以外,還可以對比內部類,接口等變化,當前選中的API level 為9,結果如圖:
這裡寫圖片描述

2.使用device monitor 中的method profiling 工具尋找app卡頓的元凶

問題來源:使用RxJava時,出現莫名的卡頓,方法嵌套過深,或類關系過於復雜,難以定位問題。

進入sdk->tools文件夾。雙擊運行monitor.bat 打開device monitor:

這裡寫圖片描述
左側Device tab下是當前的設備名以及待調試應用的包名。在要測試某個操作(方法調用)之前,點擊method profiling 按鈕,彈出對話框:
這裡寫圖片描述

輸入采樣間隔:

這裡寫圖片描述

輸入采樣間隔,間隔越大,采集到某個方法調用棧的可能性就越小,可能漏掉某個調用棧,越小,采樣精度越高(或者說覆蓋率越高)但是采樣間隔太小,會導致卡頓。所以需要輸入一個合適的采樣間隔。輸入後點確認,然後在app上執行你的操作,執行完後點stop method profiling,會生成一個名為“ddms+時間戳+.trace”的文件,這個文件記錄了方法的調用棧信息,這個文件是我們分析的重點:
這裡寫圖片描述

視圖中上一欄,展示了在method profile過程中並行執行的所有線程或進程。下一欄的表格展示了方法的調用信息,如方法名,所耗時間,cpu占用等。 這裡寫圖片描述
表格中相關列名的說明:

這裡寫圖片描述
點擊表格每一欄的名字可以進行排序,根據Name找到上述操作調用的方法,如fetchData:

這裡寫圖片描述

Parents值得是fetchData的調用入口,而Children指的是fetchData方法中的子調用。
可以看出每個子調用或父調用的耗時情況,fetchData中的子調用fetchDataImpl耗時22.777ms,繼續點擊fetchDataImpl可以進入fetchDataImpl的調用棧,分析方式就同fetchData了,通過這種方式可以定位耗時操作的源頭:
這裡寫圖片描述

總結:

使用method profiling可以分析方法的調用棧,找出app的性能瓶頸。android device monitor的功能很強大,是一個工具的合集,還可以分析Heap Dump,Allocation,Network,查看Device的文件等。好的工具可以提升開發效率,科學使用工具可以事半功倍。另外推薦一款在線app 冷啟動性能分析工具:Nimbledroid 可以分析app 冷啟動的調用棧,通過分析app冷啟動調用棧,可以找到影響app的啟動速度的因素。另外,Nimbledroid上可以查找到許多app不同版本的冷啟動調用棧信息,我們可以從中借鑒加速app啟動的方式。

以後會不定時更新,未完待續。

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved