在android中,可以利用service命令去做很多除錯工作,例如service list
命令顯示系統當前所有在service manager註冊的service,其命令具體使用如下,
# service
service
usage: service [-h|-?]
service list
service check service
service call service code [i32 int | s16 str] ...
options:
i32: write the
integer int into
thesend parcel.
s16: write the utf-16
string str into
thesend parcel.
主要用法有三個:
1.service list,顯示系統當前所有在service manager註冊的service;
2.service check service,查詢service是否存在;
3.service call service,可以通過binder給service傳送code,還可以向service傳送intent等,具體**分析如下。
**在frameworks\native\cmds\service\service.cpp
,其makefile為
local_path
:= $(call my-dir)
include
$(clear_vars)
local_src_files
:= \
service.cpp
local_shared_libraries
:= libutils libbinder
ifeq ($(
target_os),linux)
local_cflags += -dxp_unix
#local_shared_libraries += librt
endif
#編譯為應用程式service
local_module
:= service
include
$(build_executable)
在main()函式中,
int main(int argc, char* const argv)
else
}//③ 呼叫service list
else
if (strcmp(argv[optind], "list") == 0)
}//④ 呼叫service call
else
if (strcmp(argv[optind], "call") == 0)
data.writeint32(atoi(argv[optind++]));
}//傳遞string
else
if (strcmp(argv[optind], "s16") == 0)
data.writestring16(string16(argv[optind++]));
}//傳遞個null,只寫個strongbinder
else
if (strcmp(argv[optind], "null") == 0) //還能傳送intent,這個應該是傳送給activitymanagerservice
//然後activitymanagerservice將intent重組,
//啟動需要的activity等
else
if (strcmp(argv[optind], "intent") == 0)
else
if (strcmp(key, "data") == 0)
else
if (strcmp(key, "type") == 0)
else
if (strcmp(key, "launchflags") == 0)
else
if (strcmp(key, "component") == 0)
else
if (strcmp(key, "categories") == 0)
}optind++;
} writestring16(data, action);
writestring16(data, dataarg);
writestring16(data, type);
data.writeint32(launchflags);
writestring16(data, component);
if (categorycount > 0)
}else
// for now just set the extra field to be null.
data.writeint32(-1);
} else
}//直接在bpbinder上呼叫transact,傳送code
service->transact(code, data, &reply);
aout << "result: "
<< reply << endl;
} }
上面**主要包括4部分:
1.獲取service manager的**物件bpservicemanager;
2.呼叫service check service,其實就是呼叫bpservicemanager->checkservice
;
3.呼叫service list,其實就是呼叫bpservicemanager->listservices
;
4.呼叫service call,首先去獲取service的bpbinder,後續直接呼叫transact函式向service傳送code,其中命令引數可以包含i32(int),s16(string),null,intent(intent後需要自己組織intent的引數,這個應該是傳送給activitymanagerservice,然後activitymanagerservice將intent重組,啟動需要的activity)。
舉個call的例子,在《android graphic(9)—開發者選項關閉hw overlays 》中分析了通過開發者選項關閉hw overlays,這裡也可以通過service 命令向su***ceflinger命令傳送1008的code。
//關閉hw overlays,code為1008,乙個引數為int的1
# service call su***ceflinger 1008 i32 1
android 除錯常用命令
1.檢視機器當前記憶體使用情況以及剩餘量 adb shell dumpsys meminfo 2.檢視lib庫當前版本資訊 串列埠輸入 busybox strings system lib libstagefright.so busybox grep author 3.檢視ddr當前執行頻率,找到d...
android手機adb除錯程式命令
adb devices 顯示當前裝置 adb logcat v time 1229.txt 在當前目錄生成1229.txt log檔案,可以先執行該命令,再操作手機 adb shell cd data data com.kedacom.monitor lib 第二部分 android 下使用tcpd...
android除錯工具adb命令大全
一 adb介紹 sdk的tools資料夾下包含著android模擬器操作的重要命令adb,adb的全稱為 android debug bridge就是除錯橋的作用。通過adb我們可以在eclipse中方面通過ddms來除錯android程式。借助這個工具,我們可以管理裝置或手機模擬器的狀態。還可以進...