1. 程式人生 > >Android:新增開機啟動自定義指令碼

Android:新增開機啟動自定義指令碼

  • 新增開機啟動自定義指令碼

之前也一直做過類似的事情,但是沒有記錄,這裡做個簡單記錄,我這裡的例子是在Android7.1.2中實現的,用的板子是參考Quectel-SC60(基於高通平臺的64位SoC:msm8953)設計的,之前做的也有其他平臺的,但都大同小異(可能幾個檔案所在的目錄小有差異),原理依舊可以參照.

  • 我的情況

也許有比這裡更簡單的方法,但是我瞭解到的方法都是有很多不足之處,比如系統跑起來後,通過重新掛載檔案系統為可讀可寫,然後再在系統中編輯指令碼等操作,這類操作除錯的時候或許方便,但是一來沒有整合到系統原始碼樹中,不方便批量生產(試想每次燒錄後還要開機去手動修改系統),二來把作業系統掛載成可讀可寫也不是很符合規範,所以,我這裡的做法還是儘量參照安卓系統內部的一些規則進行實現,過程不再分析,直接給出步驟.

首先是建立你自己的指令碼檔案,比如我的是在安卓原始碼樹下的"device/qcom/msm8953_64/"路徑下建立了一個"lingump.sh".

"device/qcom/msm8953_64/lingump.sh":

#!/bin/sh
echo "starting ... shell command running for vanch-quectel-sc60ceyb board. [LinGump]"
echo "endding ... shell command running for vanch-quectel-sc60ceyb board. [LinGump]"

這裡隨意輸出兩行資訊意思意思,為什麼是這個路徑呢?其實其他路徑也可以,關鍵點在於這個檔案.

"device/qcom/msm8953_64/msm8953_64.mk":

PRODUCT_COPY_FILES += device/qcom/msm8953_64/whitelistedapps.xml:system/etc/whitelistedapps.xml \
                      device/qcom/msm8953_64/gamedwhitelist.xml:system/etc/gamedwhitelist.xml \
                      device/qcom/msm8953_64/lingump.sh:system/etc/lingump.sh

與其他平臺類似,一般都是在device路徑中的裝置的某個mk檔案裡,這個檔案中名為"PRODUCT_COPY_FILES"的變數設定了一些拷貝操作,就是在生成系統映象檔案時,將某些檔案從原始碼樹中某個路徑中拷貝到映象檔案系統的某個路徑下,其中我新加了一行資訊"device/qcom/msm8953_64/lingump.sh:system/etc/lingump.sh"意思就是將原始碼樹中的"device/qcom/msm8953_64/lingump.sh"拷貝到檔案系統的"system/etc/lingump.sh"中,看到這裡應該明白了吧,我為何要把我的指令碼放到上面說的路徑,是為了跟其他的檔案的複製操作保持一致性.

如果僅僅這樣子,編譯而成的映象檔案系統的確已經存在了"system/etc/lingump.sh"這個檔案,但是卻沒有開機執行,那麼,我們需要在預設的開機啟動指令碼中新增一些東西來執行我們的自定義指令碼,這裡是"system/core/rootdir/init.rc",一般也都是這個路徑,如下所示,新增到檔案尾部.

"system/core/rootdir/init.rc":

service ligump /system/etc/lingump.sh
    class main
    user root
    group root
    oneshot

意思簡潔明瞭,不再贅述,可自行百度深入瞭解相關內容.但是這樣子編譯的系統啟動後,我們會發現啟動日誌中有提示執行了該指令碼,但是卻沒有執行成功的資訊,原因是許可權不足,那怎麼辦?即使你在當前執行的系統中修改了許可權,也沒用,因為每次重啟系統後,這個指令碼的許可權仍然是映象檔案系統中的許可權,所以改得了一時,卻沒有改到檔案系統本身,是行不通的.還是得按照安卓的規則,在生成映象檔案系統時,就把許可權設定了,當然如果你要重新掛載執行中的系統為可讀可寫,然後再去修改它的許可權,這樣是可以修改到檔案系統本身,也是可以的,只是這裡不提倡,也有很多弊端,開頭也這麼說了.

廢話少說,在從安卓原始碼生成映象檔案時,對檔案系統許可權的管理用到了下面的檔案.

"system/core/libcutils/fs_config.c":

static const struct fs_path_config android_files[] = {
    { 00440, AID_ROOT,      AID_SHELL,     0, "system/etc/init.goldfish.rc" },
    { 00550, AID_ROOT,      AID_SHELL,     0, "system/etc/init.goldfish.sh" },
    { 00550, AID_ROOT,      AID_SHELL,     0, "system/etc/init.ril" },
    { 00550, AID_ROOT,      AID_SHELL,     0, "system/etc/lingump.sh" },
......

其中"{ 00550, AID_ROOT,      AID_SHELL,     0, "system/etc/lingump.sh" },"就是我參考著其他檔案類似的許可權設定加上去的.

  • 額外說明

這裡有個小插曲,因為我的是安卓7.1.2版本的系統,而之前早期版本的系統中可能這裡不在這個路徑下,我之前改安卓4.2.2.1版本的系統的相關檔案是在這個路徑"system/core/include/private/android_filesystem_config.h"中,我還在這個檔案中一頓好找,結果發現沒有,無意中看到該檔案中的註釋如下.

"system/core/include/private/android_filesystem_config.h":

/* Rules for directories and files has moved to system/code/libcutils/fs_config.c */

 結果按照註釋的路徑一頓好找,也沒有找到相關檔案,哦~突然恍然大悟,原來是寫這塊原始碼的人他犯困了,註釋寫錯了,路徑中不是code,而是core,這下才找到了上面所說的要修改的那個檔案,哈哈,是人都會犯錯啊,小插曲~

相關推薦

Android新增開機啟動定義指令碼

新增開機啟動自定義指令碼 之前也一直做過類似的事情,但是沒有記錄,這裡做個簡單記錄,我這裡的例子是在Android7.1.2中實現的,用的板子是參考Quectel-SC60(基於高通平臺的64位SoC:msm8953)設計的,之前做的也有其他平臺的,但都大同小異(可能

Android MTK 設定開機啟動定義Launcher Home鍵換出Launcher切換

開機進入自定義的Launcher,之後按home鍵會彈出launcher選擇提示框,可以通過系統設定取消該launcher的預設設定 1 frameworks\base\core\java\c

AndroidJNI呼叫C++定義類的詳細方法

一般情況下,我們都是用 JNI 呼叫 C++ 的某個方法的程式碼,包括直接使用 android studio 生成的程式碼也是如此。但有時我們需要新建、或者得到的是 C++ 的一個自定義類,在呼叫時就不能像呼叫 C++ 方法那樣了,查閱了一部分其他人的部落格,寫的都比較籠統、模糊,對沒接觸過這塊知識

Centos7 設置Mongodb開機啟動-定義服務

定義 mod 中新 數據庫 端口 reload port 庫文件 ont 一.官網下載 mongodb,解壓到指定目錄 本機mongodb目錄為:/usr/context/mongodb/mongodb-3.2.10/ 二 .編寫配置文件,主要指定數據庫文件,日誌文

Android新增新的定義鍵值和按鍵處理流程

[cpp] view plain copy print? <span style="font-family:FangSong_GB2312;font-size:18px;">/*  * Copyright (C) 2010 The Android Open So

Linux Oracle啟動定義指令碼

1.啟動程式#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define ORACLE_START_TXT "/home/qual/tm

[Android]定義開機動畫實踐 Android定製修改開機啟動畫面

關於開機動畫的修改,可以參考 Android定製:修改開機啟動畫面 開機動畫主要是載入圖片,就像動畫片一樣。 在製作bootanimation.zip檔案的時候,需要注意 應該採用“儲存”(store)的方式去打包,不然系統會識別不了圖片資源 下面是一個動畫修改測試,我們也

Linux下新增定義指令碼開機啟動的方法

chkconfig --add auto_coreseek.sh   完事。   然後研究下這都是些毛意思。 chkconfig有幾個等級: 0:表示關機 1:表示單使用者模式 2:表示無網路連結多使用者命令列模式 3:表示有網路連結多使用者命令列模式 4:表示不可用情況 5:表示帶圖形介面的多使用者模式 6

Linux下開機啟動定義shell指令碼

一、Ubuntu下 1、方法一,編輯rc.loacl指令碼  Ubuntu開機之後會執行/etc/rc.local檔案中的指令碼, 所以我們可以直接在/etc/rc.local中新增啟動指令碼。【進入到/etc/rc5.d下,發現S99rc.local,即開機軟

Android 8.0 新增開機啟動指令碼

[ 10.368517] type=1400 audit(1483292256.112:14): avc: denied { execute_no_trans } for pid=2768 comm="prepare_ds.sh" path="/vendor/bin/toybox_vendor" dev=

Ubuntu新增開機啟動執行指令碼

原文:https://blog.csdn.net/upshi/article/details/53884770 Ubuntu新增開機啟動執行指令碼 方法一:編輯rc.loacl指令碼 Ubuntu開機之後會執行/etc/rc.local檔案中的指令碼, 所以我們可以直接在/etc/rc.lo

centos7如何新增開機啟動服務/指令碼

一、新增開機自啟服務 在centos7中新增開機自啟服務非常方便,只需要兩條命令(以Jenkins為例): systemctlenablejenkins.service #設定jenkins服務為自啟動服務 sysstemctl start jenkins.servic

WPF繪圖的工程應用為按鈕或定義按鈕新增向量圖作為背景,該向量圖來自Blend或Design設計的Path資料。

例1 :Button+Drawing繫結+GeometryDrawing 功能描述:為Button新增簡單的向量圖作為背景。 <Window x:Class="Drawing.Drawings" xmlns="http://schemas.microsoft

centos7 新增開機啟動服務/指令碼或是php

二、新增開機自啟指令碼 在centos7中增加指令碼有兩種常用的方法,以指令碼myscript.sh為例: #!/bin/bash #description:開機自啟指令碼 /usr/local/tomcat/bin/startup.sh #執行另一指令碼 /usr/

Android Studio 必備技巧TODO 用法及定義 TODO

在開始之前,我們先來看看開發過程中常會碰到的一些問題: 這塊程式碼好幾次用到了,應該抽出去; 這個演算法可以換個更高效的寫法; 這段邏輯繞來繞去,其實可以換個思路。 …… 相信許多人都遇到過這些情況,那麼,此時我們該怎麼做呢? 呵,這還用問?

Android學習問題關於AlertDialog中定義佈局帶有的EditText無法彈出鍵盤

最近在用到AlertDialog的時候,自定義了其佈局檔案,其中帶有EditText,但是發現在手機上使用的時候,點選EditText卻沒有彈出鍵盤,在網上搜索了下,看到有好幾種解決方法,試過其中一些方法,有些有效果,有些卻是沒有效果,在這裡小小總結下; 1.

Android定製修改開機啟動畫面

引言 Android系統在按下開機鍵之後就會進入啟動流程,這個過程本身需要一些時間,而面向使用者的往往是廠商定製的一些宣傳用的比較絢麗的啟動畫面。我們在定製自己的系統時,往往需要把這些畫面換成我們自己的,一方面可以新增自己的LOGO增加品牌曝光度,另外也可以新

Ubuntu下新增開機啟動指令碼

1、方法一,編輯rc.loacl指令碼  Ubuntu開機之後會執行/etc/rc.local檔案中的指令碼, 所以我們可以直接在/etc/rc.local中新增啟動指令碼。 當然要新增到語句:exit 0 前面才行。 如: sudo vi /etc/rc.lo

CentOS 7新增開機啟動服務/指令碼

一、新增開機自啟服務在CentOS 7中新增開機自啟服務非常方便,只需要兩條命令(以Jenkins為例):systemctl enable jenkins.service #設定jenkins服務為自啟動服務sysstemctl start  jenkins.service

Ubuntu 16.04新增開機啟動指令碼的方法

A 自帶開機指令碼 /etc/rc.local指令碼是一個ubuntu16.04及其以前的系統中自帶的開機指令碼,在沒有修改之前裡面內容如下。 #!/bin/sh -e # # rc.local # # This script is executed at the end