目錄:
chrome遠程調試android webview
解決Hierarchy Viewer無法使用的問題
查看當前正在顯示的activity
用對象的toString() 確定代碼運行時某個interface的具體實現類是哪個.
快捷方式使用上一條命令的輸出結果
ubuntu下用sqliteman圖形化讀數據庫的數據
android studio 搜索時忽略R.java這樣的生成文件, 提高查找關鍵字的效率
在log中快速定位crash的位置
善用android studio的Design窗口, 快速定位控件.
把log寫入sdcard
對Log文件按Tag進行過濾, 方便進一步分析
對log中的關鍵字高亮顯示
解決traceview find 功能無法使用的問題, 同樣可以實現對framework API的監控
adb logcat只看Error Level的log
Android Studio Lifecycle Sorter 插件
統計應用占用的內存,以及其他占用系統資源的統計
使用pidcat
5步完成向github提交代碼
使用APIMonitor
使用在線UML工具,對數據結構進行總結.
用Astah畫UML圖
使用adb bugreport監測耗電情況
使用dump View Hierarchy for UI automator快速定位界面上某個view的id
混淆后的類名需要到build服務器下載mapping.txt去映射到對應的原始類名
在native C++文件中添加log
定制app crash頁面
=================================================
正文開始:
chrome遠程調試android webview
step 1:
WebView mWebView;
mWebView = (WebView)findViewById(R.id.webView);
mWebView.setWebContentsDebuggingEnabled(true);
step 2:
PC chrome地址欄輸入: chrome://inspect
可以很方便的對網頁中的js打斷點調試.
解決Hierarchy Viewer無法使用的問題
在代碼中引入ViewServer這個類, 在注釋中寫的很明白.
對于工程機來說,不使用這個類也可以正常使用Hierarchy Viewer.
This class can be used to enable the use of HierarchyViewer inside an
* application. HierarchyViewer is an Android SDK tool that can be used
* to inspect and debug the user interface of running applications. For
* security reasons, HierarchyViewer does not work on production builds
* (for instance phones bought in store.) By using this class, you can
* make HierarchyViewer work on any device. You must be very careful
* however to only enable HierarchyViewer when debugging your
* application.
chrome內核代碼enable ViewServer的代碼在AsyncInitializationActivity.java
if (CommandLine.getInstance().hasSwitch(ChromeSwitches.ENABLE_HIERARCHYVIEWER_DEBUG)) {
mHierarchyViewDebug = true;
ViewServer.get(this).addWindow(this);
}
查看當前正在顯示的activity
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
修改 ~/.bashrc, 添加別名, 以后用自定義的adbwhichactivity就更方便了.
alias adbwhichactivity="adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'"
再定制一條命令: adbactivitytask 用于輸出當前的activity task的信息.
alias adbactivitytask="adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'"
用對象的toString() 確定代碼運行時某個interface的具體實現類是哪個.
TabModel tabModel = Global.mBrowserActivity.getCurrentTabModel();
public TabModel getCurrentTabModel() {
TabModelSelector modelSelector = getTabModelSelector();
if (modelSelector == null) return EmptyTabModel.getInstance();
return modelSelector.getCurrentModel();
}
TabModel是一個interface, 項目中有幾個它的實現類, 為了跟蹤在運行時具體的實現類是哪個,可以使用下面的debug方式.
BLog.i("ahking","SaveWebPagesActivity onStart() tabModel is: " + tabModel.toString());
Log 輸出:
02-15 12:19:31.417 21208-21208/? I/ahking﹕ SaveWebPagesActivity onStart() tabModel is: org.chromium.chrome.browser.tabmodel.TabModelImpl@413bfa48
這樣就確定了運行時具體的實現類是"TabModelImpl".
快捷方式使用上一條命令的輸出結果
wangxin@wangxin:~/src/src/chrome/android$ findahking chrometabbedactivity.java
./java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
wangxin@wangxin:~/src/src/chrome/android$ vim `!!`
ubuntu下用sqliteman圖形化讀數據庫的數據
sqliteman browser.db
把一個圖片存入數據庫的方法是把bitmap轉換為byte[]數組, 然后以BLOB類型存入數據庫,取出數據時, 再把byte[]數據轉換為Bitmap.
Bitmap icon = currentTab.getFavicon();
ByteArrayOutputStream out = new ByteArrayOutputStream();
icon.compress(Bitmap.CompressFormat.PNG, 30, out);
values.put(SavePages.ICON, out.toByteArray());
Uri insert = getContentResolver().insert(SavePages.CONTENT_URI,values);
android studio 搜索時忽略R.java這樣的生成文件, 提高查找關鍵字的效率
Define a custom scope to help you exclude intermediates files when searching.
follow "Ignore R.java fies in Find results"
在log中快速定位crash的位置
只需要搜"Shutting down VM" 關鍵字即可
04-07 14:53:05.698 24671-24671/com.qihoo.browser D/AndroidRuntime﹕ Shutting down VM
04-07 14:53:05.698 24671-24671/com.qihoo.browser W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41347ae0)
04-07 14:53:05.728 24671-24671/com.qihoo.browser E/AndroidRuntime﹕ FATAL EXCEPTION: main
或是再搜搜這個字符串.
E/AndroidRuntime(24434): FATAL EXCEPTION: main
可以再搜搜下面這個字符串.
thread exiting with uncaught exception
善用android studio的Design窗口, 快速定位控件.
比原來單純的從xml文本找控件的方式, 要更直觀更快速, 可以多多使用提高效率.
把log寫入sdcard
有些情況下,bug需要在release build下復現, 比如集成高德定位sdk, 安裝debug包的手機因為key的原因會永遠定位失敗, 在這種情況下就需要把log寫入sdcard, 進而分析定位失敗的具體原因.
BLog.java
public static void appendLog2SDCard(String text)
{
File logFile = new File("/sdcard/location.log");
if (!logFile.exists())
{
try
{
logFile.createNewFile();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try
{
//BufferedWriter for performance, true to set append to file flag
BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true));
buf.append(text);
buf.newLine();
buf.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
用法:
BLog.appendLog2SDCard("LocationHelper onLocationChanged(), error_code = " + location.getAMapException().getErrorCode());
對Log文件按Tag進行過濾, 方便進一步分析
log.log是測試人員發過來的main log,過濾一下, 分析起來就更加清晰了.
實現了使用ultraedit過濾關鍵字一樣的功能.
cat log.log | grep ahking > log2.log
// file: log2.log
I/ahking (26744): ResourceExtractor doInBackgroundImpl()
I/ahking (26744): ResourceExtractor doInBackgroundImpl() curTimeStampName = timestamp_10021_100.2.1_251
I/ahking (26744): ResourceExtractor deleteFiles()
I/ahking (26744): ResourceExtractor doInBackgroundImpl() appDataDir = /data/data/com.qihoo.browser/app_chrome
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = chrome_100_percent.pak
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = cloudurls.dat
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = en-US.pak
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = icudtl.dat
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = natives_blob.bin
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = resources.pak
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = snapshot_blob.bin
I/ahking (26744): =======================================================
I/ahking (26744): ResourceExtractor doInBackgroundImpl() file = zh-CN.pak
I/ahking (26744): =======================================================
E/skia (26923): SkFontMgr_Android ahking
對log中的關鍵字高亮顯示
wangxin@wangxin:~/Downloads$ adb logcat -s DroidBox | grep --color -E 'http:'
V/DroidBox(23726): Ljava/net/URL;-><init>(Ljava/lang/String;=http://p.s.360.cn/pstat/plog.php)V
V/DroidBox(23726): Ljava/net/URL;-><init>(Ljava/lang/String;=http://m.yiche.com/?wt.mc_id=m360mz)V
V/DroidBox(23726): Ljava/net/URL;-><init>(Ljava/lang/String;=http://m.yiche.com/?wt.mc_id=m360mz)V
V/DroidBox(23726): Ljava/net/URL;-><init>(Ljava/lang/String;=http://news.m.yiche.com/others/20160715/1506625294.html)V
V/DroidBox(23726): Ljava/net/URL;-><init>(Ljava/lang/String;=http://news.m.yiche.com/others/20160715/1506625294.html)V
V/DroidBox(23726): Ljava/net/URL;-><init>(Ljava/lang/String;=http://p.s.360.cn/pstat/plog.php)V
refer:
http://explainshell.com/
http://antanas.veiverys.com/android-logcat-log-with-keyword-highlights/
解決traceview find 功能無法使用的問題, 同樣可以實現對framework API的監控
wangxin@wangxin:~/Downloads/temp$ ~/tool/android-sdk-linux/tools/traceview ./startup.trace
直接在底部的"Find"窗口,搜索方法名"android/app/sharedpreferencesimpl$editorimpl
.commit"也可以監控到app對framework API的調用.
注意點:
- 直接點android device monitor工具的"start method profiling"按鈕抓取trace log,底部的"Find"窗口不工作, 什么原因造成的不知道, 也就是說想用"Find"功能就必須用traceview加載本地*.trace 文件.
- "Find"的查找只支持小寫, 不支持大寫.
在/sdcard/目錄下, 生成startup.trace文件.
android.os.Debug.startMethodTracing("startup");
android.os.Debug.stopMethodTracing();
adb logcat只看Error Level的log
adb logcat | grep '^E'
Android Studio Lifecycle Sorter 插件
按照生命周期的調用前后順序把代碼重新排序, 閱讀起來更加的方便.
另外, 觀察Structure window, 里面的幾個小細節的button使用起來對閱讀代碼也是很有幫助的.
eg. show non-public, show fields, 可以對當前文件有個快速的概括性的了解.
還是要多寫代碼, 多實踐, 從中可以發現不少提高開發效率的小技巧, 不能只停留在口頭和只學習不去實踐.
統計應用占用的內存,以及其他占用系統資源的統計
wangxin@wangxin:~/Downloads/log/Logs_2.1_20160825_141742$ adb shell dumpsys meminfo com.qihoo.browser
Applications Memory Usage (kB):
Uptime: 700089526 Realtime: 1812746797
** MEMINFO in pid 32398 [com.qihoo.browser] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 20 8 20 23264 18663 1552
Dalvik 30717 4332 30632 27364 22734 4630
Cursor 4 0 4
Ashmem 0 0 0
Other dev 8638 10508 3408
.so mmap 10826 1956 3592
.jar mmap 0 0 0
.apk mmap 1010 0 0
.ttf mmap 520 0 0
.dex mmap 6682 0 1084
Other mmap 1730 12 488
Unknown 14713 464 14712
TOTAL 74860 17280 53940 50628 41397 6182
Objects
Views: 473 ViewRootImpl: 3
AppContexts: 8 Activities: 2
Assets: 5 AssetManagers: 5
Local Binders: 84 Proxy Binders: 33
Death Recipients: 3
OpenSSL Sockets: 0
SQL
MEMORY_USED: 252
PAGECACHE_OVERFLOW: 45 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 24 414 95/31/8 /data/data/com.qihoo.browser/databases/downloads.db
4 124 91 6/26/3 /data/data/com.qihoo.browser/databases/browser.db
使用pidcat
彩色輸出log信息, 看起來清新多了.
gedit ~/.bashrc
添加一條
alias pidcatbrowser="/home/wangxin/src/github/pidcat-master/pidcat.py com.qihoo.browser"
以后使用pidcatbrowser命令就可以了.
5步完成向github提交代碼
github:
AandK.wangxin2011@gmail.com
830202**
refer to : http://my.oschina.net/apeng/blog/109945
wangxin@wangxin:~/src/github/StrictANR$
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/AandK/StrictANR.git
git push -u origin master
代碼更新:
git status
git add app/src/main/java/com/github/strictanr/testapp/MainActivity.java app/src/main/java/com/github/strictanr/testapp/StrictANRTestApplication.java app/src/main/java/com/github/strictanr/util/StrictANRWatchDog.java app/src/main/res/layout/activity_main.xml
git commit -m "toast a message when strict anr detected"
git push -u origin master
使用APIMonitor
cd /home/wangxin/Downloads/temp/APIMonitor-beta
vim ./config/default_api_collection
./apimonitor.py chrome-debug.apk
adb install chrome-debug_new.apk
pidcatbrowser
使用在線UML工具,對數據結構進行總結.
genmymodel online uml
AandK.wangxin2011@gmail.com
830202**
挺好用的, 就是導出圖片功能要收費. 每月5美元, 還是別用了.
processon
國產的免費在線工具, 用微信登錄.
用Astah畫UML圖
你是砍柴的, 他是放牛的.
在工作中, 還是應該放松心態, 抱著寬厚的心態和別人交流, 我找了不少時間的uml工具, 一直沒有找到理想的, 突然想起來上次baosheng提到的日本人開發的Astah工具, 是真心的好用阿, 今天用它把數據結構的類圖整理好了, 導出圖片的功能也很好用.
wangxin@wangxin:~/tool/astah_community$ ./astah
文檔保存在:
wangxin@wangxin:~/Documents$ ls
數據結構.asta
wangxin@wangxin:~/Documents$
使用adb bugreport監測耗電情況
refer to :
http://www.kancloud.cn/digest/itfootballprefermanc/100905
http://blog.csdn.net/baniel01/article/details/51954142
wangxin@wangxin:~/tool/battery/battery-historian-master/scripts$ adb shell dumpsys batterystats --enable full-wake-history
Enabled: full-wake-history
wangxin@wangxin:~/tool/battery/battery-historian-master/scripts$ adb shell dumpsys batterystats --reset
Battery stats reset.
//操作一段時間后//
wangxin@wangxin:~/tool/battery/battery-historian-master/scripts$ adb bugreport > bugreport.txt
//google的分析工具
wangxin@wangxin:~/tool/battery/battery-historian-master/scripts$ python historian.py -a bugreport.txt > battery.html
//sony的分析工具
wangxin@wangxin:~/tool/battery/battery-historian-master/scripts$ java -jar ~/Downloads/chkbugreport.jar ./bugreport.txt
用chrome打開生成的html文件, 圖形化顯示耗電情況.
Battery Historian還有一個2.0的版本, 更好用一些.
本地安裝go環境,啟動Battery Historian 2.0 web server, 但卻無法加載本地文件,
找了一個 Battery Historian 2.0 在線分析工具
http://23.251.148.173/
可以使用.
使用dump View Hierarchy for UI automator快速定位界面上某個view的id
注意: 要使用android 6.0的手機才能顯示view的id.
混淆后的類名需要到build服務器下載mapping.txt去映射到對應的原始類名
今天報過來一個ANR log, backtrace如下:
at android.os.Environment.isExternalStorageRemovable(Environment.java:749)
at java.lang.reflect.Method.invoke!(Native method)
at com.a.bs.c(unavailable:-1)
at com.a.bs.f(unavailable:-1)
at com.a.bs.b(unavailable:-1)
但com.a.bs.b 是混淆后的類型和方法名, 項目代碼中是搜不到的, 需要使用mapping.txt進行映射才能找到代碼中對應的類.
com.loc.di -> com.a.bs:
android.content.Context a -> a
int b(java.lang.Object,java.lang.String,java.lang.Object[]) -> b
實際的位置是: 高德sdk AMap_Location_V2.4.0_20160308.jar中的di.class類.
package com.loc;
public class di {
...
}
在native C++文件中添加log
//添加native log in C++ file.
#include "base/logging.h"
LOG(WARNING) << "ahking log";
//編譯 chromium
python runhooks_android.py
cd src/
ninja -C out/Release chrome_public_apk
//替換so庫到android studio
wangxin@wangxin:~/src/src_chromium_begin/src$ cp ./out/Release/chrome_public_apk/libs/armeabi-v7a/libchrome_public.so ./chrome/android/java/libs/armeabi-v7a/libchrome_public.so
//log output:
12-12 15:11:42.042 23172-23172/com.qihoo.browser W/chromium: [WARNING:password_manager.cc(674)] ahking log, PasswordManager::AskUserOrSavePassword()
定制app crash頁面
使用開源項目, 實際效果很不錯, 比一個傻傻的crash dialog顯示給用戶, 要用戶體驗好的多.
https://github.com/Ereza/CustomActivityOnCrash