編輯:關於Android編程
目前在研究framework框架,AIL是Android初始化語言,以下是根據官方文檔進行的翻譯有助於研究Android啟動過程:
Android初始化語言包含了四種類型的聲明:Actions(行動)、Commands(命令)、Services(服務)和Options(選項)。
所有這些都是以行為單位的,各種記號由空格來隔開。C語言風格的反斜槓號可用於在記號間插入空格。雙引號也可用於防止字符串被空格分割成多個記號。行末的反斜槓用於折行。
注釋行以井號(#)開頭(允許以空格開頭)。
Actions和Services聲明一個新的分組。所有的命令或選項都屬於最近申明的分組。位於第一個分組之前的命令或選項將會被忽略。
Actions和Services有唯一的名字。如果有重名的情況,第二個申明的將會被作為錯誤忽略。(???我們是否應該以覆蓋來代替忽略)
Actions(行動)
----------
Actions其實就是一序列的Commands(命令)。Actions都有一個trigger(觸發器),它被用於決定act
隊列中的每一個act
Actions的形式如下:
on
Services(服務)
----------
Services(服務)是一個程序,他在初始化時啟動,並在退出時重啟(可選)。Services(服務)的形式如下:
service
Options(選項)
----------
Options(選項)是一個Services(服務)的修正者。他們影響Services(服務)在何時,並以何種方式運行。
critical(關鍵)
說明這是一個對於設備關鍵的服務。如果他四分鐘內退出大於四次,系統將會重啟並進入recovery(恢復)模式。
disabled(失效)
說明這個服務不會同與他同trigger(觸發器)下的服務自動啟動。他必須被明確的按名啟動。
setenv
在進程啟動時將環境變量
socket
創建一個Uinx域的名為/dev/socket/
user
在啟動這個服務前改變該服務的用戶名。此時默認為root。(???有可能的話應該默認為nobody)。當前,如果你的進程要求Linux capabilities(能力),你無法使用這個命令。即使你是root,你也必須在程序中請求capabilities(能力)。然後降到你想要的uid。
group
在啟動這個服務前改變該服務的組名。除了(必需的)第一個組名,附加的組名通常被用於設置進程的補充組(通過setgroups())。此時默認為root。(???有可能的話應該默認為nobody)。
on
服務退出時不重啟。
class
指定一個服務類。所有同一類的服務可以同時啟動和停止。如果不通過class選項指定一個類,則默認為"default"類服務。
on
當服務重啟,執行一個命令(下詳)。
Triggers(觸發器)
----------
Triggers(觸發器)是一個用於匹配特定事件類型的字符串,用於使Actions(行動)發生。
boot
這是init執行後的第一個被觸發的Triggers(觸發器)。(在 /init.conf (啟動配置文件)被裝載之後)
這種形式的Triggers(觸發器)會在屬性
device-added-
device-removed-
這種形式的Triggers(觸發器)會在一個設備節點文件被增刪時觸發。
service-exited-
這種形式的Triggers(觸發器)會在一個特定的服務退出時觸發。
Commands(命令)
----------
exec
創建和執行一個程序(
export
在全局環境變量中設在環境變量
ifup
啟動網絡接口
imp
解析一個init配置文件,擴展當前配置。
hostname
設置主機名。
chmod
更改文件訪問權限。
chown
更改文件的所有者和組。
class_start
啟動所有指定服務類下的未運行服務。
class_stop
停止指定服務類下的所有已運行的服務。
domainname
設置域名。
insmod
加載
mkdir
創建一個目錄
mount
試圖在目錄
setkey
待完成......(暫時不可用)
setprop
設置系統屬性
setrlimit
設置
start
啟動指定服務(如果此服務還未運行)。
stop
停止指定服務(如果此服務在運行中)。
symlink
創建一個指向
sysclktz
設置系統時鐘基准(0代表時鐘滴答以格林威治平均時(GMT)為准)
trigger
觸發一個事件。用於將一個act
write
打開路徑為
Properties(屬性)
----------
Init更新一些系統屬性以提供對正在發生的事件的監控能力:
init.act
此屬性值為正在被執行的act
init.command
此屬性值為正在被執行的command的名字,如果沒有則為""。
init.svc.
名為
init.conf實例
-----------------
# 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 /da
imp
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(丟棄)。若你想要獲得調試信息,你可以通過Andoird系統中的logwrapper程序執行你的程序。它會將標准輸出/標准錯誤都重定向到Android日志系統(通過logcat訪問)。
例如:
service akmd /system/bin/logwrapper /sbin/akmd
每一個build.gradle文件代表一個project,一個project會有多個tasks如Android工程:包含Android tasks,build tasks
情境:布局文件中有ScrollView,ScrollView中有個EditView,布局底部有一個控件(見下面布局代碼),程序一啟動EditView就獲取焦點,彈出軟鍵盤
本文介紹利用反射調用資源和id 提出問題: app有一種叫應用牆的廣告,應用牆是在你的程序中彈出一個Activity來展示廣告,比如豌豆廣點通等,集成的時候
(1) (2) package com.example.listview1; import java.util.ArrayList; im