用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已经增加到系统当中了。

Leave a Reply

Your email address will not be published. Required fields are marked *