導航:首頁 > 操作系統 > androidinitc

androidinitc

發布時間:2024-06-14 06:58:12

android 在代碼中怎麼修改開機啟動項。

  1. 安卓系統的程序控制:Android系統通過應用程序自行在系統中登記注冊事件(即Intent)來響應系統產生的各類消息。

    1. 例如Android實現系統開機自啟動程需要在Manifest中加入如下Intent-filter及許可權Uses-permission即可。

      <intent-filter>
      <action android:name="android.intent.action.BOOT_COMPLETED"/>
      (修改時候主要是去掉上面該行即可)
      <category android:name="android.intent.category.HOME" />
      </intent-filter>
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
      (修改時候主要是去掉上面該行即可)

    2. Android系統為應用程序管理功能提供了大量的API,可以通過API控制Intent和permission,其中上述配置表示應用程序會響應系統產生的android.intent.action.BOOT_COMPLETED(系統啟動完成)信號,以此來實現應用程序自啟動。

  2. 當知道上述原理後,我們就可以隨心所欲的控製程序開機自啟動了。具體思路如下:

    1. 手工方法

      1. 基於上述原理,我們可以通過對系統中已安裝的程序去除其Manifest的上述配置片段來控制應用程序的對系統的響應,當然沒源碼可修改編譯的情況下只能實現屏蔽其對有些信號的響應,例如屏蔽該程序不再開機自啟動。手工方法就是利用有關工具直接在解壓其APK包後,修改其Manifest的上述配置行後再打包成APK,最後安裝到系統中就實現了屏蔽其自啟動功能。具體相關的工具軟體主要有APKTOOL。(請自己放狗去搜索下載)

    2. 編程實現,因手工方法需要藉助APKTOOL等工具,步驟比較法繁瑣,我們可以通過自己開發來實現該功能:

      1. PackageManager

        1. 本類API是對所有基於載入信息的數據結構的封裝,包括以下功能:

          •安裝,卸載應用
          •查詢permission相關信息
          •查詢Application相關信息(application,activity,receiver,service,provider及相應屬性等)
          •查詢已安裝應用
          •增加,刪除permission
          •清除用戶數據、緩存,代碼段等
          非查詢相關的API需要特定的許可權,具體的API請參考SDK文檔。

      2. ActivityManager相關

本類API是對運行時管理功能和運行時數據結構的封裝,包括以下功能

•激活/去激活activity
•注冊/取消注冊動態接受intent
•發送/取消發送intent
•activity生命周期管理(暫停,恢復,停止,銷毀等)
•activity task管理(前台->後台,後台->前台,最近task查詢,運行時task查詢)
•激活/去激活service
•激活/去激活provider等
task管理相關API需要特定的許可權,具體API可參考SDK文檔。

利用上述API原理的具體代碼俺有空時候試試實現一個,應該不難的,都是調用現成的API實現。目前發現已有的控制開機自啟動的成熟應用程序主要是autostarts,可自己安裝一個試試,挺好用,實際上autostart有點名不副實,如果是我就會起個名字叫Intentcontrol,因為其不只是控制開機啟動信號,它可以控製程序對大部分信號的響應行為。

    c. 系統自帶工具

    Android自帶工具:

    1、程序包管理工具:/system/bin/pm

    2、activity管理工具:/system/bin/am

具體用法大致說明如下:

    • pm的使用方法可以參考

usage: pm [list|path|install|uninstall]
pm list packages [-f]
pm list permission-groups
pm list permissions [-g] [-f] [-d] [-u] [GROUP]
pm list instrumentation [-f] [TARGET-PACKAGE]
pm list features
pm path PACKAGE
pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH
pm uninstall [-k] PACKAGE
pm enable PACKAGE_OR_COMPONENT
pm disable PACKAGE_OR_COMPONENT

The list packages command prints all packages. Options:
-f: see their associated file.

The list permission-groups command prints all known
permission groups.

The list permissions command prints all known
permissions, optionally only those in GROUP. Options:
-g: organize by group.
-f: print all information.
-s: short summary.
-d: only list dangerous permissions.
-u: list only the permissions users will see.

The list instrumentation command prints all instrumentations,
or only those that target a specified package. Options:
-f: see their associated file.

The list features command prints all features of the system.

The path command prints the path to the .apk of a package.

The install command installs a package to the system. Options:
-l: install the package with FORWARD_LOCK.
-r: reinstall an exisiting app, keeping its data.
-t: allow test .apks to be installed.
-i: specify the installer package name.

The uninstall command removes a package from the system. Options:
-k: keep the data and cache directories around.
after the package removal.

The enable and disable commands change the enabled state of
a given package or component (written as "package/class").

usage: am [subcommand] [options]

start an Activity: am start [-D] <INTENT>
-D: enable debugging

send a broadcast Intent: am broadcast <INTENT>

start an Instrumentation: am instrument [flags] <COMPONENT>
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
-e <NAME> <VALUE>: set argument <NAME> to <VALUE>
-p <FILE>: write profiling data to <FILE>
-w: wait for instrumentation to finish before returning

start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop

<INTENT> specifications include these flags:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>] [-f <FLAGS>] [<URI>]

⑵ 如何讓Android系統或Android應用執行shell腳本

一、Android應用啟動服務執行腳本
1 如何寫服務和腳本
在android源碼根目錄下有/device/tegatech/tegav2/init.rc文件相信大家對這個文件都不陌生(如果不明白就仔細研讀下android啟動流程)。如果在該腳本文件中添加諸如以下服務:
service usblp_test /data/setip/init.usblpmod.sh
oneshot
disabled
註解:每個設備下都會有自己對應的init.rc,init.設備名.rc腳本文件。oneshot disabled向我們說明了在系統啟動的時候這個服務是不會自動啟動的。並且該服務的目的是執行/data/setip/init.usblpmod.sh腳本。腳本的內容你可以隨便寫,只要符合shell語法就可以了,比如腳本可以是簡單的設置eth0:
# ! /system/bin/sh //腳本的開頭必須這樣寫。
Ifconfig eth0 172.16.100.206 netmask 255.255.0.0 up//設置ip的命令
2、如何在應用中啟動服務
1)首先了解下在服務啟動的流程
1. 在你的應用中讓init.rc中添加的服務啟動起來。
首先了解下在服務啟動的流程:
在設備目錄下的init.c(切記並不是system/core/init/init.rc)
Main函數的for(;;)循環中有一個handle_property_set_fd(),函數:
for (i = 0; i < fd_count; i++) {
if (ufds[i].revents == POLLIN) {
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd == get_keychord_fd())
handle_keychord();
else if (ufds[i].fd == get_signal_fd())
handle_signal();
}
}
這個函數的實現也在system/core/init目錄下,該函數中的check_control_perms(msg.value, cr.uid, cr.gid)函數就是檢查該uid是否有許可權啟動服務(msg.value就是你服務的名字),如果應用為root或system用戶則直接返回1.之後就是調用handle_control_message((char*) msg.name + 4, (char*) msg.value),該函數的參數就是去掉1.ctl.後的start和2.你服務的名字。這個函數的詳細內容:
void handle_control_message(const char *msg, const char *arg)
{
if (!strcmp(msg,"start")) {
msg_start(arg);
} else if (!strcmp(msg,"stop")) {
msg_stop(arg);
} else if (!strcmp(msg,"restart")) {
msg_stop(arg);
msg_start(arg);
} else {
ERROR("unknown control msg '%s'\n", msg);
}
}
匹配start後調用msg_start.服務就這樣起來了,我們的解決方案就是在檢查許可權的地方「下點功夫」,因為我們不確定uid,所以就讓check_control_perms這個函數不要檢查我們的uid,直接檢查我們服務的名字,看看這個函數:
static int check_control_perms(const char *name, unsigned int uid, unsigned int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;
/* Search the ACL */
for (i = 0; control_perms[i].service; i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}
}
}
return 0;
}
這個函數裡面是必須要檢查uid的,我們只要在for循環上寫上。
if(strcmp(「usblp_test」,name)==0) //usblp_test就是我們服務的名字。
return 1;
這樣做不會破壞android原本的結構,不會有什麼副作用。
init.c和init.rc都改好了,現在就可以編譯源碼了,編譯好了裝到機子開發板上就可以了。

⑶ 怎麼讓Android程序一直後台運行,像QQ一樣不被殺死

方法:
對於一個service,可以首先把它設為在前台運行:
public void MyService.onCreate() {
super.onCreate();
Notification notification = new Notification(android.R.drawable.my_service_icon,
"my_service_name",
System.currentTimeMillis());
PendingIntent p_intent = PendingIntent.getActivity(this, 0,
new Intent(this, MyMainActivity.class), 0);
notification.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!", p_intent);
Log.d(TAG, String.format("notification = %s", notification));
startForeground(0x1982, notification); // notification ID: 0x1982, you can name it as you will.
}

重要設置-------------------------------
相較於/data/app下的應用,放在/system/app下的應用享受更多的特權,比如若在其Manifest.xml文件中設置persistent屬性為true,則可使其免受out-of-memory killer的影響。如應用程序'Phone'的AndroidManifest.xml文件:
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設置後app提升為系統核心級別,任何情況下不會被kill掉, settings->applications裡面也會屏蔽掉stop操作。

這樣設置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)
# cat /proc/255/oom_adj

設置後的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
# cat /proc/155/oom_adj
-12 # 這是CORE_SERVER_ADJ
註:init進程的oom_adj為-16(即SYSTEM_ADJ): cat /proc/1/oom_adj

Android相關部分分析:
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼:
final ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);

if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
updateLruProcessLocked(app, true, true);
}

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ; // 這個常數值為-12。
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app, "added application", app.processName);
}

return app;
}

可見要想成為core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標志,FLAG_SYSTEM指的是應用位於/system/app下,FLAG_PERSISTENT就是指persistent屬性。

而對於frameworks/base/services/java/com/android/server/SystemServer.java,則調用
ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。

原理:
Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先順序自動進行進程的回收。由此帶來三個問題:
1) 回收規則: 什麼時候回收與回收哪一個?
2) 避免誤殺: 如何阻止被回收?
3) 數據恢復與保存: 被回收了怎麼辦?

Android將進程分為6個等級,它們按優先順序順序由高到低依次是:
1.前台進程( FOREGROUND_APP)
2.可視進程(VISIBLE_APP )
3. 次要服務進程(SECONDARY_SERVER )
4.後台進程 (HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)

特徵:
1.如果一個進程裡面同時包含service和可視的activity,那麼這個進程應該歸於可視進程,而不是service進程。
2.另外,如果其他進程依賴於它的話,一個進程的等級可以提高。例如,一個A進程里的service被綁定到B進程里的組件上,進程A將總被認為至少和B進程一樣重要。
3.系統中的phone服務被劃分到前台進程而不是次要服務進程.

在android中,進程的oom_adj值也就代表了它的優先順序。oom_adj值越高代表該進程優先順序越低。文件/init.rc中有以下屬性設置:
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
/init.rc中,將PID為1的進程(init進程)的oom_adj設置為SYSTEM_ADJ(-16):
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16

查看本機設置:
cat /sys/mole/lowmemorykiller/parameters/adj
0,1,2,7,14,15

回收時機:
文件/init.rc中:
setprop ro.FOREGROUND_APP_MEM 1536 // 6M
setprop ro.VISIBLE_APP_MEM 2048 // 8M
setprop ro.SECONDARY_SERVER_MEM 4096 // 16M
setprop ro.HIDDEN_APP_MEM 5120 // 20M
setprop ro.CONTENT_PROVIDER_MEM 5632 // 22.4M
setprop ro.EMPTY_APP_MEM 6144 // 24M
這些數字也就是對應的內存閾值,一旦低於該值,Android便開始按順序關閉相應等級的進程。
注意這些數字的單位是page: 1 page = 4 kB。所以上面的六個數字對應的就是(MB): 6,8,16,20,22,24。

查看現在的內存閾值設置:
cat /sys/mole/lowmemorykiller/parameters/minfree

要想重新設置該值(對應不同的需求):
echo "1536,2048,4096,5120,15360,23040">/sys/mole/lowmemorykiller/parameters/minfree
這樣當可用內存低於90MB的時候便開始殺死"空進程",而當可用內存低於60MB的時候才開始殺死"內容供應節點"類進程。

具體的回收實現在ActivityManagerService.java中的函數trimApplications():
1.首先移除package已被卸載的無用進程;
2.基於進程當前狀態,更新oom_adj值,然後進行以下操作:
1) 移除沒有activity在運行的進程;
2) 如果AP已經保存了所有的activity狀態,結束這個AP。
3. 最後,如果目前還是有很多activities 在運行,那麼移除那些activity狀態已經保存好的activity。

更新oom_adj的值:
在ActivityManagerService.java文件的ComputeOomAdjLocked() 中計算出進程的oom_adj,例如:
if (app == TOP_APP) {
// The last app on the list is the foreground app.
adj = FOREGROUND_APP_ADJ;
app.adjType = "top-activity";
}

Android kernel中的low memory killer
Android的Low Memory Killer根據需要(當系統內存短缺時)殺死進程釋放其內存,源代碼在kernel/drivers/misc/lowmemorykiller.c中。簡單說,就是尋找一個最合適的進程殺死,從而釋放它佔用的內存。
最合適的進程是:
• oom_adj越大
• 佔用物理內存越多

一旦一個進程被選中,內核會發送SIGKILL信號將之殺死:
for_each_process(p) {
……
if(selected == NULL || p->oomkilladj > selected->oomkilladj ||
(p->oomkilladj == selected->oomkilladj && tasksize > selected_tasksize))
{
selected = p;
}
}
if(selected != NULL) {
force_sig(SIGKILL, selected);
}

查看LRU列表:adb shell mpsys activity
當activitydemo在前台時:
包含Service的進程的優先順序比較高,在computeOomAdjLocked中將其分為了兩小類:
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if (adj > SECONDARY_SERVER_ADJ) {
adj = SECONDARY_SERVER_ADJ;
app.adjType = "started-services";
app.hidden = false;
}
}
if (adj > SECONDARY_SERVER_ADJ) {
app.adjType = "started-bg-services";
}
完全讓進程不被kill是不可能的,我們可以通過一些操作,使進程被kill的幾率變小:
1) 提高進程的優先順序:
* 後台操作採用運行於前台的Service形式,因為一個運行著service的進程比一個運行著後台activity的等級高;
* 按back鍵使得進程中的activity在後台運行而不是destory,需重載back按鍵(沒有任何activity在運行的進程優先被殺).
* 依賴於其他優先順序高的進程;

2) 強制修改進程屬性:
* 在進程中設置:setPersistent(true);
* 在Manifest文件中設置(如上)。

⑷ Android啟動過程深入解析

當按下Android設備電源鍵時究竟發生了什麼?

Android的啟動過程是怎麼樣的?

什麼是linux內核?

桌面系統linux內核與Android系統linux內核有什麼區別?

什麼是引導裝載程序?

什麼是Zygote?

什麼是X86以及ARM linux?

什麼是init.rc?

什麼是系統服務?

當我們想到Android啟動過程時,腦海中總是冒出很多疑問。本文將介紹Android的啟動過程,希望能幫助你找到上面這些問題的答案。

Android是一個基於Linux的開源操作系統。x86(x86是一系列的基於intel 8086 CPU的計算機微處理器指令集架構)是linux內核部署最常見的系統。然而,所有的Android設備都是運行在ARM處理器(ARM 源自進階精簡指令集機器,源自ARM架構)上,除了英特爾的Xolo設備(http://xolo.in/xolo-x900-features)。Xolo來源自凌動1.6GHz x86處理器。Android設備或者嵌入設備或者基於linux的ARM設備的啟動過程與桌面版本相比稍微有些差別。這篇文章中,我將解釋Android設備的啟動過程。深入linux啟動過程是一篇講桌面linux啟動過程的好文。

當你按下電源開關後Android設備執行了以下步驟。

此處圖片中step2中的一個單詞拼寫錯了,Boot Loaeder應該為Boot Loader(多謝@jameslast 提醒)

第一步:啟動電源以及系統啟動

當電源按下,引導晶元代碼開始從預定義的地方(固化在ROM)開始執行。載入引導程序到RAM,然後執行。

第二步:引導程序

引導程序是在Android操作系統開始運行前的一個小程序。引導程序是運行的第一個程序,因此它是針對特定的主板與晶元的。設備製造商要麼使用很受歡迎的引導程序比如redboot、uboot、qi bootloader或者開發自己的引導程序,它不是Android操作系統的一部分。引導程序是OEM廠商或者運營商加鎖和限制的地方。

引導程序分兩個階段執行。第一個階段,檢測外部的RAM以及載入對第二階段有用的程序;第二階段,引導程序設置網路、內存等等。這些對於運行內核是必要的,為了達到特殊的目標,引導程序可以根據配置參數或者輸入數據設置內核。

Android引導程序可以在找到。

傳統的載入器包含的個文件,需要在這里說明:

init.s初始化堆棧,清零BBS段,調用main.c的_main()函數;

main.c初始化硬體(鬧鍾、主板、鍵盤、控制台),創建linux標簽。

更多關於Android引導程序的可以在這里了解。

第三步:內核

Android內核與桌面linux內核啟動的方式差不多。內核啟動時,設置緩存、被保護存儲器、計劃列表,載入驅動。當內核完成系統設置,它首先在系統文件中尋找」init」文件,然後啟動root進程或者系統的第一個進程。

第四步:init進程

init是第一個進程,我們可以說它是root進程或者說有進程的父進程。init進程有兩個責任,一是掛載目錄,比如/sys、/dev、/proc,二是運行init.rc腳本。

init進程可以在/system/core/init找到。

init.rc文件可以在/system/core/rootdir/init.rc找到。

readme.txt可以在/system/core/init/readme.txt找到。

對於init.rc文件,Android中有特定的格式以及規則。在Android中,我們叫做Android初始化語言。

Action(動作):動作是以命令流程命名的,有一個觸發器決定動作是否發生。

語法

1

2

3

4

5

; html-script: false ]

on <trigger>

<command>

<command>

<command>

Service(服務):服務是init進程啟動的程序、當服務退出時init進程會視情況重啟服務。

語法

1

2

3

4

5

; html-script: false ]

service <name> <pathname> [<argument>]*

<option>

<option>

...

Options(選項)

選項是對服務的描述。它們影響init進程如何以及何時啟動服務。

咱們來看看默認的init.rc文件。這里我只列出了主要的事件以及服務。

Table

Action/Service

描述

on early-init

設置init進程以及它創建的子進程的優先順序,設置init進程的安全環境

on init

設置全局環境,為cpu accounting創建cgroup(資源控制)掛載點

on fs

掛載mtd分區

on post-fs

改變系統目錄的訪問許可權

on post-fs-data

改變/data目錄以及它的子目錄的訪問許可權

on boot

基本網路的初始化,內存管理等等

service servicemanager

啟動系統管理器管理所有的本地服務,比如位置、音頻、Shared preference等等…

service zygote

啟動zygote作為應用進程

在這個階段你可以在設備的屏幕上看到「Android」logo了。

第五步

在Java中,我們知道不同的虛擬機實例會為不同的應用分配不同的內存。假如Android應用應該盡可能快地啟動,但如果Android系統為每一個應用啟動不同的Dalvik虛擬機實例,就會消耗大量的內存以及時間。因此,為了克服這個問題,Android系統創造了」Zygote」。Zygote讓Dalvik虛擬機共享代碼、低內存佔用以及最小的啟動時間成為可能。Zygote是一個虛擬器進程,正如我們在前一個步驟所說的在系統引導的時候啟動。Zygote預載入以及初始化核心庫類。通常,這些核心類一般是只讀的,也是Android SDK或者核心框架的一部分。在Java虛擬機中,每一個實例都有它自己的核心庫類文件和堆對象的拷貝。

Zygote載入進程

載入ZygoteInit類,源代碼:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

registerZygoteSocket()為zygote命令連接注冊一個伺服器套接字。

preloadClassed 「preloaded-classes」是一個簡單的包含一系列需要預載入類的文本文件,你可以在/frameworks/base找到「preloaded-classes」文件。

preloadResources() preloadResources也意味著本地主題、布局以及android.R文件中包含的所有東西都會用這個方法載入。

在這個階段,你可以看到啟動動畫。

第六步:系統服務或服務

完成了上面幾步之後,運行環境請求Zygote運行系統服務。系統服務同時使用native以及java編寫,系統服務可以認為是一個進程。同一個系統服務在Android SDK可以以System Services形式獲得。系統服務包含了所有的System Services。

Zygote創建新的進程去啟動系統服務。你可以在ZygoteInit類的」startSystemServer」方法中找到源代碼。

核心服務:

啟動電源管理器;

創建Activity管理器;

啟動電話注冊;

啟動包管理器;

設置Activity管理服務為系統進程;

啟動上下文管理器;

啟動系統Context Providers;

啟動電池服務;

啟動定時管理器;

啟動感測服務;

啟動窗口管理器;

啟動藍牙服務;

啟動掛載服務。

其他服務:

啟動狀態欄服務;

啟動硬體服務;

啟動網路狀態服務;

啟動網路連接服務;

啟動通知管理器;

啟動設備存儲監視服務;

啟動定位管理器;

啟動搜索服務;

啟動剪切板服務;

啟動登記服務;

啟動壁紙服務;

啟動音頻服務;

啟動耳機監聽;

啟動AdbSettingsObserver(處理adb命令)。

第七步:引導完成

一旦系統服務在內存中跑起來了,Android就完成了引導過程。在這個時候「ACTION_BOOT_COMPLETED」開機啟動廣播就會發出去。

⑸ 如何使Android應用程序獲得root許可權

您好,很高興為您解答。

一般來說, Android 下的應用程序可以直接得到的最大的許可權為system,如果我們需要在程序中執行某些需要 root 許可權的命令,如 ifconfig 等,就需要 root 許可權了。按照 Simon 的文章中提到的,應用程序有以下兩種辦法臨時獲得 root 許可權:
1)實現一個 init 實現一個 Service ,來幫助 Android 應用程序執行 root 許可權的命令。
2) 實現一個虛擬設備,這個設備幫助 Android 應用程序執行 root 許可權的命令。

講下第一種辦法的過程和遇到的一些問題。

1.將我們要執行的命令寫成腳本,或者可執行程序。
下面是我的腳本 ifconfig_test.sh :

# ! /system/bin/sh
ifconfig

注意: 腳本的第一行必須為 # ! /system/bin/sh ,否則無法執行,通過 dmesg 可以查看到信息內容為 cannot execve ./ifconfig_test.sh: Exec format error

也可以採用 C/C++ 編寫需要執行的命令或者程序,並在編譯 image 的時候編譯成可執行程序。

2. 在 init.rc 中注冊 service
Android 中的 service 需要在 init.rc 中注冊, Init.rc 中定義的 Service 將會被 init 進程創建,這樣將可以獲得root 許可權。當得到相應的通知(通過屬性設置)後, init 進程會啟動該 service 。
本文中注冊的內容如下:

service ifconfig_test /system/etc/ifconfig_test.sh
oneshot
disabled

其中, oneshot 表示程序退出後不再重新啟動, disabled 表示不在系統啟動時啟動。

注意: 這里 service name 不能超過 16 個字元。我之前的 service name 由於定義的比較長, 18 個字元,設置屬性通知 service 啟動後查看 dmesg 可以看到提示: init: no such service 。查看 /system/core/init/parser.c 的源代碼,在 parse_service->valid_name 函數中可以看到如下內容: if (strlen(name) > 16) { return 0; } ,證明service 的名字的確不能超過 16 個字元。

3.將 Android 應用程序提升為 system 許可權
既然應用程序可以通過啟動 service 獲得 root 許可權,那麼豈不是很不安全。 Android 考慮到了這點,規定只有system 許可權的應用程序才能設置屬性,通知 service 啟動。

4.在應用程序中添加屬性設置代碼
對於 Android 來說,應用程序通知 init 啟動 service 是通過設置系統屬性來完成的,具體為設置 System 系統屬性 「ctl.start」 為 「ifconfig_test」 ,這樣 Android 系統將會幫我們運行 ifconfig_test 這個 service了。
對該系統屬性的設置有三種方法,分別對應三種不同的應用程序:
1) Java 代碼
Android 在 Java 庫中提供 System.getProperty 和 System.setProperty 方法, Java 程序可以通過他們來設置和獲得屬性。代碼如下:
SystemProperties.set("ctl.start", "ifconfig_test");
上面的代碼是通知 Android 執行 ifconfig_test service ,如果需要查詢當前 service 執行的狀態,如是否執行完畢,可以通過如下代碼查詢:
ret = SystemProperties.get("init.svc. ifconfig_test ", "");
if(ret != null && ret.equals("stopped"))
{
return true;
}

2) JNI 代碼
當編寫 NDK 的程序時,可以使用 property_get 和 property_set 這兩個 API 來獲得和設置屬性。使用這兩個API 必須要包含頭文件 cutils/properties.h 和鏈接 libcutil 庫。

3) Shell 腳本
Android 提供了命令行 setprop 和 getprop 來設置和獲取屬性,他們可以在腳本中被使用。

由於我的程序是在 JNI 中調用腳本,腳本中又執行 ifconfig ,因此我將設置屬性的部分放在了腳本中完成,代碼如下:
setprop ctl.start ifconfig_test

#wait for the service until it stops
ret=1
while [ $ret -ne 0 ]
do
getprop | grep "$ENABLE_MAPPER_SRV" | grep stopped
ret=$?
done

通過上面 4 個步驟, Android 應用程序就獲得了 root 許可權,更具體的說,是在執行我們需要執行的命令時臨時獲得了 root 許可權。

如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】

希望我的回答對您有所幫助,望採納!

~ O(∩_∩)O~

⑹ android系統中,有關框架層的代碼應該在以下哪個目錄中

Google提供的Android包含了原始Android的目標機代碼,主機編譯工具、模擬環境,下載的代碼包經過解壓後(這里是Android2.2的源碼包),源代碼的第一層目錄結構如下:
|-- Makefile
|-- bionic (bionic C庫)
|-- bootable (啟動引導相關代碼)
|-- build (存放系統編譯規則及generic等基礎開發包配置)

|-- cts (Android兼容性測試套件標准)
|-- dalvik (dalvik JAVA虛擬機)
|-- development (應用程清塌序開發相關)
|-- external (android使用的一些開源的模組)
|-- frameworks (旦碰核心框架——java及C++語言)
|-- hardware (主要保護硬解適配層HAL代碼)
|-- libcore
|-- ndk
|-- device
|-- out (編譯完成後的代碼輸出與此目錄)
|-- packages (應用程序包)
|-- prebuilt (x86和arm架構下預編譯的一些資源)
|-- sdk (sdk及模擬器)
|-- system (文件系統庫、應用及組件——C語言)
`-- vendor (廠商定製代碼)

bionic 目錄

|-- libc (C庫)
| |-- arch-arm (ARM架構,包含系統調用匯編實現)
| |-- arch-x86 (x86架構,包含系統調用匯編實現)
| |-- bionic (由C實現的功能,架構無關)
| |-- docs (文檔)
| |-- include (頭文件)
| |-- inet
| |-- kernel (Linux內核中的一些頭文件)
| |-- netbsd (?netbsd系統相關,具體作用不明)
| |-- private (?一些私有的頭文件)
| |-- stdio (stdio實現)
| |-- stdlib (stdlib實現)
| |-- string (string函數實現)
| |-- tools (幾個工具)
| |-- tzcode (時區相關代碼)
| |-- unistd (unistd實現)
| `-- zoneinfo (時區信息)
|-- libdl (libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能)
|-- libm (libm數學庫的實現,)
| |-- alpha (apaha架構)
| |-- amd64 (amd64架構)
| |-- arm (arm架構)
| |-- bsdsrc (?bsd的源碼)
| |-- i386 (i386架構)
| |-- i387 (i387架答遲圓構?)
| |-- ia64 (ia64架構)
| |-- include (頭文件)
| |-- man (數學函數,後綴名為.3,一些為freeBSD的庫文件)
| |-- powerpc (powerpc架構)
| |-- sparc64 (sparc64架構)
| `-- src (源代碼)
|-- libstdc++ (libstdc++ C++實現庫)
| |-- include (頭文件)
| `-- src (源碼)
|-- libthread_db (多線程程序的調試器庫)
| `-- include (頭文件)
`-- linker (動態鏈接器)
`-- arch (支持arm和x86兩種架構)

bootable 目錄

|-- bootloader (適合各種bootloader的通用代碼)
| `-- legacy (估計不能直接使用,可以參考)
| |-- arch_armv6 (V6架構,幾個簡單的匯編文件)
| |-- arch_msm7k (高通7k處理器架構的幾個基本驅動)
| |-- include (通用頭文件和高通7k架構頭文件)
| |-- libboot (啟動庫,都寫得很簡單)
| |-- libc (一些常用的c函數)
| |-- nandwrite (nandwirte函數實現)
| `-- usbloader (usbloader實現)
|-- diskinstaller (android鏡像打包器,x86可生產iso)
`-- recovery (系統恢復相關)
|-- edify (升級腳本使用的edify腳本語言)
|-- etc (init.rc恢復腳本)
|-- minui (一個簡單的UI)
|-- minzip (一個簡單的壓縮工具)
|-- mttils (mtd工具)
|-- res (資源)
| `-- images (一些圖片)
|-- tools (工具)
| `-- ota (OTA Over The Air Updates升級工具)
`-- updater (升級器)

build目錄

|-- core (核心編譯規則)
|-- history (歷史記錄)
|-- libs
| `-- host (主機端庫,有android 「cp」功能替換)
|-- target (目標機編譯對象)
| |-- board (開發平台)
| | |-- emulator (模擬器)
| | |-- generic (通用)
| | |-- idea6410 (自己添加的)
| | `-- sim (最簡單)
| `-- proct (開發平台對應的編譯規則)
| `-- security (密鑰相關)
`-- tools (編譯中主機使用的工具及腳本)
|-- acp (Android "acp" Command)
|-- apicheck (api檢查工具)
|-- applypatch (補丁工具)
|-- apriori (預鏈接工具)
|-- atree (tree工具)
|-- bin2asm (bin轉換為asm工具)
|-- check_prereq (檢查編譯時間戳工具)
|-- dexpreopt (模擬器相關工具,具體功能不明)
|-- droiddoc (?作用不明,java語言,網上有人說和JDK5有關)
|-- fs_config (This program takes a list of files and directories)
|-- fs_get_stats (獲取文件系統狀態)
|-- iself (判斷是否ELF格式)
|-- isprelinked (判斷是否prelinked)
|-- kcm (按鍵相關)
|-- lsd (List symbol dependencies)
|-- releasetools (生成鏡像的工具及腳本)
|-- rgb2565 (rgb轉換為565)
|-- signapk (apk簽名工具)
|-- soslim (strip工具)
`-- zipalign (zip archive alignment tool)

dalvik目錄 dalvik虛擬機
.
|-- dalvikvm (main.c的目錄)
|-- dexmp (dex反匯編)
|-- dexlist (List all methods in all concrete classes in a DEX file.)
|-- dexopt (預驗證與優化)
|-- docs (文檔)
|-- dvz (和zygote相關的一個命令)
|-- dx (dx工具,將多個java轉換為dex)
|-- hit (?java語言寫成)
|-- libcore (核心庫)
|-- libcore-disabled (?禁用的庫)
|-- libdex (dex的庫)
|-- libnativehelper (Support functions for Android's class libraries)
|-- tests (測試代碼)
|-- tools (工具)
`-- vm (虛擬機實現)

development 目錄 (開發者需要的一些常式及工具)
|-- apps (一些核心應用程序)
| |-- BluetoothDebug (藍牙調試程序)
| |-- CustomLocale (自定義區域設置)
| |-- Development (開發)
| |-- Fallback (和語言相關的一個程序)
| |-- FontLab (字型檔)
| |-- GestureBuilder (手勢動作)
| |-- NinePatchLab (?)
| |-- OBJViewer (OBJ查看器)
| |-- SdkSetup (SDK安裝器)
| |-- SpareParts (高級設置)
| |-- Term (遠程登錄)
| `-- launchperf (?)
|-- build (編譯腳本模板)
|-- cmds (有個monkey工具)
|-- data (配置數據)
|-- docs (文檔)
|-- host (主機端USB驅動等)
|-- ide (集成開發環境)
|-- ndk (本地開發套件——c語言開發套件)
|-- pdk (Plug Development Kit)
|-- samples (演示程序)
| |-- AliasActivity ()
| |-- ApiDemos (API演示程序)
| |-- BluetoothChat (藍牙聊天)
| |-- BrowserPlugin (瀏覽器插件)
| |-- BusinessCard (商業卡)
| |-- Compass (指南針)
| |-- ContactManager (聯系人管理器)
| |-- CubeLiveWall** (動態壁紙的一個簡單常式)
| |-- FixedGridLayout (像是布局)
| |-- GlobalTime (全球時間)
| |-- HelloActivity (Hello)
| |-- Home (Home)
| |-- JetBoy (jetBoy游戲)
| |-- LunarLander (貌似又是一個游戲)
| |-- MailSync (郵件同步)
| |-- MultiResolution (多解析度)
| |-- MySampleRss (RSS)
| |-- NotePad (記事本)
| |-- RSSReader (RSS閱讀器)
| |-- SearchableDictionary (目錄搜索)
| |-- **JNI (JNI常式)
| |-- SkeletonApp (空殼APP)
| |-- Snake (snake程序)
| |-- SoftKeyboard (軟鍵盤)
| |-- Wiktionary (?維基)
| `-- Wiktionary**(?維基常式)
|-- scripts (腳本)
|-- sdk (sdk配置)
|-- simulator (?模擬器)
|-- testrunner (?測試用)
`-- tools (一些工具)

⑺ 怎麼修改android 啟動過程中的第二個開機畫面

第一個開機畫面是在內核啟動的過程中出現的,它是一個靜態的畫面。第二個開機畫面是在init進程啟動的過程中出現的,它也是一個靜態的畫面。第三個開機畫面是在系統服務啟動的過程中出現的,它是一個動態的畫面。無論是哪一個畫面,它們都是在一個稱為幀緩沖區(frame buffer,簡稱fb)的硬體設備上進行渲染的。接下來,我們就分別分析這三個畫面是如何在fb上顯示的。
1. 第一個開機畫面的顯示過程
Android系統的第一個開機畫面其實是Linux內核的啟動畫面。在默認情況下,這個畫面是不會出現的,除非我們在編譯內核的時候,啟用以下兩個編譯選項:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
第一個編譯選項表示內核支持幀緩沖區控制台,它對應的配置菜單項為:Device Drivers ---> Graphics support ---> Console display driver support ---> Framebuffer Console support。第二個編譯選項表示內核在啟動的過程中,需要顯示LOGO,它對應的配置菜單項為:Device Drivers ---> Graphics support ---> Bootup logo。配置Android內核編譯選項可以參考在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)一文。
幀緩沖區硬體設備在內核中有一個對應的驅動程序模塊fbmem,它實現在文件kernel/goldfish/drivers/video/fbmem.c中,它的初始化函數如下所示:

/**
* fbmem_init - init frame buffer subsystem
*
* Initialize the frame buffer subsystem.
*
* NOTE: This function is _only_ to be called by drivers/char/mem.c.
*
*/

static int __init
fbmem_init(void)
{
proc_create("fb", 0, NULL, &fb_proc_fops);

if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR);

fb_class = class_create(THIS_MODULE, "graphics");
if (IS_ERR(fb_class)) {
printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
fb_class = NULL;
}
return 0;
}
這個函數首先調用函數proc_create在/proc目錄下創建了一個fb文件,接著又調用函數register_chrdev來注冊了一個名稱為fb的字元設備,最後調用函數class_create在/sys/class目錄下創建了一個graphics目錄,用來描述內核的圖形系統。

模塊fbmem除了會執行上述初始化工作之外,還會導出一個函數register_framebuffer:

EXPORT_SYMBOL(register_framebuffer);
這個函數在內核的啟動過程會被調用,以便用來執行注冊幀緩沖區硬體設備的操作,它的實現如下所示:

/**
* register_framebuffer - registers a frame buffer device
* @fb_info: frame buffer info structure
*
* Registers a frame buffer device @fb_info.
*
* Returns negative errno on error, or zero for success.
*
*/

int
register_framebuffer(struct fb_info *fb_info)
{
int i;
struct fb_event event;
......

if (num_registered_fb == FB_MAX)
return -ENXIO;

......

num_registered_fb++;
for (i = 0 ; i < FB_MAX; i++)
if (!registered_fb[i])
break;
fb_info->node = i;
mutex_init(&fb_info->lock);
fb_info->dev = device_create(fb_class, fb_info->device,
MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
if (IS_ERR(fb_info->dev)) {
/* Not fatal */
printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
fb_info->dev = NULL;
} else
fb_init_device(fb_info);

......

registered_fb[i] = fb_info;

event.info = fb_info;
fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
return 0;
}
由於系統中可能會存在多個幀緩沖區硬體設備,因此,fbmem模塊使用一個數組registered_fb保存所有已經注冊了的幀緩沖區硬體設備,其中,每一個幀緩沖區硬體都是使用一個結構體fb_info來描述的。

⑻ 如何寫 Android init.rc-ljbphoebe-ChinaUnix博客

Commands:命令
Actions: 動作
Triggers: 觸發條件
Services: 服務
Options: 選項
Propertise: 屬性

(1) Commands是一些基本的操作,例如:
mkdir /sdcard 0000 system system mkdir /system
mkdir /data 0771 system system
mkdir /cache 0770 system cache
mkdir /config 0500 root root
mkdir /sqlite_stmt_journals 01777 root root
mount tmpfs tmpfs /sqlite_stmt_journals size=4m
這些命令在init可執行程序中被解析,然後調用相關的函數來實現。

(2) Actions(動作)表示一系列的命令,通常在Triggers(觸發條件)中調用,動作和觸發條件的形式為:
on動作的使用示例如下:
on init
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
mkdir /system
init表示一個觸發條件,這個觸發事件發生後,進行設置環境變數和建立目錄的操作稱為一個「動作」

(3) Services(服務)通常表示啟動一個可執行程序,Options(選項)是服務的附加內容,用於配合服務使用。
service vold /system/bin/vold
socket vold stream 0660 root mount
service bootsound /system/bin/playmp3
user media
group audio
oneshot
vold和bootsound分別是兩個服務的名稱,/system/bin/vold和/system /bin/playmp3分別是他們所對應的可執行程序。
socket、user、group、oneshot就是配合服務使用的選項。其中oneshot選項表示該服務只啟動一次,而如果沒有oneshot選項,
這個可執行程序會一直存在--如果可執行程序被殺死,則會重新啟動。

(4) Properties(屬性)是系統中使用的一些值,可以進行設置和讀取。
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
on property:ro.kernel.qemu=1
start adbd
setprop 用於設置屬性,on property可以用於判斷屬性,這里的屬性在整個Android系統運行中都是一致的。
init腳本的關鍵字可以參考init進程的system/core/init/keyword.h文件。
init.rc的使用方法,可以參考說明文件system/core/init/readme.txt
如果想要修改啟動過程只需要修改init.c(system/core/init)或者init.rc里的內容即可.

如何去寫
Android init.rc (Android init language)
Android 初始化語言由四大類聲明組成 : 行為類 (Actions), 命令類 (Commands) ,服務類 (Services), 選項類 (Options).
* 初始化語言以行為單位,由以空格間隔的語言符號組成。 C 風格的反斜杠轉義符可以用來插入空白到語言符號。雙引號也可以用來防止文本被空格分成多個語言符號。當反斜杠在行末時,作為折行符。
* 以 # 開始 ( 前面允許有空格 ) 的行為注釋行。
* Actions 和 Services 隱含聲明一個新的段落。所有該段落下 Commands 或 Options 的聲明屬於該段落。第一段落前的 Commands 或Options 被忽略。
* Actions 和 Services 擁有獨一無二的命名。在它們之後聲明相同命名的類將被當作錯誤並忽略。
Actions
-------
Actions 是一系列命令的命名。 Actions 擁有一個觸發器 (trigger) 用來決定 action 何時執行。當一個 action 在符合觸發條件被執行時,如果它還沒被加入到待執行隊列中的話,則加入到隊列最後。
隊列中的 action 依次執行, action 中的命令也依次執行。 Init 在執行命令的中間處理其它活動 ( 設備創建 / 銷毀 ,property 設置,進程重啟) 。
Actions 表現形式為:
on
Services
--------
Services 是由 init 啟動,在它們退出時重啟 ( 可選 ) 。 Service 表現形式為 :
service [ ]*


...

Options
-------
Options 是 Services 的修飾,它們影響 init 何時、如何運行 service.

critical
這是一個設備關鍵服務 (device-critical service) . 如果它在 4 分鍾內退出超過 4 次,設備將重啟並進入恢復模式。

disabled
這個服務的級別將不會自動啟動,它必須被依照服務名指定啟動才可以啟動。

setenv
設置已啟動的進程的環境變數 的值

socket [ [ ] ]
創建一個名為 /dev/socket/ 的 unix domin socket ,並傳送它的 fd 到已啟動的進程。 必須為 "dgram" 或 "stream". 用戶和組默認為 0.

user
在執行服務前改變用戶名。當前默認為 root. 如果你的進程需要 linux 能力,你不能使用這個命令。你必須在還是 root 時請求能力,並下降到你需要的 uid.

group [ ]*
在執行服務前改變組。在第一個組後的組將設為進程附加組 ( 通過 setgroups()). 當前默認為 root.

oneshot
在服務退出後不重啟。

class
為 service 指定一個類別名。同樣類名的所有的服務可以一起啟動或停止。如果沒有指定類別的服務默認為 "default" 類。

onrestart
當服務重啟時執行一個命令。

Triggers
--------
Triggers( 觸發器 ) 是一個字元串,可以用來匹配某種類型的事件並執行一個 action 。

boot
這是當 init 開始後執行的第一個觸發器 ( 當 /init.conf 被載入 )

=
當 property 被設為指定的值 時觸發。

device-added-
device-removed-
當設備節點被添加或移除時觸發。

service-exited-
當指定的服務存在時觸發


Commands
--------

exec [ ]*
Fork 並執行一個程序 (). 這將被 block 直到程序執行完畢。最好避免執行例如內建命令以外的程序,它可能會導致 init 被阻塞不動。

export
設定全局環境變數 的值 ,當這個命令執行後所有的進程都可以取得。

ifup
使網路介面 聯機。

import
解析一個 init 配置文件,擴展當前配置文件。

hostname
設置主機名

chmod
改變文件訪問許可權

chown
改變文件所屬和組

class_start
當指定類別的服務沒有運行,啟動該類別所有的服務。

class_stop
當指定類別的服務正在運行,停止該類別所有的服務。

domainname
設置域名。

insmod
載入該路徑 的模塊

mkdir [mode] [owner] [group]
在 創建一個目錄 , 可選選項 :mod,owner,group. 如果沒有指定,目錄以 755 許可權, owner 為 root,group 為 root 創建 .

mount
[ ]*
嘗試 mount 到目錄
. 可以用 mtd@name 格式以命名指定一個 mtd 塊設備。 包含"ro","rw","remount","noatime".
例如:
mount -t vfat -o fmask=0000,dmask=0000,rw,flush,noatime,nodiratime /dev/block/mmcblk1p1 /SD1
chown system system /SD1
chmod 0777 /SD1
mount -t vfat -o fmask=0000,dmask=0000,rw,flush,noatime,nodiratime /dev/block/mmcblk1p6 /SD3
chown system system /SD3
chmod 0777 /SD3
setkey
暫時沒有

setprop
設置系統 property 的值 .

setrlimit
設置 resource 的 rlimit.

start
啟動一個沒有運行的服務。

stop
停止一個正在運行的服務。

symlink
創建一個 的符號鏈接到

sysclktz
設置系統時區 (GMT 為 0)

trigger
觸發一個事件。用於調用其它 action 。

write [ ]*
打開 的文件並寫入一個或多個字元串。
Properties
----------
Init 會更新一些系統 property 以提供查看它正在幹嘛。
init.action
當前正在執行的 action, 如果沒有則為 ""

init.command
被執行的命令,如果沒有則為 ""

init.svc.
命名為 的服務的狀態 ("stopped", "running", "restarting")


init.rc 示例 :
-----------------

# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib

mkdir /dev
mkdir /proc
mkdir /sys

mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys

write /proc/cpu/alignment 4

ifup lo

hostname localhost
domainname localhost

mount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /data

import /system/etc/init.conf

class_start default

service adbd /sbin/adbd
user adb
group adb

service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666

service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666

service runtime /system/bin/runtime
user system
group system

on device-added-/dev/compass
start akmd

on device-removed-/dev/compass
stop akmd

service akmd /sbin/akmd
disabled
user akmd
group akmd

調試
---------------
默認情況下, init 執行的程序輸出的信息和錯誤到 /dev/null. 為了 debug ,你可以通過 Android 程序 logwrapper 執行你的程序。這將復位向輸出 / 錯誤輸出到 Android logging 系統 ( 通過 logcat 訪問 ) 。


===============================================================

Android——init.rc腳本

在Android中使用啟動腳本init.rc,可以在系統的初始化中進行簡單的操作。
init.rc啟動腳本路徑:system/core/rootdir/init.rc
內容:

Commands:命令
Actions:動作
Triggers:觸發條件
Services:服務
Options:選項
Properties:屬性
Commands是一些基本操作。如:
mkdir /system
mkdir /data 0771 system system
mkdir /persist 0771 system system
devwait /dev/block/mmcblk0p12
mount ext3 /dev/block/mmcblk0p
Action表示一系列命令,通常在Triggers中調用,如:

on init //表示一個觸發條件
sysclktz 0
loglevel 3
# setup the global environment
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
export LD_LIBRARY_PATH /system/lib
export ANDROID_BOOTLOGO 1
Services通常表示啟動一個可執行程序,Options是服務的附加內容,用於配合服務使用。
service vold /system/bin/vold //vold是服務名稱,/system/bin/vold是所對應的可執行程序。
socket vold stream 0660 root mount //socket是配合服務使用的選項
ioprio be 2
service netd /system/bin/netd
socket netd stream 0660 root system
配合服務使用的選項有socket,user,group,oneshot。
oneshot表示該服務只啟動一次,而如果沒有oneshot選項,這個可執行程序將一直存在——如果可執行程序被殺死,則會重新啟動。
Properties是系統中使用的一些值,可以進行設置和讀寫。
setprop ro.HIDDEN_APP_MEM 5120 //setprop用於設置屬性
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
...
on property:ro.kernel.qemu=1 //on property用於判斷屬性
start adbd
這里的屬性在整個android系統運行中都是一致的。
init腳本的關鍵字可以參考init進程中的system/core/init/keyword.h文件。如:
KEYWORD(chroot, COMMAND, 1, do_chroot) //chroot是命令,do_chroot()是調用的函數,這個函數在init進程中的system/core/init/builtins.c文件中定義。
例如:
service akmd /system/bin/logwrapper /sbin/akmd

閱讀全文

與androidinitc相關的資料

熱點內容
驚變1小時8分鍾才是經典 瀏覽:724
ps如何pdf製作 瀏覽:782
如何按照序號排列文件夾 瀏覽:433
演算法設計與分析基礎網盤 瀏覽:712
linux信號量的使用 瀏覽:61
朴初炫演過的電影 瀏覽:969
掌閱下的書在哪個文件夾 瀏覽:851
程序員學python難嗎 瀏覽:737
源泉插件圖紙加密 瀏覽:609
minitab編程 瀏覽:231
網頁編程語言大全 瀏覽:633
單片機鋰離子 瀏覽:9
單片機交流電流測量 瀏覽:717
小雞模擬器ios游戲一直正在解壓 瀏覽:928
可以把文件夾轉化為文檔的軟體 瀏覽:956
微軟認證高級程序員 瀏覽:887
人工智慧網路演算法工程師 瀏覽:459
白色邊框app是什麼 瀏覽:740
日本愛情尺寸度電影推薦 瀏覽:935
國內女人偷情片 瀏覽:287