1. 程式人生 > >Android 7.0 init.rc 執行shell指令碼 ---- 製作一初始化配置檔案

Android 7.0 init.rc 執行shell指令碼 ---- 製作一初始化配置檔案

最近在一個Android 7.0 PDA專案中遇到如下需求:初始化一配置檔案,此配置檔案需要儲存到data分割槽供系統服務和第三方應用進行讀寫操作,另外此配置檔案在系統重啟後保持檔案內容不變,除非恢復出廠才可以恢復成預設配置引數 。因為初始化的配置引數為了方便其它同事修改,這裡就直接將配置檔案直接編譯到系統內的方式實現。大概思路如下:自從Android 增加SELINUX安全機制後,系統檔案許可權為了滿足系統服務和第三方應用都能讀寫的要求,因此我們需要修改SeLinux安全策略相關內容,首先想到在init.rc內拷貝初始化配置檔案到Data分割槽,但是AIL語言沒有判斷檔案存在的功能,因此考慮init.rc內呼叫shell指令碼的方式來滿足需求(shell指令碼語言可以滿足檔案判斷功能)。

這裡只列出需要修改的相關程式碼,本文基於MT6735 Android7.0 軟體平臺,不再累述所遇到的坑,具體如下:

一、建立配置檔案並修改Makefile編譯到系統

建立配置原檔案到如下路徑alps/device/mediatek/mt6735/my_cfg

alps/device/mediatek/mt6735/device.mk 檔案中新增如下一行,系統將會此配置檔案編譯到系統分割槽

PRODUCT_COPY_FILES += $(LOCAL_PATH)/my_cfg:system/etc/my_cfg

二、建立一個Shell指令碼檔案myshell.sh用於拷貝my_cfg配置檔案到data分割槽,myshell.sh同樣按照上述方法將其編譯入系統內

建立指令碼原檔案myshell.sh到如下路徑alps/device/mediatek/mt6735/myshell.sh  其內容如下:

#!/system/bin/sh
mkdir  /data/mycfg/
chown  system.system /data/mycfg
chmod  0777 /data/apkins
if [ -f /data/mycfg/my_cfg ]; then
    echo "my_cfg already exist"
else
    cp  /system/etc/my_cfg /data/my/my_cfg
fi
chmod  0777 /data/mycfg/my_cfg

alps/device/mediatek/mt6735/device.mk

 檔案中新增如下一行,將myshell.sh檔案編譯到系統分割槽

PRODUCT_COPY_FILES += $(LOCAL_PATH)/myshell.sh:system/bin/myshell.sh

三、init.rc內新增執行myshell.sh,這裡我們沒有直接放到init.rc,為了方便直接放入init.rc呼叫到平臺初始化AIL檔案內,如下所示:
alps/device/mediatek/mt6735/init.mt6735.rc 由於需要初始化到data分割槽,這裡新增如下程式碼到on post-fs-data 後 on post-fs-data
……
exec /system/bin/sh /system/bin/apkins.sh
為了給自己在開機狀態下也可以初始化此檔案,添加了service到init.mt6735.rc內,如下所示:
service myshell /system/bin/myshell.sh
        class late_start
        user root
        oneshot
        seclabel u:r:myshell:s0
on property:persist.sys.mycfg=true
        start myshell
四、init.rc內執行shell指令碼需要SeLinux為其放許可權,這裡不累述除錯過程,只列出所需新增的安全策略的相關修改
在檔案alps/device/mediatek/common/sepolicy/full/file_contexts內定義file context 如下所示
/system/bin/myshell.sh        u:object_r:myshell_exec:s0
然後新增myshell_exec相對的安全策略檔案device/mediatek/common/sepolicy/full/myshell.te,其內容如下所示
type myshell, domain;
type myshell_exec,exec_type, file_type;
init_daemon_domain(myshell)
allow myshell system_file:file { read open getattr };
allow myshell self:capability{ chown fowner fsetid setuid setgid dac_override };
allow myshell mycfg_file:dir { write getattr setattr search create add_name remove_name };
allow myshell shell_exec:file { read open getattr };
allow myshell toolbox_exec:file { read open getattr execute execute_no_trans };
allow myshell mycfg_file:file {create write read append open getattr setattr };
此之外,由於在alps/device/mediatek/common/sepolicy/full/shell.te 檔案內新增如下一行
allow shell myshell_exec:file rx_file_perms;
、為配置檔案賦值許可權,允許其為系統服務和第三方應用讀寫操作
首先為配置檔案my_cfg新增file context,如下所示
alps/device/mediatek/common/sepolicy/full/file_contexts
/data/mycfg/my_cfg        u:object_r:mycfg_file:s0
然後為系統服務新增對mycfg配置檔案的許可權,如下所示:
alps/device/mediatek/common/sepolicy/full/system_server.te
allow system_server mycfg_file:dir { search };
allow system_server mycfg_file:file { write read append open getattr };
接著為其新增第三方應用訪問mycfg的許可權,所需新增到的檔案及其內容如下所示:
alps/device/mediatek/common/sepolicy/full/untrusted_app.te
allow untrusted_app mycfg_file:dir { search };
allow untrusted_app mycfg_file:file { write read append open getattr };

相關推薦

Android 7.0 init.rc 執行shell指令碼 ---- 製作初始配置檔案

最近在一個Android 7.0 PDA專案中遇到如下需求:初始化一配置檔案,此配置檔案需要儲存到data分割槽供系統服務和第三方應用進行讀寫操作,另外此配置檔案在系統重啟後保持檔案內容不變,除非恢復出廠才可以恢復成預設配置引數 。因為初始化的配置引數為了方便其它同事修改

init.rc啟動 shell指令碼

[Android] 在開機的時候,執行你想要的 shell script 雖然 init.rc 很好用,但還是有其缺陷... 像是我要 echo 某些字串到檔案時,他就做不到了 :( 所以可以搭配一個 .sh 的檔案,讓他開機的時候去執行這個 .sh 即可。 建議修改

Android之在linux終端執行shell指令碼直接列印當前執行app的日誌

1、問題我們一般很多時候會需要在ubuntu終端上列印當前執行app的日誌,我們一般常見的做法是1)、獲取包名      開啟當前執行的app,然後輸入如下命令,然後在第一行TASK後面的就可以看到包名adb shell dumpsys activity top2)、我們的終

騰訊雲Centos 7.0 伺服器上執行Java指令碼和jar檔案

1.執行java指令碼 編輯java原始檔 vim HelloWorld.java 建立並開啟HelloWorld.java檔案,編輯內容如下: public class HelloWor

shell指令碼批量監控Linux server配置檔案的更改

某些情況下,自己或同事修改了某處系統設定,但由此所引發的問題可能一段時間以後才會暴露,由於記不清之前改過哪些檔案、改了哪些內容,解決問題時可能走彎路。於是寫了一個小指令碼以特定頻率來監控常見系統配置檔案

[Android6.0]App中呼叫init.rc中的服務,從而執行shell指令碼

Author: Younix Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.07 需求:希望在 Android App 中新增 SPDIF 測試功能。對 Android

[init.rc] android開機過程執行shell指令碼

1、在system/core/rootdir/etc/下新增指令碼檔案,命名為myshell.sh,指令碼內容可如下         #! /system/bin/sh 2、修改system/core/rootdir/Android.mk檔案,增加語句         co

appium在android 7.0真機上運行報錯command failed shell:............ps:'uiautomator"的解決方式

.proto androi sse ces node return std tomato 並且 appium版本:1_4_16 在CSDN中找到相關解決的方案,根據此解決方案順利的解決了讓人惆悵的問題,再次記錄。 1、找到appium安裝目錄下的adb.js文件,目錄為:A

為什麼應用程式在Android 7.0之後安裝和執行都變得更快?

需要了解幾個概念 Dalvik 虛擬機器 負責解釋dex檔案為機器碼,每次執行程式碼,都需要Dalvik將dex程式碼翻譯為微處理器指令,然後交給系統處理,這樣效率不高。 JIT(Just-In-Time) 為了解決上面的問題,Google在2

android手機上執行shell指令碼

public class MainActivity extends AppCompatActivity { TextView editText; @Override public void onCreate(Bundle savedInstanceState) {

關於Android Studio 3 執行應用時提示 “Instant Run requires that the platform corresponding to your target device (Android 7.0 (Nougat)) is installed.” 的說明

  執行App後,Android Studio顯示如圖1-1介面: 圖1-1   這是因為你連線的外部裝置(比如Android手機或AVD)的SDK版本在你的電腦上沒有安裝對應的版本,所以解決辦法為點選“Install and Continue”,安裝缺失版本安裝對應版本的SDK即可。   安裝後,

Androidinit.rc中加入指令碼開機安裝APK並啟動APK的服務

要求:開機檢查APK是否安裝,如果不安裝則自動靜默安裝,同時啟動APK的服務。 把要安裝的APK放在device資料夾下,編譯時用指令碼拷貝到out目錄下,開機啟動指令碼安裝APK並啟動服務。 這裡以Airplay.apk為例。 1.在device目錄下建立資料夾Ai

Android應用層如何執行shell指令碼

應用層如何執行shell指令碼,通過啟動一個shell指令碼服務執行 private fun execCmd(cmd: String, listener: (isExe: Boolean, result: String?) -> Unit) { Thread(Runn

View.post在Android 7.0 api24(以上)已不再100%執行

在Android 7.0 api24,Android 8.0 api25的手機上如果通過new建立的View,如果沒有將它通過addView()加入到ViewGroup佈局中,那通過View.post()傳送出去的任務將不再執行,也就無法通過Viwe.post

android應用程式執行shell指令碼命令

急問android應用程式如何執行shell指令碼命令 跪求大神指點~! 小菜在做一個android應用程式,需要執行系統呼叫命令,然後我考慮將命令寫在.sh腳本里,直接呼叫指令碼執行。 但是呼叫一直不成功。 我具體用到了如下行的函式呼叫,系統命令寫入了xxxxx.sh裡

執行shell指令碼提示“syntax error near unexpected token for((i=0;i

sh指令碼如下: #!/usr/bin/env bash county="3 4 5 6 7 8 9 10 11 12 16 29 39 44 53 62 72 84 97 115 128 151

Android開機執行shell指令碼

往往需要在Android啟動過程中去對系統做一些設定,如修改某些資料夾的屬主和檔案的許可權,可在init.rc中增加service執行shell指令碼,從而可在shell指令碼中完成大部分操作。 1、在system/bin/下建立一個shell指令碼init.mbx.

樹莓派完美執行最新 Android 7.0 牛軋糖

Nougat,也就是中文牛軋糖,是 Android 最新版本的代號,8月22日開始,Google 已經正式通過 OTA 及 Image 的方式向 Nexus 裝置推送或開放下載,如果你用的是列表中 Google Nexus 手機(Nexus 6、Nexus 6P、Nexus 5X)或者 Pixel C

我們來探究竟 Android 7.0 適配中 FileProvider 部分

rip 使用 star 過程 限制 需要 lock 目錄文件 support 本文標簽: Android7.0 FileProvider 由於 Android 7.0 或更高版本的系統在國內手機市場上的占比不是很高,很多 Android 開發人員並沒有做 7.0 適配工作,

remount issue on android 7.0

n) 重新 tar 版本 all vfat art memmove html http://blog.chinaunix.net/uid-23141914-id-5754416.html 最近在新版本的android 7.0上,發現filesystem的remount老是報