接到一個內建功能的需求,然後看了一下是由上層應用 + linux程序實作的功能,需要增加開機自動啟動linux程序,沒弄過有點懵。
環境
- android 9.0
- mtk 平台
實作思路
因為內建的功能隻是demo狀态,對應的功能提供公司隻提供的是三個apk,5個動态庫(*.so),一個linux可執行程式和一個可執行程式的配置檔案。
在linux可執行程式執行之前,這個功能還需要設定一個環境變量,嘗試了幾種方式,改變檔案放置位置、權限,但是最終還是失敗告終。有點沮喪了,重新分析一次,決定要用shell實作設定環境變量,接着執行linux可執行程式,最終是這種方式實作了。
實作
1. 編寫shell
通過shell腳本實作設定環境變量,再啟動目标linux程序
shell檔案/system/bin/acr/startacr.sh
#!/system/bin/sh
#因為這個linux可執行程式需要在可寫目錄執行,需要在對應目錄寫入記錄檔案,是以這裡切換到可寫的data目錄
cd /data/
#因為需要,先設定環境變量
export LD_LIBRARY_PATH=/mnt/vendor/linux_rootfs/lib:/system/bin/acr
#執行linux程式
/system/bin/acr/alacr
2. 配置開機啟動shell腳本
需要修改init.rc檔案(所在目錄:system\core\rootdir,有些平台在device/projectName/也可以),實作開機啟動shell腳本,具體的init.rc文法可以看深入分析AIL語言及init.rc檔案
直接在init.rc檔案後面加入就好。
因為我這個linux程序需要在root權限執行,是以user、group設定了root,如果不設定是目前使用者,并不是root使用者
注意:在網上看到有人說名字不應超過16個字元,沒試過。如果還是啟動不了,嘗試将service後面的程序名字應該跟腳本的名字一緻
service startacr /system/bin/acr/startacr.sh
user root
group root
class main
oneshot
class main 就實作開機執行了,并不需要在on property:sys.boot_completed=1 後面添加start startacr
3. 增加需要的權限
在shell 腳本啟動的前,還需要設定selinux的權限
1) 在 下面增加一個.te檔案,檔案名字需要與執行的shell腳本一緻,這裡增加startacr.te檔案
permissive startacr 在調試階段需要這一句,這樣權限就可以獲得豁免,并且在logcat中可以列印出需要的權限
#####################
# startacr sh selinux
#
#####################
type startacr, domain,coredomain;
type startacr_exec, exec_type, file_type;
init_daemon_domain(startacr)
permissive startacr
2) 修改檔案device/projectName/seplolicy/file_contexts,增加可執行權限。
在編譯進去之後,可以通過在 /system/bin/acr/目錄,執行ls -Z filePath,可以看到檔案增加了可執行權限。
/system/bin/acr/startacr.sh u:object_r:startacr_exec:s0
3)在te檔案中增權重限,在logcat中找到
avc: denied { search } for pid=11710 comm="startacr.sh" name="sh" dev="mmcblk0p21" ino=502 scontext=u:r:startacr:s0 tcontext=u:object_r:shell_exec:s0 tclass=file permissive=1
根據規則allow scontext tcontext : tclass permission在startacr.te後面增加對應的權限。
allow startacr shell_exec:file { search };
permissive=1 這是權限已經獲得,這裡隻是列印,不存在權限問題了,但是後面正式版本的時候,應該加上對應缺少的權限,去掉permissive startacr。
4 編譯不通過
編譯不通過,可能是使用了一些noallow的權限,那也是因為在te檔案中給可執行程式的權限不夠,例如增加coredomain,然後就不會提示一些權限的noallow。這一類問題應該不要在百度搜尋,找不到。
總結
在處理這個問題的過程中,因為沒有配過這些,還是遇到很多問題,并且一開始嘗試的方式都不多,還是花了很長時間,有人可以請教一下就是最好的,少走彎路,就像需要配置te檔案,我一開始隻是以為隻需要增加可執行權限就可以了,但是在init.rc中配置了權限,但是有問題。
檔案在system/bin目錄下面,直接使用PRODUCT_COPY_FILES實作檔案複制。