利用strace除錯關機充電服務程式
阿新 • • 發佈:2018-12-16
使能strace
external/strace/Android.mk 補丁如下:
--- a/Android.mk +++ b/Android.mk @@ -232,7 +232,7 @@ LOCAL_C_INCLUDES_x86_64 := $(LOCAL_PATH)/linux/x86_64 $(LOCAL_PATH)/linux LOCAL_MODULE := strace -LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) LOCAL_MODULE_TAGS := debug
strace預設會編譯到TARGET_OUT_OPTIONAL_EXECUTABLES,其實是在system分割槽裡,為了簡化我們的編譯過程,我們這裡把它修改到TARGET_ROOT_OUT_SBIN,這樣我們不用耗時重新編譯system分割槽,只需要編譯bootimage分割槽即可。strace預設是userdebug才會編譯,所以如果不是userdebug版本,我們還需要修改上面的LOCAL_MODULE_TAGS。
重構charger service
進入到system/core目錄,加入如下patch:
diff --git a/rootdir/init.rc b/rootdir/init.rc index 2c26afe..be4e572 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -711,6 +711,11 @@ on property:security.perf_harden=1 # In device's init.rc, this trigger can be used to do device-specific actions # before shutdown. e.g disable watchdog and mask error handling +service charger /sbin/strace -o /data/charger.strace /charger + class charger + group system graphics + seclabel u:r:healthd:s0 + ## Daemon processes to be run by init. ## service ueventd /sbin/ueventd
這裡主要修改init.rc原因和上面一樣,是為了方便編譯,因為init.rc是儲存在boot分割槽根目錄下的,所以最終我們只需要編譯更新boot分割槽即可。
關鍵的步驟是重構charger service為:
/sbin/strace -o /data/charger.strace /charger
這樣就可以用strace記錄charger執行的相關log到/data/charger.strace檔案中。
配置SElinux
需要配置selinux為permissive,放開strace的執行許可權。
BoardConfig.mk:
BOARD_KERNEL_CMDLINE:=(省略......)androidboot.selinux=permissive