Android 編寫開啟自啟動的指令碼服務
前言
因為公司有一款手機在升級之後使用者找不到內部sdcard 中的資料,分析了主要原因是因為升級前後內部sdcard 的連結的路徑改變了。之前sdcard的資料在/sdcard/emulated/ 目錄下,升級時候放在了/sdcard/emulated/0/ 下面。一個解決方案就是在手機啟動的時候開啟一個指令碼服務檢測一下當前的目錄是否是正確的,如果不對就進行目錄得調整。主要的操作就是mv 操作,效率很高。
目錄
1. 編寫Shell指令碼
2. fs_config.c 提交檔案許可權
3. 增加selinux te 檔案,增加Shell指令碼的一些許可權
4. 新增新增檔案上下文
5. 增加mk 檔案實現編譯拷貝
6. 在init.rc 中加入開機啟動的Service
正文
1. 編寫Shell 指令碼
adjust_sdcard.sh
#!/system/bin/sh i=1 num=0 while : do log -t ota-sdcard "try ..."$i need_adjust=`ls /storage/emulated/ -l |grep "^d"|wc -l` log -t ota-sdcard "need adjust ="$need_adjust if [ "$need_adjust" == "2" ] then log -t ota-sdcard "adjust inner sdcard success ." break else log -t ota-sdcard "try adjust inner adcard dir..." for file in /storage/emulated/* do if test -f $file then echo "move $file -> /storage/emulated/0/${file##*/}" log -t ota-sdcard "move $file -> /storage/emulated/0/${file##*/}" let num++ mv $file /storage/emulated/0/${file##*/} fi if test -d $file && [ ${file##*/} != "0" ] && [ ${file##*/} != "obb" ] then echo "move $file -> /storage/emulated/0/${file##*/}" log -t ota-sdcard "move $file -> /storage/emulated/0/${file##*/}" let num++ mv $file /storage/emulated/0/${file##*/} fi done log -t ota-sdcard "move num = $num" fi sleep 2 i=$(($i+1)) done
具體的功能就是判斷一下目錄結構對不對,如果不對就會呼叫mv 進行目錄的調整。上面的指令碼只是演示了主要的功能,用作除錯用的。用興趣可以看一下。
2. fs_config.c 提交檔案許可權
這個檔案就是設定檔案在系統中的許可權
fs_path_config android_files 中增加 { 00750, AID_ROOT, AID_ROOT, 0, "system/bin/adjust_sdcard.sh" },3. 增加selinux te 檔案,增加Shell指令碼的一些許可權
我們知道Android 4.4 之後引入了selinux的機制,所以我們編寫的Shell的指令碼的中很多命令程式碼都需要給予相應的selinux 許可權。
#ota_sdcard.te type ota_sdcard, domain; type ota_sdcard_exec, exec_type, file_type; init_daemon_domain(ota_sdcard) allow ota_sdcard system_file:file execute_no_trans; allow ota_sdcard shell_exec:file rx_file_perms; allow ota_sdcard storage_file:dir search; allow ota_sdcard fuse:dir {open read search getattr write remove_name rename add_name reparent}; allow ota_sdcard fuse:file {open read getattr write rename create};
4. 增加Shell 指令碼檔案的上下文
/system/bin/adjust_sdcard.sh u:object_r:ota_sdcard_exec:s0
5. 增加mk 檔案實現編譯拷貝
PRODUCT_COPY_FILES += \ device/qcom/msm8916/adjust_sdcard.sh:/system/bin/adjust_sdcard.sh
6. 在init.rc 中加入開機啟動的Service
service ota-sdcard /system/bin/adjust_sdcard.sh class main oneshot 開機作為main 自啟動。
上面的6個步驟是實現整個機制的核心步驟,細節並沒有過多的講述,後面增加每個步驟具體涉及到的知識點。