1. 程式人生 > >Android 編寫開啟自啟動的指令碼服務

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個步驟是實現整個機制的核心步驟,細節並沒有過多的講述,後面增加每個步驟具體涉及到的知識點。





相關推薦

Android 編寫開啟啟動指令碼服務

 前言    因為公司有一款手機在升級之後使用者找不到內部sdcard 中的資料,分析了主要原因是因為升級前後內部sdcard 的連結的路徑改變了。之前sdcard的資料在/sdcard/emulated/ 目錄下,升級時候放在了/sdcard/emulated/0/ 下面

Linux 配置開啟啟動指令碼

    很多時候,很多服務需要重啟就必須起來,比如redis。redis重啟自啟動還好配置一點,有的自己寫的守護程序就沒有自帶的好的重啟方法。下面給一種萬能的重啟自啟動指令碼開啟方法。增加開機執行指令碼/etc/rc.local增加啟動指令碼redis/bin目錄加入PATH

android 開機啟動指令碼

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

實例腳本,判斷是否加入開機啟動服務狀態、腳本規範

shell ntpd 腳本實例:判斷ntpd服務是否加入開機自啟動#!/bin/bash # Output: # Result must exactly equal to "3:on,5:on|enable" # # Other output is non-compliant. # Confirm

Linux系統重要的開機啟動服務

round 技術分享 服務 啟動 lse 重要 size kconfig 我們 重要的開機自啟動的服務 1.sshd 連接Linux服務器是需要用到的服務程序 2.rsyslog 操作日誌的一種機制 系統日誌:/var/log/

windows 下編寫開機啟動程序bat腳本

mpp ask sql 啟動 開機 con vbs 冗余 del rem **Code Start @echo off echo 正在關閉冗余進程,請稍等.....taskkill /f /im mysqld.exe echo ----啟動程序中------ start &

Android原始碼新增定義系統服務

1、建立AIDL檔案 在原始碼frameworks/base/core/java/android/os/下面新增了一個ICCCService.aidl   2、將AIDL檔案放到編譯frameworks/base/Android.mk中 在frameworks/ba

android 安裝後啟動 和 靜默安裝後自動重啟

安裝後自啟動很久之前的問題了 今天剛好遇到 記錄一下:新增兩行命令就搞定了 一般的安裝 Intent intent = new Intent(); //執行動作 intent.setAction(Intent.ACTION_VIEW);

Windows通過schtasks設定開機啟動指令碼

指令碼 首先建立一個啟動指令碼 init.bat,內容如下: time /t >> c:\test\test.log echo %COMPUTERNAME% >> c:\test\test.log echo %USERNAME% >> c:\t

Windows通過組策略設定開機啟動指令碼

首先建立一個啟動指令碼 init.bat,內容如下: time /t >> c:\test\test.log echo %COMPUTERNAME% >> c:\test\test.log echo %USERNAME% >> c:\test\te

[CentOS7]安裝tomcat並開啟啟動

安裝jdk 1、CentOS 6.X 和 7.X 自帶有OpenJDK runtime environment (openjdk)。它是一個在linux上實現開源的Java 平臺。 yum search java | grep -i --color JDK 2、在C

TX1開機啟動指令碼方法

1 在最左上端的"Search your computer"找到"Startup Application" 2 點選"Add",在彈出的對話方塊中的"Name","Command,"Comment"三個中輸入:gnome-terminal -e ‘bash -c “cd XXX(專案路徑)/

OpenWrt啟動過程分析+新增啟動指令碼[轉載]

一、OpenWrt啟動過程分析 總結一下OpenWrt的啟動流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S*

【教程】CentOS 設定開機啟動指令碼

《CentOS 設定開機自啟動指令碼》 新建指令碼檔案autorun.sh #!/bin/sh #chkconfig:2345 85 15 ​#description: test echo "Hello Linux !!" 注意:#chkconfig和

ssh連線遠端主機執行指令碼的環境變數問題(編寫hadoop叢集啟動指令碼

參考:https://blog.csdn.net/whitehack/article/details/51705889 如: 遠端主機執行指令碼報錯:(因為這種方式是non-interactive + non-login shell,不會去載入/etc/profile系統環境變數,可以配置使

001,window下開機啟動-系統服務註冊

  依賴軟體下載地址: 連結: https://pan.baidu.com/s/1UCiqqURbk-_KQ0gloK5eRg 密碼: tcr9   配置: 管理員取得所有許可權 選單 https://jingyan.baidu.com/article/ab6

AutoStartUtil【開啟啟動設定介面】

參考資料 Android6.0 開啟自啟動管理頁面(華為、小米) Android開啟自啟動設定頁面 Android 機型設定自啟動的跳轉介面 程式碼 注意:需要搭配《RomUtil【Android判斷手機ROM,用於判斷手機機型】》使用。 package com.why.project.no

redis開機啟動指令碼檔案

新建編輯 /etc/init.d/redis REDISPORT=6379 EXEC=/usr/local/redis/redis-server CLIEXEC=/usr/local/redis/redis-cli PIDFILE=/var/run/redis.pid CO

樹莓派設定開機啟動服務方式) 以vncserver為例

1、為了下一步準備 這裡需要一個設定:(開啟樹莓派設定) sudo raspi-config 選擇5.Interfacing Options  找到VNC(遠端桌面)  選擇 Yes(是)enable 然後sudo reboot 重啟後重新連線ssh 此為命令

解壓RK3288的boot.img修改init.rc 新增開機啟動指令碼

最近找別人開發一款智慧AI機器人,由於方案廠商現在程式碼還沒有交付。每次只提供ROM。現在公司要求要開機啟動系統檢測指令碼。我們都知道Android現在許可權管理很嚴格。而且我的指令碼是用shell指令碼完成的。所以無法監聽開機廣播。只能修改init.rc檔案。