2010年9月30日 星期四

安裝JDK & Eclipse

轉載自: http://www.xiangmocheng.com/2009/06/how-to-install-the-android-sdk-1-5/

1.下载SDK

Android Developers下载linux版本的SDK,要用代理,推荐Hotspot Shield,心中再次问候下伟大的GFW。

下载完成后解压,配置android sdk 环境变量:
$ sudo gedit /home/yourusername/.bashrc

添加下面这行代码(路径大家按照自己的存放目录修改):
export PATH=/home/yourusername/android-sdk-linux_x86-1.5_r1/tools:$PATH

2.配置Java开发环境

参见这里

1).下载安装JDK:
$ sudo apt-get install sun-java5-jdk
or
$ sudo apt-get install sun-java6-jdk

版本不同而已。推荐下载JDK5.0,目前系统镜像的编译不支持JDK6.0.

For Ubuntu 9.10(added 20100416)

由于Ubuntu 9.10上没有jdk5的源,所以不能直接安装,对此有两种方法可以解决:

方法1:从sun网站上下载安装

下载地址: http://java.sun.com/javase/downloads/5u21/jdk,个人倾向安装在 ~/bin目录下

安装:

$ cd ~/bin/
$ chmod 777 jdk-1_5_0_21-linux-i586.bin
$ ./jdk-1_5_0_21-linux-i586.bin

添加到环境变量:

$ sudo gedit ~/.bashrc

加入
export PATH=~/bin/jdk1.5.0_21/bin:$PATH

方法2:从Ubuntu 9.04 源安装

$ sudo gedit /etc/apt/sources.list

添加jdk5源:

deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

这里有另外一组源:

deb http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
save the file and close gedit. Next sync your sources by running

更新源,安装:

$ sudo apt-get update
$ sudo apt-get install sun-java5-jdk

2).如果安装有多个JDK,需要设置当前默认Java解释器:
sudo update-alternatives –config java

3).配置环境变量(可选):
sudo gedit /etc/environment
添加如下两行:
CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun

sudo gedit /etc/jvm
在下面的代码添加到顶部:
/usr/lib/jvm/java-6-sun

设置完成后可以在终端输入java -version测试一下。

3.创建AVD(android virtual device)
android 1.5 中,emulator是不可以直接使用的,必须先创建avd才能使用emulator,

1).查看当前支持版本(在列出的版本中我们需要记住id值,这个值在第2步中使用):
android list targets
2).创建AVD(最后的2表示创建1.5版本的avd):
android create avd –name youravdname –target 2
3).查看是否创建成功(如果成功会显示刚才我们创建的avd信息):
android list avd
4).启动模拟器:
emulator-avd youravdname
(在模拟器中打开中文输入法:Menu->Settings->Local & text->android keyboard,将android keyboard后面的勾去掉就可以了)

4.在Eclipse中搭建android开发环境

1).到http://www.eclipse.org/downloads/下载Eclipse IDE,有JavaEE,Java和RCP,这里选择 Eclipse IDE for Java EE Developers for Linux 32bit下载,如果用的是 x86_64系统的,请选择 Linux 64bit,下载完成后解压即可。

2).安装 Android Eclipse开发插件
在Eclipse内依次选择 Help–Software Updates…项,转换到 Available Software标签,然后单击“ Add Site…”项,在地址文本框中输入http://dl-ssl.google.com/Android/eclipse/, 然后单击“Install”按钮。

返 回 到 “Available Software”页签项 , 选 择“Developer Tools”(这应该是自动检查Android Development Tools和Android Editors),然后单击“ Install…”项。
在安装的界面中,确认“Android Development Tools”和“Android Editors”已经检查,然后单击“ Next”按钮,单击“Finish”按钮,完成安装。

5.设置SDK路径:
在Eclipse中导入android程序后,必须设置sdk版本(工程/属性),否则会出现错误。

android sdk linux 1.5 安装与配置

轉載自: http://zengxx1989.javaeye.com/blog/517395

1.下载android sdk
下载地址如下:
http://dl.google.com/android/android-sdk-windows-1.5_r2.zip
http://dl.google.com/android/android-sdk-linux_x86-1.5_r2.zip
2.下载eclipse 3.4.2
按官方文档说,android sdk 可以运行在eclipse 3.3以上的IDE中,ubuntu源中的eclipse版本过低,建议使用eclipse 3.4.2,其下载地址为:
http://download.actuatechina.com/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700/eclipse-SDK-3.4.2-linux-gtk.tar.gz
3.安装eclipse 3.4.2
先将eclipse解压:
$tar xzvf eclipse-SDK-3.4.2-linux-gtk.tar.gz
将解压出的eclipse文件夹移动到目标目录中去,在这里我设定的安装目标为:/usr/local下。
$sudo mv eclipse /usr/local/
4.安装android sdk
解压android sdk包:
$unzip android-sdk-linux_x86-1.5_r2.zip
移动到目标目录:<在这里我将解压出的sdk文件夹目录改成了android-sdk>
$mv android-sdk-linux_x86-1.5_r2 android-sdk
$sudo mv android-sdk /usr/local/
5.配置环境变量:
修改~/.bashrc文件,加入android sdk与eclipse的环境变量。
$vi ~/.bashrc
在文件的最后加入
export PATH=/usr/local/android-sdk/tools:/usr/local/eclipse:$PATH
保存并退出vi
使配置信息生效
$source ~/.bashrc
6.android avd配置信息的生成
android avd的创建格式为:android create avd -n your-avd-name -t your-targets
其中:-n的参数为我们要创建的avd的名字;-t的参数为Available Android targets的id,我们可以使用命令:android list查寻其具体信息。
$android list

Available Android targets:
id: 1
Name: Android 1.1
Type: Platform
API level: 2
Skins: HVGA-P, HVGA (default), QVGA-P, HVGA-L, QVGA-L
id: 2
Name: Android 1.5
Type: Platform
API level: 3
Skins: HVGA-P, HVGA (default), QVGA-P, HVGA-L, QVGA-L
id: 3
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Description: Android + Google APIs
Based on Android 1.5 (API level 3)
Libraries:
* com.google.android.maps (maps.jar)
API for Google Maps
Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P
Available Android Virtual Devices:

下面我们就以创建一个android 1.5的avd为例:

$android create avd -n android-sdk-15 -t 2

Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]yes

Device ram size: The amount of physical RAM on the device, in megabytes.
hw.ramSize [96]:128

Touch-screen support: Whether there is a touch screen or not on the device.
hw.touchScreen [yes]:yes

Track-ball support: Whether there is a trackball on the device.
hw.trackBall [yes]:yes

Keyboard support: Whether the device has a QWERTY keyboard.
hw.keyboard [yes]:yes

DPad support: Whether the device has DPad keys
hw.dPad [yes]:yes

GSM modem support: Whether there is a GSM modem in the device.
hw.gsmModem [yes]:yes

Camera support: Whether the device has a camera.
hw.camera [no]:

Camera support: Whether the device has a camera.
hw.camera [no]:yes

Maximum horizontal camera pixels
hw.camera.maxHorizontalPixels [640]:854

Maximum vertical camera pixels
hw.camera.maxVerticalPixels [480]:480

GPS support: Whether there is a GPS in the device.
hw.gps [yes]:yes

Battery support: Whether the device can run on a battery.
hw.battery [yes]:yes

Accelerometer: Whether there is an accelerometer in the device.
hw.accelerometer [yes]:yes

Audio recording support: Whether the device can record audio
hw.audioInput [yes]:yes

Audio playback support: Whether the device can play audio
hw.audioOutput [yes]:yes

SD Card support: Whether the device supports insertion/removal of virtual SD Cards.
hw.sdCard [yes]:yes

Cache partition support: Whether we use a /cache partition on the device.
disk.cachePartition [yes]:yes

Cache partition size
disk.cachePartition.size [66MB]:100MB

Created AVD ''android-sdk-15'' based on Android 1.5

这样我们就创建了一个基于1.5的avd,上面的具体意思我想大家都能看懂,就不多说了。下在我们就可以测试一下android emulator了:

$emulator @android-sdk-15 -show-kernel

这样就可以启动android emulator了:

加入参数-show-kernel是为了在终端上打印android kernel的信息。

2010年9月29日 星期三

參考

http://blog.sina.com.cn/u/1580234053

SDK preparation

Set the system to have at least 1.5G RAM & large disk space.

1.      Download the SDK

yum/apt-get install curl
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir working-directory-name
$ cd working-directory-name
$ repo init -u git://android.git.kernel.org/platform/manifest.git (the latest), or
../bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5 => get certain branch
$ repo sync

2.      Install JDK and apache
JDK 5 or JDK 6 (JRE alone is not sufficient, download from Java Website)
Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows

revise ~/.bashrc
export JAVA_HOME=/home/xxx/Download/jdk1.5.0_14
export ANT_HOME=/home/xxx/ Download /apache-ant-1.7.0
export ANDROID_SDK=/home/xxx/android/xxx
export 
PATH=$ ANDROID_SDK/tools: $JAVA_HOME/bin:$ANT_HOME/bin:$PATH

Note: 1.6.0 JDK not supported in Android SDK compilation

3.      build
> make
The out folder include the output target file system


 Note: Set the Memory big enough. Otherwise, the src could not be compiled.

Kernel Preparation

1.      Get the kernel code

mkdir ~/android-kernel
cd ~/android-kernel
> git clone git://android.git.kernel.org/kernel/common
> cd common
> git branch goldfish origin/android-goldfish-2.6.27
> git checkout goldfish

Note: Goldfish platform emulates ARM926ejs, we only need to revise the .config for versatile purpose.

2.      Set up cross compiler

look into prebuilt folder for toolchain
$export PATH=$PATH:/home/vadmin/android-source/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
$export CROSS_COMPILE=arm-eabi-
$export ARCH=arm

Note: some suggest arm2007q3 in www.codesourcery.com.

3.      revise .config

> make menuconfig,
enable nfs, device drivers (serial driver, network driver, display etc.), networking for bootable kernel.

Following options are from others' blogs,

Must have:

CONFIG_AEABI=y   
        CONFIG_SHMEM=y   
        CONFIG_ASHMEM=y
        CONFIG_ARM_THUMB=y
        CONFIG_ANDROID_BINDER_IPC=y
        CONFIG_ANDROID_LOGGER=y
       
Options:
        CONFIG_ANDROID_POWER=y
        CONFIG_ANDROID_POWER_STAT=y
        CONFIG_ANDROID_POWER_ALARM=y
        CONFIG_ANDROID_RAM_CONSOLE=y
        CONFIG_ANDROID_TIMED_GPIO=y No such
        CONFIG_ANDROID_PARANOID_NETWORK=y

disable those with Goldfish:

Device Drivers  ---> Character devices  ---> < > Goldfish TTY Driver
Device Drivers  ---> Power supply class support  ---> < >   Goldfish battery driver (NEW)
Device Drivers  ---> Real Time Clock  ---> < >   GOLDFISH (NEW)
Device Drivers  ---> Graphics support  ---> Support for frame buffer devices  ---> < >   Goldfish Framebuffer

Select drivers related:

Device Drivers  ---> Graphics support  ---> Support for frame buffer devices  ---> <*>   LCD framebuffer support (ARM PL011)
Device Drivers  ---> Graphics support  ---> [*] Bootup logo  ---> [*]   Standard black and white Linux logo
Device Drivers  ---> Graphics support  ---> [*] Bootup logo  ---> [*]   Standard 16-color Linux logo
Device Drivers  ---> Graphics support  ---> [*] Bootup logo  ---> [*]   Standard 224-color Linux logo

Select Android Kernel options
Kernel Features  ---> [*] Use the ARM EABI to compile the kernel
General setup  ---> [*] Use full shmem filesystem
General setup  ---> [*] Enable Android's Shared Memory Subsystem
System Type  ---> [*] Support Thumb user binaries
Device Drivers  ---> Android  ---> [*] Android log driver
Device Drivers  ---> Android  ---> <*> Binder IPC Driver

Optionally select:
Device Drivers  ---> Android  ---> [*] RAM buffer console
Device Drivers  ---> Android  ---> [*] Android timed gpio driver
Device Drivers  ---> Android  ---> [*] Only allow certain groups to create sockets
其余CONFIG选项,如系统支持请一并选择
CONFIG_ANDROID_POWER =y
CONFIG_ANDROID_POWER_STAT =y
CONFIG_ANDROID_POWER_ALARM =y
(可以在Kconfig文件中查找ANDROID_POWER等字段进行选择,或者直接修改.config文件)

4.      Compile

- compile uboot
make clean; make versatile_config; make

- compile kernel
make uImage  
File System Preparation


1.      /dev add ‘null’ and ‘console’
mknod –m 660 null c 1 3
mknod –m 660 console c 5 1


2.      setenv bootargs ip=dhcp root=/dev/nfs nfsroot=x.x.x.x:/export/root console=ttyAMA0,115200 init=/init

if you want to get info from ramdisk.img: (no need actually)
#gunzip ramdisk.img.gz
#cpio -i -F ../ramdisk.img //add new folder and jump in
  

3.      删除nfs_root/init.rc,去掉除mount tmpfs tmpfs /sqlite_stmt_journals size=4m之外所有的mount命令

Some Problems:
·         NFS: can not open root device “nfs” or unknown-block(0, 255)
s: menuconfig enable “nfs root”

·         IP-Config: No network device available
enable smc-xxx network device driver

·         rpcbind:server xxx not responding, timed out
Server side: /etc/hosts.allow, > echo “ALLALL@10.6.48.* : ALLOW” >> /etc/hosts.allow
chmod u+x /etc/rc.d/rc.nfsd

0.      拷贝包中的system目录到nfs_root/system, data目录到nfs_root/data, root目录到nfs_root/
out/target/product/generic一些文件:
ramdisk.img
system.imguserdata.img system dataroot


make goldfish_defconfig


编译模拟器内核的时候要切换到gold fish分支
git branch goldfish origin/android-goldfish-2.6.27 
git checkout goldfish
make zImage

2010年9月28日 星期二

git下载Android源代码(含kernel)

Android其实是分两部分的,一部分是上层系统部分,编译出来是system.bin; 另一部分是linux kernel,编译出来是zImage,这两部分需要分别下载编译。
Git下载Android系统源码
1、Git的安装
在Ubuntu 8.04上安装git只要设定了正确的更新源,然后使用apt-get就可以了,有什么依赖问题,就让它自己解决吧。其中curl是一个利用URL语法在命令行下工作的文件传输工具,会在后面安装Repo的时候用到。
sudo apt-get install git-core curl
2、安装Repo
首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中
接下来通过curl来下载Repo脚本,保存到~/bin/repo文件中
curl http://android.git.kernel.org/repo >~/bin/repo
别忘了给repo可执行权限
chmod a+x ~/bin/repo
scd
3、初始化版本库
如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。
先建立一个目录,比如~/android,进去以后用repo init命令即可。
repo init -u git://android.git.kernel.org/platform/manifest.git
最后会看到 repo initialized in /android这样的提示,就说明本地的版本库已经初始化完毕。
4. 下载Android代码
运行如下命令 $ repo sync
5. du -sk 或du -sm 可看文件夹容量大小

Git下载android linux kernel源码(含git其他常用命令)
1. mkdir android_kernel
2. cd android_kernel
3. git clone git://android.git.kernel.org/kernel/common.git (下载默认版本内核源码)
下面是git常用的命令示例:
4. cd common
5. git branch(查看当前分支,结果为android-2.6.27)
6. git branch -r(显示远程branch列表)
   origin/HEAD
origin/android-2.6.25
origin/android-2.6.27
origin/android-2.6.29
origin/android-2.6.32
origin/android-goldfish-2.6.27
origin/android-goldfish-2.6.29

7. git tag (显示tag列表,下面截取一部分结果)
v2.6.25
v2.6.25-rc1
v2.6.25-rc2
v2.6.25-rc3
v2.6.25-rc4
v2.6.25-rc5
v2.6.25-rc6
v2.6.25-rc7
v2.6.25-rc8
v2.6.25-rc9
v2.6.26
v2.6.26-rc1
v2.6.26-rc2
v2.6.26-rc3
v2.6.26-rc4
v2.6.26-rc5
v2.6.26-rc6
v2.6.26-rc7
v2.6.26-rc8
v2.6.26-rc9
v2.6.27
v2.6.27-rc1
v2.6.27-rc2
v2.6.27-rc3
v2.6.27-rc4
v2.6.27-rc5
v2.6.27-rc6
v2.6.27-rc7
v2.6.27-rc8
v2.6.27-rc9
v2.6.28
v2.6.28-rc1
v2.6.28-rc2
v2.6.28-rc3
v2.6.28-rc4
v2.6.28-rc5
v2.6.28-rc6
v2.6.28-rc7
v2.6.28-rc8
v2.6.28-rc9
v2.6.29
v2.6.29-rc1
v2.6.29-rc2
v2.6.29-rc3
v2.6.29-rc4
v2.6.29-rc5
v2.6.29-rc6
v2.6.29-rc7
v2.6.29-rc8

8. git checkout -b android-2.6.29 v2.6.29 (检出一个新branch android-2.6.29)
   git checkout -b android-2.6.25 v2.6.25 (检出一个新branch android-2.6.25)
9. git branch -d android-2.6.27 (删除branch android-2.6.27)
10. git checkout android-2.6.29 (切换至brach android-2.6.29)
11. git format-patch android-2.6.25..android-2.6.29 (会生成4万个patch)
http://android.git.kernel.org可以通过浏览器查看目录结构。

Android Porting Guide for Embedded Platforms

關於PXA310的porting流程

連結位置: http://www.hsc.com/Portals/0/Uploads/Articles/Android-Porting-on-Embedded-Platform_v2_0633850602027036930.pdf

2010年9月24日 星期五

Android内核介绍

轉載自 : http://www.phpfans.net/article/htmls/201006/Mjg3ODQ5.html

已经有一些的文章介绍Android内核了,本系列篇将从Linux内核的角度来分析Android的内核,希望给初学者提够有用的信息。本章将简单的介绍Android内核的全貌,起到一个抛砖引玉的作用。从下一篇开始将详细介绍每一个Android内核驱动程序及其作用。

Android内核是基于Linux 2.6内核的(目前最新开发版本是2.6.31),它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,其核心驱动主要包括:

Android Binder,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPCinter-process communication)。
源代码位于drivers/staging/android/binder.c

Android电源管理(PM,一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。
源代码位于kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c

低内存管理器(Low Memory Killer,相对于Linux标准OOMOut Of Memory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。
源代码位于drivers/staging/android/lowmemorykiller.c

匿名共享内存(ashmem,为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。
源代码位于mm/ashmem.c

Android PMEMPhysicalPMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。
源代码位于drivers/misc/pmem.c

Android Logger,一个轻量级的日志设备,用于抓取Android系统的各种日志。
源代码位于drivers/staging/android/logger.c

Android Alarm,提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准,
源代码位于drivers/rtc/alarm.c

USB Gadget驱动,一个基于标准Linux USB gadget驱动框架的设备驱动,AndroidUSB驱动是基于gaeget框架的,
源代码位于drivers/usb/gadget/

Android Ram Console,为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAMBuffer
源代码位于drivers/staging/android/ram_console.c

Android timed device,提供了对设备进行定时控制功能,目前支持vibratorLED设备。
源代码位于drivers/staging/android/timed_output.c(timed_gpio.c)

Yaffs2文件系统Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NANDNOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存他的运行状态,因此它占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NAND Flash上性能表现尤为明显,非常适合大容量的Flash存储。

Android内核添加或修改的文件很多,下面的列表描述了Android Emulator内核的文件:

drivers/misc/kernel_debugger.c
drivers/misc/pmem.c
drivers/misc/qemutrace/qemu_trace_sysfs.c
drivers/misc/qemutrace/qemu_trace.c
drivers/misc/qemutrace/qemu_trace.h
drivers/misc/uid_stat.c
drivers/staging/android/lowmemorykiller.c
drivers/staging/android/logger.c
drivers/staging/android/timed_output.h
drivers/staging/android/ram_console.c
drivers/staging/android/timed_gpio.c
drivers/staging/android/logger.h
drivers/staging/android/binder.h
drivers/staging/android/binder.c
drivers/staging/android/timed_output.c
drivers/staging/android/timed_gpio.h
drivers/rtc/alarm.c
drivers/rtc/rtc-goldfish.c
drivers/net/pppolac.c
drivers/net/ppp_mppe.c
drivers/net/pppopns.c
drivers/video/goldfishfb.c
drivers/switch/switch_class.c
drivers/switch/switch_gpio.c
drivers/char/dcc_tty.c
drivers/char/goldfish_tty.c
drivers/watchdog/i6300esb.c
drivers/input/misc/gpio_event.c
drivers/input/misc/gpio_input.c
drivers/input/misc/gpio_output.c
drivers/input/misc/keychord.c
drivers/input/misc/gpio_axis.c
drivers/input/misc/gpio_matrix.c
drivers/input/keyreset.c
drivers/input/keyboard/goldfish_events.c
drivers/input/touchscreen/synaptics_i2c_rmi.c
drivers/usb/gadget/android.c
drivers/usb/gadget/f_adb.h
drivers/usb/gadget/f_mass_storage.h
drivers/usb/gadget/f_adb.c
drivers/usb/gadget/f_mass_storage.c
drivers/mmc/host/goldfish.c
drivers/power/goldfish_battery.c
drivers/leds/ledtrig-sleep.c
drivers/mtd/devices/goldfish_nand_reg.h
drivers/mtd/devices/goldfish_nand.c
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
kernel/cpuset.c
kernel/cgroup_debug.c
kernel/cgroup.c
mm/ashmem.c
include/linux/ashmem.h
include/linux/switch.h
include/linux/keychord.h
include/linux/earlysuspend.h
include/linux/android_aid.h
include/linux/uid_stat.h
include/linux/if_pppolac.h
include/linux/usb/android.h
include/linux/wifi_tiwlan.h
include/linux/android_alarm.h
include/linux/keyreset.h
include/linux/synaptics_i2c_rmi.h
include/linux/android_pmem.h
include/linux/kernel_debugger.h
include/linux/gpio_event.h
include/linux/wakelock.h
include/linux/if_pppopns.h
net/ipv4/sysfs_net_ipv4.c
net/ipv4/af_inet.c
net/ipv6/af_inet6.c
net/bluetooth/af_bluetooth.c
security/commoncap.c
fs/proc/base.c



Android内核配置
Android是基于Linux的,对于一个新的设备,我们首先要编译一个支持AndroidKernel,那么如何使你的Kernel Android化呢?除了要移植前面提到的驱动之外,就是如何配置你的Kernel来支持Android平台,这可以参考Goldfish的内核配置文件- arch/arm/configs/goldfish_defconfig
一般来说,我们会基于一个平台标准内核配置选项来配置Android内核,你可以根据具体的硬件平台来选择Android内核的配置选项,可以参考下面的Android内核配置列表:

一般需要支持的内核选项

ANDROID_PARANOID_NETWORK
ASHMEM
CONFIG_FB_MODE_HELPERS
CONFIG_FONT_8x16
CONFIG_FONT_8x8
CONFIG_YAFFS_SHORT_NAMES_IN_RAM
DAB
EARLYSUSPEND
FB
FB_CFB_COPYAREA
FB_CFB_FILLRECT
FB_CFB_IMAGEBLIT
FB_DEFERRED_IO
FB_TILEBLITTING
HIGH_RES_TIMERS
INOTIFY
INOTIFY_USER
INPUT_EVDEV
INPUT_GPIO
INPUT_MISC
LEDS_CLASS
LEDS_GPIO
LOCK_KERNEL
LkOGGER
LOW_MEMORY_KILLER
MISC_DEVICES
NEW_LEDS
NO_HZ
POWER_SUPPLY
PREEMPT
RAMFS
RTC_CLASS
RTC_LIB
SWITCH
SWITCH_GPIO
TMPFS
UID_STAT
UID16
USB_FUNCTION
USB_FUNCTION_ADB
USER_WAKELOCK
VIDEO_OUTPUT_CONTROL
WAKELOCK
YAFFS_AUTO_YAFFS2
YAFFS_FS
YAFFS_YAFFS1
YAFFS_YAFFS2

但是Android推荐不要支持下面两个功能:
CONFIG_YAFFS_DISABLE_LAZY_LOAD
DNOTIFY

配置好后,就可以用Toolchain来编译内核了。编译内核比较简单,以Emulatorkernel为例:
- git clone git://android.kernel.org/kernel/common.git kernel-emulator
- cd kernel-emulator
- export ARCH=arm
- export CROSS_COMPILE=arm-eabi-
- export PATH=PATH
- make goldfish_defconfig
- make

google2.6.25内核里做了什么改动呢?

有家公司专门比较了标准内核和android内核,发现google修改了75个文件,增加了88个文件。改公司还对这些被修改的和新增的文件做了注解。

Goldfish -- 44 Files

Android模拟器运行了一个被google 叫做金鱼"的虚拟CPU.金鱼运行arm926t指令集(arm926t是属于armv5架构);并且仿真了输入输出:比如键盘输入和LCD 输出。这个模拟器其实是在qemu之上开发的,输入输出基于libSDL.

内核里这个Goldfish接口实现了这个虚拟金鱼”CPU的一些接口,如果想在真实设备上运行android,这些接口肯定要去掉的。

arm926ej的介绍见http://www.arm.com/products/CPUs/ARM926EJ-S.html

YAFFS2 -- 35 Files

不同于PC机,文件是存储在硬盘上的;手机使用FLASH作为存储介质。HTCG1使用NANDFLASH——这中存储目前已经相当普及了,而且种类也颇多,(SLC,MLC等等),存储密度也越来越高(已经出现几十G大小的NANDFLASH),价格也越来越低。

YAFFS2是专门用在FLASH上的文件系统,“YAFFS2”"Yet Another Flash File System, 2nd edition"的缩写。YAFFS2Linux内核提供了一个高效访问NANDFLASH的接口。但是NANDFLASH的支持并不包含在标准的2.6.25内核中,所以Google在其中添加了对NANDFLASH的支持。

蓝牙 -- 10 files

在蓝牙通讯协议栈里Google修改了10个文件。这些改动解决了一些跟蓝牙耳机相关的明显的bug,以及一些蓝牙调试和访问控制相关的函数。

调度器 -- 5 files

Android内核还修改了进程调度和时钟相关策略,这个改动就比较深入了。其目的和效果估计在一段时间后才能找到。

android新增的功能 -- 28 files

除了修正一些bug以及其他的改动,android还增加了一些新的子系统,这些系统都比较重要。

IPC Binder

IPC Binder是一种IPC(进程间通信)机制。它是的进程能够为其他进程提供服务——还是通过标准的linux系统调用apiIPC Binder的概念起源于一家叫做“Be.Inc"的公司,在Google之前就已经被然后被用到Palm软件里去了。

Low Memory Killer

其实内核里已经有一个类似的功能, 叫做"oom killer",就是out of memory killer,当内存不够的时候,改策略会试图结束一个进程。不知道为什么Google重新实现了这个策略。

Ashmem

Ashmem,全程Anonymous SHared MEMory,翻译成中文就是匿名共享内存。这个功能使得进程间能够共享大块的内存。比如说,系统可以使用Ashmem保存一些图标,多个应用程序可以访问这个共享内存来获取图标。Ashmem为内核提供了一种回收这些使用完的共享内存块的办法,如果一个进程试图访问这些已经被回收的内存块,它将会得到错误的返回值,以便它重新进行内存块分配和数据初始化。

RAM Console and Log Device

为了调试方便,Android添加了一个功能,使得调试信息可以输入到一个内存块中。此外,Android添加了一个独立的日志模块,这样用户空间的进程能够读写日志消息,调试打印信息等。

Android Debug Bridge

嵌入式设备的调试的确比较麻烦。为了便于调试,google设计了这个调试工具,可以叫做"ADB",使用USB作为连接方式,ADB可以看作是链接android的设备和PC机的一套协议。

Android 还添加了其他的东西,比如 real-time clock, switchtimed GPIO

Power Management -- 5 files

电源管理对于移动设备来说相当重要,也是最复杂,开发难度最高的一个功能。Google添加了一个新的电源管理系统,并没有原先apm,dpm等。

其他修改 -- 36 files

除了上述改动之外,还有一些小改动,比如新增的额外的调试功能, 键盘背光控制,TCP 网络管理等等,共涉及36个文件。

根据上述,google对标准的内核做了很大的改动。相比其他的项目,比如Nokia N810,Openmoko等项目中,内核的改动仅仅是增加了某个平台的支持。所以移植最快也是最可能的办法是在google使用的kernel上增加平台支持。

也有一些开发人员将google2.6.25内核的改动做成补丁,直接打在自己开发的内核上——当然,自己的内核也应该是2.6.25,否则会出问题。

2010年9月23日 星期四

Android内核的簡單分析

Google的Android操作系统已经成功面市,因为Android操作系统是基于Linux-2.6.25内核的,并且目前所有的源代码也都全部开放,因此可以简单地加以分析以方便以后向其他平台移植工作.

   首先需要了解的就是Android的一些基本情况,并下载Android的源代码以方便分析.

   Android的官方站点:

   http://www.android.com/

   Android Source 的官方安装方法:

   http://source.android.com/download



   Android的中文站点:

   http://www.androidin.com/

   源代码包的相应联结地址:
 
   http://www.androidin.com/bbs/viewthread.php?tid=2337


   我们可以采用Android官方站点推荐方式来下载Android的源代码,也可以从Android中文站点直接下载源代码程序包,随后再更新和同步.
 
   当采用Android官方推荐方式下载或者需要更新你的源代码时,都需要git工具支持, 当你的系统没有安装git或者git版本过低时,建议从下面的地址更新到最新的git包.(Android要求git版本必须大于1.5.4)

   http://git.or.cz/

   给git自动升级的方式:

   git clone git://git.kernel.org/pub/scm/git/git.git

    
   如果采用下载源代码包的方式,下载并展开后,在 .repo/repo 目录下有同步执行的文件repo, 你可以将其拷贝到你的PATH所在路径以备使用,例如/usr/bin等等. 或者也可以从Android站点得到最新的repo文件并复制到PATH所在路径.

   wget http://android.git.kernel.org/repo

   源代码包解开后,其主目录下存在repo_sync.sh文件, 其主要是执行repo sync以实现和Android站点同步代码包的目的, 当执行出错后将再一次运行repo sync命令直到同步正常结束,但原文件包含错误,建议改成下面的程序原文件中少了一个空格)

#!/bin/bash
echo "============start repo sync================="
repo sync
while [ $? = 1 ]; do
echo "============sync failed, re-sync again ====="
sleep 3
repo sync
done


   这样, 运行sh repo_sync.sh就可以自动实现本地代码包的同步和更新动作了.

   我在Fedora Core 6上经过同步之后, du -h ./mydroid, 占用空间大约是2.1G

   以下为Android官方公布的架构图

 




   在kernel子目录下存放的就是Android的Linux Kernel了, 通过和标准的Linux 2.6.25 Kernel的对比,我们可以发现,其主要增加了以下的内容:


   1. 基于ARM架构增加Gold-Fish平台,相应增加的目录如下:

      kernel/arch/arm/mach-goldfish

      kernel/include/asm-arm/arch-goldfish




      目前Google的基于Gold-Fish的手机为G1手机,明年G2手机将面世。
      该手机采用QualComm公司的高性能处理芯片MSM7201A,该芯片以ARM 11作为Application应用处理器,以ARM926T作为BaseBand主处理器(主要承载GSM/GPRS/EDGE/3G等协议栈处理),支持JAVA硬加速(ARM本身也自带JAVA硬件处理),包含GPS Processor, 支持2D/3D图形加速(每秒可处理4百万个多边形),另外还支持最大800万像素的Sensor, 支持MPEG 4/H.263/H.264/Real Media等多种Codec。
      其中ARM926T采用的主频为274M HZ, ARM11的主频为528MHZ. (MSM7200的ARM11的主频为400M HZ)
      因为没有找到MSM7201A的详细DataSheet, 因此可以简单地参考MSM7200的规格:

      MSM7200_DataSheet.pdf


      下面为MSM7200架构图 :




   2. 增加了yaffs2 FLASH文件系统,相应增加的目录为:

      kernel/fs/yaffs2

      实际上,Android包经过编译后生成的system.img和ramdisk.img文件就是yaffs2格式的包.
   
   3. 增加了Android的相关Driver,相应目录为:
      kernel/drivers/android 

      主要分为:
           Android IPC系统:       Binder (binder.c)
           Android 日志系统:       Logger (logger.c)

           Android 电源管理:       Power (power.c)

           Android 闹钟管理:       Alarm  (alarm.c)
           Android 内存控制台:     Ram_console (ram_console.c)

           Android 时钟控制的gpio: Timed_gpio (timed_gpio.c)

   4. 增加了switch处理, 相应的目录为:
      kernel/drivers/switch/   

   5. 增加了一种新的共享内存处理方式, 相应增加的文件为:
      kernel/mm/ashmem.c 
          
   6.  其他为Linux-2.6.25内核所做的补丁等等,例如BlueTooth, 在此不做详细分析



 
   另外GoldFish平台相关的驱动文件如下:
   1. 字符输出设备:
      kernel/drivers/char/goldfish_tty.c    
   2. 图象显示设备: (Frame Buffer)
      kernel/drivers/video/goldfishfb.c 
   3. 键盘输入设备:
      kernel/drivers/input/keyboard/goldfish_events.c
   4. RTC设备: (Real Time Clock)
      kernel/drivers/rtc/rtc-goldfish.c
   5. USB Device设备:
      kernel/drivers/usb/gadget/android_adb.c
   6. SD卡设备:
      kernel/drivers/mmc/host/goldfish.c
    
   7. FLASH设备:
      kernel/drivers/mtd/devices/goldfish_nand.c
      kernel/drivers/mtd/devices/goldfish_nand_reg.h
   8. LED设备:
      kernel/drivers/leds/ledtrig-sleep.c
   9. 电源设备:
      kernel/drivers/power/goldfish_battery.c
   10. 音频设备:
       kernel/arch/arm/mach-goldfish/audio.c
   11. 电源管理:
       kernel/arch/arm/mach-goldfish/pm.c
   12. 时钟管理:
       kernel/arch/arm/mach-goldfish/timer.c

   下面的链接为Android Kernel和标准Linux-2.6.25包相比较所产生的PATCH包, 其中比较小的other patch包是除了上面列出的增加文件之外所修改的文件细节,供大家参考。
   http://blogimg.chinaunix.net/blog/upfile2/090102095410.gz

   以下为Android内核启动信息:
Uncompressing Linux.................................................................................... done, booting the kernel.
emulator: emulator window was out of view and was recentred
Linux version 2.6.25-00350-g40fff9a (android-build@apa27.mtv.corp.google.com) (gcc version 4.2.1) #1 Wed Jul 23 18:10:44 PDT 2008
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00003137
Machine: Goldfish
Memory policy: ECC disabled, Data cache writeback
CPU0: D VIVT write-through cache
CPU0: I cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets
CPU0: D cache: 65536 bytes, associativity 4, 32 byte lines, 512 sets
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 24384
Kernel command line: qemu=1 console=ttyS0 android.checkjni=1 android.qemud=ttyS1 android.ndns=2
Unknown boot option `android.checkjni=1': ignoring
Unknown boot option `android.qemud=ttyS1': ignoring
Unknown boot option `android.ndns=2': ignoring
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 96MB = 96MB total
Memory: 94268KB available (2380K code, 445K data, 100K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 152 bytes
android_power_init
android_power_init done
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
checking if image is initramfs... it is
Freeing initrd memory: 136K
goldfish_new_pdev goldfish_interrupt_controller at ff000000 irq -1
goldfish_new_pdev goldfish_device_bus at ff001000 irq 1
goldfish_new_pdev goldfish_timer at ff003000 irq 3
goldfish_new_pdev goldfish_rtc at ff010000 irq 10
goldfish_new_pdev goldfish_tty at ff002000 irq 4
goldfish_new_pdev goldfish_tty at ff011000 irq 11
goldfish_new_pdev smc91x at ff012000 irq 12
goldfish_new_pdev goldfish_fb at ff013000 irq 13
goldfish_new_pdev goldfish_audio at ff004000 irq 14
goldfish_new_pdev goldfish_memlog at ff006000 irq -1
goldfish_new_pdev goldfish-battery at ff014000 irq 15
goldfish_new_pdev goldfish_events at ff015000 irq 16
goldfish_new_pdev goldfish_nand at ff016000 irq -1
goldfish_new_pdev goldfish-switch at ff017000 irq 17
goldfish_new_pdev goldfish-switch at ff018000 irq 18
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish_nand
goldfish_pdev_worker registered goldfish_events
goldfish_pdev_worker registered goldfish-battery
goldfish_pdev_worker registered goldfish_memlog
goldfish_audio_probe
goldfish_pdev_worker registered goldfish_audio
goldfish_pdev_worker registered goldfish_fb
goldfish_pdev_worker registered smc91x
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_rtc
goldfish_pdev_worker registered goldfish_timer
goldfish_pdev_worker registered goldfish_device_bus
goldfish_pdev_worker registered goldfish_interrupt_controller
ashmem: initialized
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
yaffs Jul 23 2008 18:10:35 Installing.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
allocating frame buffer 320 * 480, got ffc10000
Console: switching to colour frame buffer device 40x30
console [ttyS0] enabled
brd: module loaded
loop: module loaded
nbd: registered device at major 43
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@cam.org>
No IRQF_TRIGGER set_type function for IRQ 12 (goldfish)
eth0: SMC91C11xFD (rev 1) at c6800000 IRQ 12 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
goldfish nand dev0: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev1: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev2: size 4000000, page 2048, extra 64, erase 131072
mice: PS/2 mouse device common for all mice
*** events probe ***
events_probe() addr=0xc6804000 irq=16
events_probe() keymap=qwerty2
input: qwerty2 as /class/input/input0
goldfish_rtc goldfish_rtc: rtc core: registered goldfish_rtc as rtc0
logger: created 64K log 'log_main'
logger: created 64K log 'log_events'
logger: created 64K log 'log_radio'
IPv4 over IPv4 tunneling driver
GRE over IPv4 tunneling driver
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0
goldfish_rtc goldfish_rtc: setting system clock to 2009-01-02 07:43:01 UTC (1230882181)
Freeing init memory: 100K
init: cannot open '/initlogo.rle'
yaffs: dev is 32505856 name is "mtdblock0"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs: dev is 32505857 name is "mtdblock1"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.1, "mtdblock1"
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
sh: can't access tty; job control turned off
# init: cannot find '/system/bin/playmp3', disabling 'bootsound'
eth0: link up
warning: `rild' uses 32-bit capabilities (legacy support in use)
init: sys_prop: mis-match msg size recieved: -1 expected: 128
  从启动信息可以看出,其主CPU为ARM926EJ-S,并非ARM11 CPU, 说明下载的Emulator内核并非是针对G1手机的,估计只是实现了对ARM926EJ-S CPU的模拟
   以上为Android内核的大致分析,希望能给有兴趣的人员以简单帮助。 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dishening7/archive/2009/01/04/3706378.aspx