grepandroid
① Android性能測試(內存、cpu、fps、流量、GPU、電量)——adb篇
3)查看進程列表:adb shell "ps",同時也能獲取到應用的UID,方式如下(不需root許可權):
u0_a開頭的都是Android的應用進程,Android的應用的UID是從10000開始,到19999結束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a後面的數字就是該應用的UID值減去FIRST_APPLICATION_UID所得的值,所以,對於截圖這個應用進程,它是u0_a155,按前面的規制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。
VSS - Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS - Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PSS - Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
USS - Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
一般來說內存佔用大小有如下規律:VSS >= RSS >= PSS >= USS
使用 adb shell "mpsys meminfo -s <pakagename | pid>"命令,輸出結果分以下4部分:
PS:在apk內調用運行獲取其他app的內存數據則需要root許可權
adb命令:adb shell mpsys gfxinfo <package | pid>
正常情況下幀率應該在16.67ms左右,1秒60幀,執行結果如下:
詳細計算方法如下:
還有一個命令是: adb shell mpsys SurfaceFlinger --latency LayerName
其中LayerName在各個不同系統中獲取的命令是不一樣的
在Android 6系統直接就是SurfaceView
在Android 7系統中可以通過 mpsys window windows | grep mSurface | grep SurfaceView 然後通過數據截取到
在Android 8系統中可以通過 mpsys SurfaceFlinger | grep android包名獲取到
執行命令結果如下:
計算方法比較簡單,一般列印出來的數據是129行(部分機型列印兩次257行,但是第一部分是無效數據,取後半部分),取len-2的第一列數據為end_time,取len-128的第一列數據為start_time
fps = 127/((end_time - start_time) / 1000000.0)
至於為啥要取第一列數據,這里不做過多介紹,歡迎參看這兩篇文章
老羅的文章SurfaceView原理
Android性能測試之fps獲取
至於為啥要處於1000000,因為命令列印出來的是納秒單位,要轉為毫秒進行計算,127就是因為命令一次列印出來127幀的數據而已
有兩種方法可以獲取
1) adb shell "top -n 5 | grep <package | pid>" ,第三列就是實時監控的CPU佔用率(-n 指定執行次數,不需root許可權),這邊top命令執行需要2到3s左右,一般可以採用busybox 的top命令執行,效率會快很多
2) adb shell "mpsys cpuinfo | grep <package | pid>"
兩種方法直接區別在於,top是持續監控狀態,而mpsys cpuinfo獲取的實時CPU佔用率數據
adb命令:adb shell "mpsys batterystats < package | pid>" (Android 5.0後引入)
獲取單個應用的耗電量信息,具體返回結果待研究
adb命令:adb shell "mpsys battery"
出現信息解讀:
AC powered:false 是否連接AC(電源)充電線
USB powered:true 是否連接USB(PC或筆記本USB插口)充電
Wireless powered:false 是否使用了無線電源
status: 1 電池狀態,2為充電狀態,其他為非充電狀態
level:58 電量(%)
scale: 100. 電量最大數值
voltage: 3977 當前電壓(mV)
current now: -335232. 當前電流(mA)
temperature:355 電池溫度,單位為0.1攝氏度
adb 命令:adb shell "mpsys< package | pid> | grep UID" [通過ps命令,獲取app的UID(安裝後唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat為查看命令,讀取tcp_rcv獲取應用接收流量信息(設備重啟後清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat為查看命令,讀取tcp_snd獲取應用發送流量信息(設備重啟後清零)]
計算流量消耗步驟:
或者還有一種方式獲取應用流量消耗:
首先判斷類型:
cat /sys/class/thermal/thermal_zone*/type
只有紅框框出來的是有效的
cat /sys/class/thermal/thermal_zone*/temp
獲取CPU溫度
mpsys battery | grep temperature 單位0.1攝氏度
獲取/proc/stat文件內容(無許可權限制)
總的cpu時間片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌時間為 notidle = user+nice+system +iowait+irq+softirq
cpu使用率計算方法為,先取開始的total值和忙碌時間notidle,隔一段時間片,再取一次計算total2,notidle2, cpuuse = (notidle2 – notidle) * 100 / (total2 - total)%
PS:由於Android 8許可權收緊,在Android 8系統手機內apk內讀取文件內容為空,需要shell許可權才可獲取文件內容,下同
讀/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是幾核手機,scaling_cur_freq是否存在也不一定,需要判斷
至於為啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系統獲取的時候,這個文件shell沒有讀取許可權,需要root許可權
參考文章: https://blog.csdn.net/long_meng/article/details/45934899
Android 6,7系統可執行
mpsys window windows | grep "mCurrentFocus"
執行結果一般為類似:
mCurrentFocus=Window{81caaa5 u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity}
按照一定規則把com.tencent.mobileqq提取出來即可
直接apk內讀取文件即可,不需要shell許可權(支持到Android8)
Gpu使用率獲取:會得到兩個值,(前一個/後一個)*100%=使用率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy
Gpu工作頻率:
adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq
Gpu最大、最小工作頻率:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq
Gpu可用頻率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies
Gpu可用工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors
Gpu當前工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor
② adb logcat和grep命令的使用
在日常開發中Log的作用必不可少,AS中集成的logcat已經很方便,
但是有時候需要輸出的log數據量很大結果被沖掉了,這時就可能要把logcat輸出到文件,然後再進行分析。
這篇文章主要介紹了adb logcat命令行的使用以及結合grep很方面的過濾自己想要的內容並且輸出到文件中
下面內容轉自: https://blog.csdn.net/f2006116/article/details/89077030
android輸出的每一條日誌都有一個標記和優先順序與其關聯。
優先順序是下面的字元,順序是從低到高:
如下是一個日誌輸出的消息,LEVEL是「D」,TAG是「PowerManagerService」:
LEVEL:可以選擇: [V D I W E ] 中其中一個
TAG:X 的作用為: 輸出標簽為TAG的log級別大於X的信息.
例如:
注意:
(1)可以指定多個[TAG:LEVEL ]
(2)[TAG:LEVEL ] 不會影響其他標簽的日誌, 所以如果要屏蔽其他log請使用 *:S
如下命令 僅輸出標記為「ActivityManager」且優先順序大於等於「Info」
和 標記為「PowerManagerService」並且優先順序大於等於「Debug」的日誌:
命令行中使用adb logcat命令查看android系統和應用的log,按ctrl+c中斷輸出log記錄。
通過管道使用 grep 過濾,可以使用 grep 強大的正則表達式匹配,方便的輸出自己需要的tag
進階一點可以使用 grep 的正則表達式匹配。
例如上一個例子會匹配一行中任意位置的 MyApp,可以設置為僅匹配 tag。
默認的 log 輸出如下(如果修改過輸出格式相應的表達式也要修改):
可以看出 tag 是一行開頭的第三個字元開始,根據這點寫出表達式:
根據這個格式也可以設置只顯示某個優先順序的 log,再匹配行首第一個字元即可。
例如僅顯示 Error 級別 tag 為 MyApp 的輸出:
當然也可以匹配多個,使用 | 分割多個匹配表達式, 要加轉義符 。
例如要匹配 tag 為 MyApp 和 MyActivity 的輸出:
還是使用 grep,用法也跟上面的一樣,加一個 -v 即可。
例如要過濾 tag 不為MyApp 和 MyActivity 的輸出:
有時一個程序裡面的 tag 有多個,需要輸出該程序(同一個 PID)的所有 tag。
僅使用 tag 過濾有時也會漏掉一些錯誤信息,而一般錯誤信息也是和程序同一個 PID。
還是通過 grep 實現,思路是先根據包名找到 pid 號,然後匹配 pid。
寫成 shell 腳本如下,參數是程序的 java 包名(如 com.android.media)。
logcat 有緩存,如果僅需要查看當前開始的 log,需要清空之前的。
有時需要分析 log 文件,過濾 log 文件還是使用 grep。使用">"操作符
例如 log 文件為 myapp.log,要匹配 tag 為 MyApp 和 MyActivity 的輸出,然後輸出到 newmyapp.log:
以上的技巧主要用到了 grep,其實 logcat 本身也有過濾功能,可以根據 tag、優先順序過濾 log,
具體請參考 Android 官方文檔Reading and Writing Logs。
③ android利用adb命令,獲取當前界面(當前Task的棧頂).
開發項目中經常會遇到很多手機廠商製造的麻煩.如涉及許可權,程序授權(受信任應用),或service自啟動管理等.由於android手機種類繁多,廠商自製系統各自為王.弄得我們有時不得不針對固定的廠商或機型做定製開發.
本文就提供一種靠adb命令獲取手機當前activity的方法!
1.首先 要配置adb環境變數 這里就不多說了,自己網路就好了,非常簡單!
2.配置好環境變數後,就可以運用adb 命令了.
以OPPO r9S獲取自啟動管理界面為例:
將手機調好到指定界面後:打開cmd 輸入
1) adb devices //查看鏈接設備
adb shell mpsys activity top //獲取棧頂activity
![Q%T]T N0RQ0X{@ GP~TVZFG.png]( http://upload-images.jianshu.io/upload_images/3995903-d4895ea759168dc6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
2) 1.cmd命令中輸入:adb shell 進入shell命令模式
2.shell中輸入:logcat | grep ActivityManager 真機運行應用,可以實時 查看當前正在運行的Activity;
或者也可以用第二種方法.
至於用那種,看界面吧,這里第二種就不貼圖了.讀者自己去嘗試吧!
補充:已測試手機(為service開啟自啟動或設置受保護程序);
移植toolbox到普通Linux系統中
toolbox是Android中專用的busybox,從嵌入式Linux轉過來都會大大地吐槽功能簡陋。但實質上也有很多特有的很好用的功能。比如getevent命令來調試所有的輸入事件。已經靜態編譯出來了(下載地址:toolbox 靜態編譯),這里記錄一下移植過程。
原本以為會很難,所以一直放很久才開始做,最終很簡單,只需要稍加修改Android.mk就可以編譯出一個靜態鏈接的toolbox。以下diff文件就是改動信息。
diff --git a/system/core/toolbox/Android.mk b/system/core/toolbox/Android.mk
index 086ba0d..d5aef3b 100755
--- a/system/core/toolbox/Android.mk
+++ b/system/core/toolbox/Android.mk
@@ -91,6 +91,7 @@ LOCAL_SRC_FILES := \
grep/grep.c grep/fastgrep.c grep/file.c grep/queue.c grep/util.c
LOCAL_SHARED_LIBRARIES := libcutils libc libusbhost
+LOCAL_STATIC_LIBRARIES := libc libcutils
LOCAL_C_INCLUDES := bionic/libc/bionic
@@ -102,6 +103,7 @@ LOCAL_C_INCLUDES += external/libselinux/include
endif
+LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE := toolbox
# Including this will define $(intermediates).
然後進行編譯就自動編譯成了靜態鏈接的了。
$ file out/target/proct/xxx/system/bin/toolbox
out/target/proct/xxx/system/bin/toolbox: ELF 32-bit LSB executable, ARM, \
version 1 (SYSV), statically linked, stripped
$12341234
當然,我沒有編譯所有的CPU架構的,只是編譯了ARMv7的,所以比較低的架構或者其它CPU可能不能直接使用,那麼就自行編譯吧。
<完>
⑤ 使用grep和cut命令 如何截取某一段文字
這應該是個模式匹配的問題, 用 awk或sed命令比cut更有實際意義!
cmd | grep 'ACCESS_WIFI_STATE' | cut -d \" -f 2 | cut -d . -f 3
(5)grepandroid擴展閱讀:
Python在設計上堅持了清晰劃一的風格,這使得Python成為一門易讀、易維護,並且被大量用戶所歡迎的、用途廣泛的語言。
設計者開發時總的指導思想是,對於一個特定的問題,只要有一種最好的方法來解決就好了。這在由Tim Peters寫的Python格言(稱為The Zen of Python)裡面表述為:There should be one-- and preferably only one --obvious way to do it. 這正好和Perl語言(另一種功能類似的高級動態語言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。
Python的作者有意的設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。其中很重要的一項就是Python的縮進規則。
一個和其他大多數語言(如C)的區別就是,一個模塊的界限,完全是由每行的首字元在這一行的位置來決定的(而C語言是用一對花括弧{}來明確的定出模塊的邊界的,與字元的位置毫無關系)。這一點曾經引起過爭議。因為自從C這類的語言誕生後,語言的語法含義與字元的排列方式分離開來,曾經被認為是一種程序語言的進步。不過不可否認的是,通過強製程序員們縮進(包括if,for和函數定義等所有需要使用模塊的地方),Python確實使得程序更加清晰和美觀。
⑥ 如何獲取android源代碼
當前的Android代碼託管在兩個方:https://github.com/android 和https://android.googlesource.com之前在 android.git.kernel.org上也有託管,不過現在重定向到了https://android.googlesource.com好在都支持git訪問。
google提供的repo工具實際上是一個內部操作git工具來簡化操作Android源碼的Python腳本。經過嘗試,直接使用git工具在ubuntu下可以實現cloneAndroid源碼。下面介紹一下方法:
1.獲取當前的在github上託管的Androidgitrepositories:
github頁面為:https://github.com/android/following。不過這個頁面不支持通過wget"https://github.com/android/following"或者curl"https://github.com/android/following"的方式訪問,錯誤信息如下:
這個時候需能做的只能是"tryagain"了。
需要說明的是"不要試圖同時並發執行多個gitclone命令",這樣會導致大量出現上面貼圖中的錯誤,另外,整個clone過程中耗時最多的gitrepository如下:
kernel_common.gitkernel_msm.gitplatform_frameworks_base.gitplatform_prebuilt.git其中platform_prebuilt.git是google提供的預編譯好的二進制文件,包含:各種庫文件,jar包,可執行程序等等,如果只是閱讀Android源代碼,這個gitrepository可以不用clone.
⑦ ANDROID 多用戶
從 Android L(5.0)開始引入多用戶 API。直到目前,基本上都是隱藏 api 或者需要系統簽名才能持有」managed_user" 許可權。
Android 的這個 「用戶」 並不是等同於 linux 下的用戶概念。Android 是基於 Linux 的 OS,Linux 下有一套自己的賬戶管理體系,而 Android 對此有一些封裝和改動。同時,Android 也引進了自己的多用戶功能。
Linux是多用戶系統,每個用戶都擁有一個uid,這個uid由系統和用戶名做映射綁定。同時,為了便於用戶管理(譬如管理文檔許可權),Linux引入了群組的概念,可以將多個用戶歸於一個群組。每一個群組擁有一個群組id(gid)。
以第三方應用為例做說明:
一個應用被安裝後, 系統給分配唯一的 "Application ID", 簡稱" AppId "。同時系統中會有多個用戶 (User), 每個用戶也有一個唯一的 ID 值, 稱為" UserId " 。
Android 這里的 "UserId" 跟 Linux 的 UserId 完全不是同一個東西。UserId 10000 + appId 才等於 Linux 下的 UserId, 即進程所屬用戶的概念, 在 Android 我們通常記做 " uid *",以下以微信為例作為說明:
可以看到微信創建了 2 個進程,其第一列 USER 欄位均為 u0_a110,這個 u0_a110 就是 uid(有人也說a110是uid)。
這個欄位這樣拆解成 int 值:
uid 就對應 Linux 系統里 "進程所屬用戶的概念"
在 Android 系統里, 我們可以很容易發現:
可以通過 adb shell mpsys package com.android.systemui | grep "uid" 簡單的得到安裝應用的uid
通過源碼可以看到,UserHandle包含三種概念:userid、uid、appid
userid :就是有多少個實際的用戶,即手機里的主機、訪客等多用戶。
uid :上文講過他跟應用進程相關,除了shareid的應用,每個用戶的每個應用的uid不一樣的。
appid :跟app相關,包名相同的appid都一樣,即使是不同用戶。
⑧ 如何在linux下配置AndroidStudio開發環境
1、系統環境
[android@localhost ~]$uname -a
Linux localhost.localdomain 2.6.32-71.el6.i686 #1SMP Wed Sep 1 01:26:34 EDT 2010 i686 i686 i386 GNU/Linux
[android@localhost ~]$lsb_release -a
LSB Version: :core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch
Distributor ID: RedHatEnterpriseServer
Description: Red Hat Enterprise Linux Server release 6.0 (Santiago)
Release: 6.0
Codename: Santiago
[android@localhost ~]$
2、准備軟體
java
eclipse
android-sdk
ADT
這些軟體都可以在官網上下載。
3、搭建過程
(1) 安裝java
[android@localhost ~]$ rpm -qa | grep java
eclipse-mylyn-java-3.3.2-4.5.el6.i686
java-1.6.0-openjdk-devel-1.6.0.0-1.21.b17.el6.i686
java-1.6.0-openjdk-1.6.0.0-1.21.b17.el6.i686
tzdata-java-2010l-1.el6.noarch
gcc-java-4.4.4-13.el6.i686
java-1.5.0-gcj-1.5.0.0-29.1.el6.i686
subversion-javahl-1.6.11-2.el6.i686
ooobasis3.3-javafilter-3.3.0-9567.i586
libvirt-java-0.4.5-2.el6.noarch
lpg-java-compat-1.1.0-4.1.el6.noarch
libvirt-java-devel-0.4.5-2.el6.noarch
mysql-connector-java-5.1.12-2.el6.i686
ant-javamail-1.7.1-13.el6.i686
java-1.6.0-openjdk-javadoc-1.6.0.0-1.21.b17.el6.i686
java_cup-0.10k-5.el6.i686
[android@localhost ~]$
通過命令查看當前已經安裝了java的相關jdk,可以進行下一步。
(2) 安裝eclipse
從官網上下載的eclipse不需要按裝,直接解壓即可使用。如:
[android@localhost Base Env]$ ls
ADT-18.0.0.zip
android-sdk_r18-linux.tgz
Android開發環境搭建(Linux篇).doc
eclipse
eclipse-cpp-indigo-SR2-incubation-linux-gtk.tar.gz
Linux環境搭建.doc
Linux 下Android 開發環境搭建 .doc
[android@localhost Base Env]$ rm -R eclipse
[android@localhost Base Env]$ ls
ADT-18.0.0.zip
android-sdk_r18-linux.tgz
Android開發環境搭建(Linux篇).doc
eclipse-cpp-indigo-SR2-incubation-linux-gtk.tar.gz
Linux環境搭建.doc
Linux 下Android 開發環境搭建 .doc
[android@localhost Base Env]$tar -zxfeclipse-cpp-indigo-SR2-incubation-linux-gtk.tar.gz
[android@localhost Base Env]$ls
ADT-18.0.0.zip
android-sdk_r18-linux.tgz
Android開發環境搭建(Linux篇).doc
eclipse
eclipse-cpp-indigo-SR2-incubation-linux-gtk.tar.gz
Linux環境搭建.doc
Linux 下Android 開發環境搭建 .doc
[android@localhost Base Env]$cd eclipse
[android@localhost eclipse]$ls
about_files configuration eclipse.ini icon.xpm p2
about.html dropins epl-v10.html libcairo-swt.so plugins
artifacts.xml eclipse features notice.html readme
[android@localhost eclipse]$ll
總用量 540
drwxrwxr-x. 2 android android 4096 2月 17 03:06 about_files
-rw-rw-r--. 1 android android 18909 2月 8 21:55 about.html
-rw-rw-r--. 1 android android 88246 2月 17 03:06 artifacts.xml
drwxrwxr-x. 5 android android 4096 2月 17 03:06 configuration
drwxrwxr-x. 2 android android 4096 2月 17 03:06 dropins
-rwxr-xr-x. 1 android android 62814 2月 8 22:16 eclipse
-rw-rw-r--. 1 android android 407 2月 17 03:06 eclipse.ini
-rw-rw-r--. 1 android android 6 2月 8 21:36 epl-v10.html
drwxrwxr-x. 46 android android 4096 2月 17 03:06 features
-rw-rw-r--. 1 android android 9022 2月 8 21:54 icon.xpm
-rwxr-xr-x. 1 android android 266168 2月 8 21:54 libcairo-swt.so
-rw-rw-r--. 1 android android 8951 2月 8 21:36 notice.html
drwxrwxr-x. 5 android android 4096 2月 17 03:05 p2
drwxrwxr-x. 10 android android 36864 2月 17 03:06 plugins
drwxrwxr-x. 2 android android 4096 2月 17 03:06 readme
[android@localhost eclipse]$./eclipse
啟動eclipse之後,eclipse會自動創建並尋找workspace文件夾,可以直接點擊ok按鈕即可。eclipse的啟動過程如下圖所示:
⑨ 在windows情況下,如何使用adb grep命令。求大神告知。望詳細!
裝一個Cygwin Terminal,安裝需要的工具就行了。