編輯:關於Android編程
dumpsys是Android自帶的強大debug工具,命令源碼來自dumpsys.cpp文件。
frameworks/native/cmds/dumpsys/dumpsys.cpp
int main(int argc, char* const argv[])
{
signal(SIGPIPE, SIG_IGN);
//獲取ServiceManager
sp<IServiceManager> sm = defaultServiceManager();
fflush(stdout);
if (sm == NULL) {
return 20;
}
Vector<String16> services;
Vector<String16> args;
bool showListOnly = false;
//命令為"dumpsys -l",執行此分支
if ((argc == 2) && (strcmp(argv[1], "-l") == 0)) {
showListOnly = true;
}
if ((argc == 1) || showListOnly) {
//不帶參數的命令為"dumpsys",獲取系統所有的服務
services = sm->listServices();
services.sort(sort_func);
args.add(String16("-a"));
} else {
//帶參數則只獲取指定服務名的信息
services.add(String16(argv[1]));
for (int i=2; i<argc; i++) {
args.add(String16(argv[i]));
}
}
const size_t N = services.size();
if (N > 1) {
// 打印出第一行信息
aout << "Currently running services:" << endl;
for (size_t i=0; i<N; i++) {
//獲取相應的服務
sp<IBinder> service = sm->checkService(services[i]);
if (service != NULL) {
aout << " " << services[i] << endl;
}
}
}
if (showListOnly) {
return 0;
}
for (size_t i=0; i<N; i++) {
sp<IBinder> service = sm->checkService(services[i]);
if (service != NULL) {
if (N > 1) {
aout << "------------------------------------------------------------"
"-------------------" << endl;
aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
}
//調用service相應的dump()方法,這是整個dumpsys命令的精華
int err = service->dump(STDOUT_FILENO, args);
if (err != 0) {
aerr << "Error dumping service info: (" << strerror(err)
<< ") " << services[i] << endl;
}
} else {
aerr << "Can't find service: " << services[i] << endl;
}
}
return 0;
}
從代碼中,可以得出dumpsys
主要工作分為以下4個步驟:
defaultServiceManager()
,獲取ServiceManager對象;sm->listServices()
,獲取系統所有向ServiceManager注冊過的服務;sm->checkService()
,獲取系統中指定的Service;service->dump()
,dumpsys命令的核心還是調用遠程服務中的dump()
方法來獲取相應的dump信息。如果有興趣要了解從源碼角度是如何獲取ServiceManager和Service,可查看文章Binder系列4—獲取ServiceManager,Binder系列6—獲取服務(getService)。
例如常見的指令
dumpsys activity
由前面的原理可知, 先要查詢sm->checkService(“activity”),這裡得到的是ActivityManagerService,那麼也就意味著上述命令等價於調用ActivityManagerService.dump()。 同理其他的命令也是類似的方式。
一.啟動動畫的漸變:以後可能會用到的啟動動畫的效果:效果圖: 主界面: public class MainActivity extends Activity {
本文github地址:https://github.com/YoungBear/MyBlog/blob/master/VolleyLearn.mdVolley是Andro
實現定時器有很多種方式,在這裡我簡單的介紹幾種方式 (1)使用Handler + Runnable的方式 復制代碼 代碼如下: Handler handler = new
在android中,經常要用到幫助、about、關於作者等的提示頁面。類似這樣的頁面:這樣的頁面,我們可以通過AlertDialog對話框來設計。設計一個AboutDia