顯示廣告
隱藏 ✕
看板 million
作者 emulators (模擬器)
標題 [note] 作業 Android init 做法紀錄
時間 2014年09月17日 Wed. PM 04:06:19


1.在init.c中加入log,在Android init時將init.rc 中,執行的所有command 及參數印出。Hint: dmesg, execute_one_command

解法:
用 ERROR(); function, android在執行 init 程序時, 會把 init.rc 內容全部解析一遍, 放入queue裡
再用execute_one_command() 去 de-queue,

所以只要修改 /system/core/init.c 中的 execute_one_command() 內, 用 cur_command 這個結構去抓每個 node,
把 node 抓出來的 cur_command->args[i] 抓成字串印出來就好




2.加入自己的service其功能滿足以下幾點需求
a.User/Group  = System/System
b.此service被kill後service不restart
c.在init時get 5個property之值並印出log
d.當5個 property 之中任一改變時(setprop),僅將此property改變log印出
e.此service單獨定義在init.demo.rc(自行新增)

解法:
自創一個 init.demo.rc 在 build/target/product/ 裡面.
修改 build/target/product/aosp_arm.mk, 加入 5個自訂的 property. 並且指定要 複製檔案:
$(SRC_TARGET_DIR)/product/init.demo.rc:root/init.demo.rc
這樣, init.demo.rc 在build system image 時就會被複製到根目錄中. 即滿足 e.
aosp_arm.mk 還要加入 PRODUCT_PACKAGES += <自訂的可執行檔名> 才會一起包起來build.

修改 system/core/rootdir/init.rc, import /init.demo.rc 則該檔案就會自動被抓進來.  
在 init.demo.rc 裡面新增自己的 service, 指定user/group 即滿足a, oneshot 即滿足 b
列出路徑 (目前固定位置都在system/bin/myservice )

自己在 system/core 底下新增資料夾, 自建一個 service.c, 內有無窮迴圈, 持續讀出自訂的 5 個 property 值
使用 ALOGE() 巨集即可用 logcat 觀察印出文字. 做好即滿足 c. d.
自增資料夾內再多創一個Android.mk, 指定 module 名稱, include $(BUILD_EXECUTABLE), LOCAL_PATH:=$(my-dir)
LOCAL_SRC_FILES:= service.c  LOCAL_SHARED_LIBRARIES:=libcutil

build system image 即可滿足

--
※ 作者: emulators 時間: 2014-09-17 16:06:19
※ 編輯: emulators 時間: 2014-09-17 17:01:52
※ 看板: million 文章推薦值: 0 目前人氣: 0 累積人氣: 630 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇