1. 程式人生 > >利用strace除錯關機充電服務程式

利用strace除錯關機充電服務程式

使能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