一旦你的代码是建立和您确认所有必要的目录存在,如下所述实现上电测试您的设备。Bring up tests通常强调你的系统某个方面,让你来描述设备的测试行为。
1。确认了一个基本的Linux内核全新安装, 然后才考虑Android-specific修改Linux内核,验证您可以构建,部署和目标硬件上启动Linux kernel。
2。修改你的内核配置,以适应Android的驱动程序, 你的内核配置文件应包括以下内容:
#
# Android
#
# CONFIG_ANDROID_GADGET is not set
# CONFIG_ANDROID_RAM_CONSOLE is not set
CONFIG_ANDROID_POWER=y
CONFIG_ANDROID_POWER_STAT=y
CONFIG_ANDROID_LOGGER=y
# CONFIG_ANDROID_TIMED_GPIO is not set
CONFIG_ANDROID_BINDER_IPC=y
3。写驱动程序
Android附带所有基本功能默认驱动程序,但你可能会希望编写您自己的设备取决于您的硬件配置您自己的驱动程序(或至少定制的默认驱动程序)。见下面的例子主题如何编写自己的驱动程序。
· •音频
· •键盘和键盘
· •显示
4。烧Image到Flash
一个 image 代表了一个系统状态或在non-volatile memory的系统的一部分状态。在 build过程应产生以下系统images:
•bootloader:引导加载程序是一个小程序的启动操作系统的加载负责。
•boot:
•recovery:
•system:该系统图像存储的机器人作业系统的快照。
•data:图像数据存储用户数据。凡是不保存到/数据目录将在重新启动时丢失的设备。
•kernel:内核代表了一个操作系统最基本的要素。 Android的Linux内核负责管理本系统的资源,作为硬件和系统之间的应用软件抽象层的行为负责。
•ramdisk:RAMDisk的定义了一组随机存取存储器(RAM的部分)的被使用,就好像它是一个硬盘驱动器。
在启动时, 配置bootloader加载内核到RAM中与ramdisk并传递RAMDisk的地址到内核。
5. 启动内核并安装RAMDisk.
6. 调试Android-specific的RAMDisk的初始方案
Android-specific初始化方案可以在device/system/init。添加日志信息,以帮助您调试定义device/system/init/init.c.的LOG宏潜在的问题。
init程序直接安装所有文件系统和设备的使用或硬编码的文件名称或探测的sysfs文件系统(从而消除了一个/ etc / fstab文件中的机器人需要生成的设备名称)。经过设备/系统文件被安装后,init读取的/ etc / init.rc并调用那里的listed方案(其中第一个是console shell)。
7 验证应用程序已开始
一旦壳可用时,执行%ps 确认下列正在运行的应用程序:
· /system/bin/logd
· /sbin/adbd
· /system/bin/usbd
· /system/bin/debuggerd
· /system/bin/rild
· /system/bin/app_process
· /system/bin/runtime
· /system/bin/dbus-daemon
·
system_server
这些应用程序的每一个嵌入式Linux的C / C + +,你可以使用任何标准的Linux调试工具来解决应用程序没有运行。% make的情况,以确定确切showcommands build命令。 gdbserver的(GNU调试器),可在该系统分区(请seehttp bin目录:/ / sourceware.org / / GDB中获取更多信息)。
8。pulling it all together
如果bring up成功,你应该看到下面的Java应用程序的图标()上看到的液晶面板:
•com.google.android.phone:与Android应用相关。
•com.google.android.home
•android.process.google.content
如果他们不可见或不响应键盘控制,运行framebuffer/keypad测试。
And Android Language初始化
在Android的Init语言包括四个报表广泛的类:
• Actionn
• Commands
• Services
• Options
该语言的语法包括以下公约:
•所有的类都行的,并用空格分隔标记组成。 C风格的反斜杠转义可用于插入空白把一个记号。双引号也可以用于防止分裂成多个标记文本的空白。一个反斜杠作为一个行的最后一个字符出现的用于分行。
•#表示行注释,(允许空格)。
•隐式声明的Actions and Services的新sections。所有的命令或选项属于最近声明部分。命令或之前第一部分将被忽略。
•Actions and Services 有唯一的名称。如果第二个操作或服务是与作为一个现有的同名声明,它将作为被忽略的一个错误。
Actions
Actions被命名的命令序列。用Actions来决定何时行动应该发生一个触发器。当一个事件发生,以配合行动的触发,该操作被添加到一个要被执行的队列尾部(除非它已在队列)。
队列中的每个Action作出队列顺序。Actions中的每个命令按顺序执行。Init 处理其他activities(device creation/destruction, property setting, process restarting)“与”在activities中的命令执行。
Actions采取下列形式:
on <trigger>
<command>
<command>
<command>
Services
Services 在init中启动并(可配置)退出时重新启动。
Services采取下列形式:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
Options
Options会影响运行时初始化service。
参数的说明如下表:
Option |
Description |
|
This service will not automatically start with its class. It must be explicitly started by name. |
|
Create a unix domain socket named |
|
Change to username before exec'ing this service. Currently defaults to root. |
|
Change to groupname before exec'ing this service. Additional groupnames beyond the first, which is required, are used to set additional groups of the process (with |
|
Set linux capability before exec'ing this service |
|
Do not restart the service when it exits. |
|
Specify a class name for the service. All services in a named class must start and stop together. A service is considered of class "default" if one is not specified via the class option. |
Triggers
Triggers是用于匹配的事件字符串,促发某种action发生。
Trigger |
Description |
|
This is the first trigger that occurs when init starts (after |
|
Triggers of this form occur when the property |
|
Triggers of these forms occur when a device node is added or removed. |
|
Triggers of this form occur when the specified service exits. |
Commands
Command |
Description |
|
Fork and execute a program ( |
|
Set the environment variable |
|
Bring the network interface |
|
Parse an init config file, extending the current configuration. |
|
Set the host name. |
|
Start all services of the specified class if they are not already running. |
|
Stop all services of the specified class if they are currently running. |
|
Set the domain name. |
|
Install the module at |
|
Make a directory at |
|
Attempt to mount the named device at the directory |
|
- currenlty undefined - |
|
Set system property |
|
Set the rlimit for a resource. |
|
Start a service running if it is not already running. |
|
Stop a service from running if it is currently running. |
|
Create a symbolic link at |
|
Open the file at |
Properties
Init更新一些系统属性,以提供一些系统活动信息::
Property |
Description |
|
Equal to the name of the action currently being executed or "" if none. |
|
Equal to the command being executed or "" if none. |
|
State of a named service ("stopped", "running", or "restarting"). |
例如init.conf
下面的代码段是一个不完整的init.conf文件的例子,便是为了让您了解什么是正确的配置类似的想法.
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