1:做個腳本去實現拷貝APK都data/app目錄下面:
#!/vendor/bin/sh
sleep 1
cp /system/pre_install/RunUiTest/RunUiTest.apk /data/app/
chmod 777 /data/app/RunUiTest.apk
2:把腳本加入編譯:
1》把腳本放到device/qcom/common/rootdir/etc/copy_apps.sh目錄下面,
2》修改device/qcom/common/base.mk
INIT += copy_apps.sh
3》修改device/qcom/common/rootdir/Android.mk
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
+LOCAL_MODULE := copy_apps.sh
+LOCAL_MODULE_TAGS := optional eng
+LOCAL_MODULE_CLASS := ETC
+LOCAL_SRC_FILES := etc/copy_apps.sh
+LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
LOCAL_MODULE := init.class_main.sh
LOCAL_MODULE_TAGS := optional eng
LOCAL_MODULE_CLASS := ETC
3,啓動這個SH腳本當服務:
修改添加啓動服務:
device/qcom/common/rootdir/etc/init.qcom.rc
添加:
+service copy_apps /vendor/bin/copy_apps.sh
+ class core
+ user root
+ oneshot
此處不需要去想正常的服務啓動一樣去添加TE的啓動判斷:
+#on property:sys.boot_completed=1
+# start copy_apps
4,要啓動服務,必須給這個服務加個SELinux domain
但是我們的sh腳本可以直接添加到qti_init_shell_exec系統已有的,所以不需要去單獨添加te文件來做這個domain新增的進程增加域、執行權限
修改device/qcom/sepolicy/common/file_contexts
添加:
+/(vendor|system/vendor)/bin/copy_apps.sh u:object_r:qti_init_shell_exec:s0
到此就結束了。
附帶不需要的TE文件內容:
########################################
# sepolicy rules for copy_apps
########################################
type copy_apps, domain;
type copy_apps_exec, exec_type, vendor_file_type, file_type;
domain_auto_trans(init, copy_apps_exec, copy_apps);------代碼都用這個,沒有去管它什麼意思
#init_daemon_domain(copy_apps);-------------網上都用這個
#allow copy_apps sysfs:file { read open };
如果是要加獨立te的方式,那device/qcom/sepolicy/common/file_contexts的修改要換成自己的te:
/vendor/bin/copy_apps.sh u:object_r:copy_apps_exec:s0
這樣會報很多avc權限問題,自己log打印有很多,但是apk還是正常拷貝過去了,~~
題外話:
正常的服務啓動是要加te文件,因爲有很多權限,針對log報什麼avc就加對應的權限文件
下面有關別人的解說拷貝轉載:供TE添加參考:
沒有定義SELinux domain,導致服務xxx無法自啓動。爲了解決這個問題我們按如下方式修改或添加sepolicy文件:
修改seplicy/file_contexts文件,添加以下內容:/system/bin/xxx u:object_r:xxx_exec:s0
- 1
需要爲新增的進程增加域、執行權限
type xxx, domain;
type xxx_exec, exec_type, file_type;
然後啓用這個域
init_daemon_domain(xxx)