用Eclipse编译AOSP中的App或者把自己的App加入到ROM

正如标题所说,本文分为两个部分。比较熟悉Android工程的同学应该都会,老鸟可以完全略过此文。

一、用Eclipse来编译AOSP(Android Open Source Project)中的某个App
Google好心或者出于商业原因,把一些系统自带的App都开源了,如果我们想研究某个App,但是又不想为此每次去编译整个ROM(因为有些系统自带的App会用到一些Internal或者Hidden的API,无法直接把App的源码导入到Eclipse当中用标准SDK编译通过),那我们该怎么办呢?
以Camera为例,在Eclipse中直接通过已有源码创建一个工程之后可能会出现如下错误:
android.filterpacks.*中的很多Class找不到
android.hardware.CameraSound这个Class找不到
想想这些找不到的Class应该是存在于某个地方,只是我们通过SDK来编译的时候找不到,否则为什么在整个ROM编译的时候能通过。
所以我们要做的就是把这些“特殊”的Class都引入到Eclipse的编译环境中来。
Google或者动动脑筋在本地机器上搜索搜索缺失的Class的名字,应该能找出来对应的jar包再哪(这些jar包都是我们编译整个ROM的时候生成的,只是没有被添加到发行的SDK里面,所以我们得成功编译整个ROM至少一次,Ubuntu 11.10 X64编译ROM可以参照《在Ubuntu 11.10 X64上编译Android源码》,最好是参照官方说明),然后引入进来。
在ICS当中,编译Camera需要额外引入的jar包有这么两个:
path/to/aosp/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
path/to/aosp/out/target/common/obj/JAVA_LIBRARIES/filterfw_intermediates/classes.jar
注意在Order and Export中拉高新加入的这两个Library的顺序,要不然还是会因为某些方法或者属性缺失编译不过。
拉高之后的顺序如下图
aosp-app-eclipse-order-and-export
上图中的Hidden_API就是指的这两个jar包。
这样Camera这个App就应该可以在Eclipse当中编译通过了,当然这里说的只是编译apk,要真正运行可能还需要有so文件,也就是编译native code生成的,可以参考其他的说明,编译native code的方法这里不再赘述。

二、把自己的App加入到ROM build当中
ROM中自带的App都是放在/system/app/当中,so文件是放在/system/lib/当中,那么我们如何把自己的App也加入到系统中呢
很简单,两个步骤
1、把源码放到path/to/aosp/packages/apps当中
比如新加的一个App叫Camera2,即这个路径path/to/aosp/packages/apps/Camera2
2、在path/to/aosp/build/target/product/core.mk中增加自己的App
只需要加到PRODUCT_PACKAGES这个变量中就可以了(名字根据path/to/aosp/packages/apps/Camera2/Android.mk当中的LOCAL_PACKAGE_NAME来定)

完成了这两步之后,再编译整个ROM,就会发现你的App已经增加到系统当中了。

Building and Flashing ROM for PandaBoard ES

按照说明进行烧录自己build的ROM到板子上,具体build的方法参见
http://source.android.com/source/building-kernels.html
http://source.android.com/source/building.html
这个过程比较简单

接着参照
$ANDROID_GIT_HOME/device/ti/panda/README
连接好需要的线缆
RS232串口线不是必须的,但是有了它并通过putty之类的工具很容易的观察板子处于什么状态,如果你特别有经验可以不用这个,一般开始弄的话,有它比较方便
putty操作很简单,选中Serial并设置
line /dev/ttyUSB0/
speed 115200
就可以了

开始烧录的时候就会出现很多的问题了,首先PandaBoard是没有embedded的存储区来存放bootloader这些程序
所以需要把这些基础的程序烧到SD卡上

第一个要用到的工具就是usbboot,从usb载入bootloader,但是不幸的是aosp原生提供的usbboot是X64的,在32位的机器下无法使用

好在有omap4boot

git clone https://github.com/swetland/omap4boot/
cd omap4boot
export PATH=$(TOOL_CHAIN_HOME)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
把toolchain加入到当前PATH变量中开始build,但是可能会出现SIGNATURE VERIFICATION FAILED
这个时候就需要按照
https://github.com/swetland/omap4boot/issues/7
来解决这个问题

这样就可以让板子进入fastboot模式,详细可以参考
http://android-yfchung.blogspot.com/2011/11/android-40-ice-cream-sandwich-on.html

但是README当中有说到
hold GPIO_121 and press PWRON_RESET
就可以进入fastboot模式,但是我折腾了很久,表示很难进入,还期望哪位高人指点下。
我最终的办法是按照http://android-yfchung.blogspot.com/2011/11/android-40-ice-cream-sandwich-on.html当中说的usbboot就已经进入fastboot模式
也就可以不需要用GPIO_121 + PWRON_RESET

烧录整个ROM的时间会有点长,只要不出错就表示还在执行,所以还是要耐心等待等待。

UPDATE:
2012-09-06
增加文中所提到网页的本站备份文件供无法打开的同学使用
http://guoh.org/lifelog/wp-content/uploads/2012/09/Android-Developing-Note-Android-4_0-Ice-Cream-Sandwich-on-Pandaboard.zip

2013-07-03
PandaBoard按HW key进入bootloader
前提是必须放一张SD卡(fastboot oem format的或者是在PC上format成FAT或者EXT4都可以)到板子上,然后在板子通电的时候按GPIO_121,就像Eric说的那样,时机很重要,我实验的时候就像在通常PC上面进入BIOS一样,多按几次GPIO_121,应该就可以进入fastboot。
这样就应该可以不需要usbboot了。