当前位置: 移动互联网学院 > Android开发 > 如何在Android源码上编译系统应用
如何在Android源码上编译系统应用 时间:2017-07-12     来源:移动互联网学院

Android系统应用和普通的Android应用基本相同,都是主要用Java语言编写的APK程序。不过前者与后者有如下两点不同。

1. 签名不同。Android系统应用使用的是系统签名,或称为平台签名,而普通的Android应用使用的是一般的签名。

2. 可以访问的API不同,在AndroidSDK 中有很多API(类、接口、方法等)都声明为hide。

3. 这类API不允许在普通的Android应用中访问,而只是经过platform签名的Android系统应用才能使用这些API。

除了以上两点,Android系统应用和普通应用的创建过程基本相同,只是由于Android系统应用可能访问系统级的API(hide API),而ADT是不会识别这些API的,所以在ADT+Ecplise开发环境导入Android系统应用的源代码后会发现这些API的地方的都用红色波浪线标注了,不过这不要紧,反正也不在IDE中编译和运行Android系统应用。

在了解了Android系统应用和普通的Android应用的区别后,面临的写一个问题就是如何编译和运行Android系统应用呢?

Android系统应用完全可以向普通的Android应用一样在Ecplise中编辑,IDE的基本特性仍然会保留,但由于使用了系统API,所以是不能直接编译的。要想编译Android系统应用必须要依靠Android源代码(好是已经进行一遍完整编译的Android源代码)才可以。通常会将Android系统应用的源代码放到<Android 源代码根目录>/package/apps 目录或其子目录中。编译Android系统应用需要在程序的根目录建立一个Android.mk文件,该文件是Android源代码专用的编译文件,相当于GCC的Makefile文件。至于该文件的内容,通常并不需要有更深入的了解,只需要在apps中找一个Android系统应用,如PackageInstaller,将该程序中Android.mk文件复制一份,然后进行适当修改即可。

在Android源代码中有一个package目录,所有的android系统应用的源代码都在这个目录中,其中package/app是核心的目录,所有的Android系统应用的源代码都在这个目录中。其中psackages/app是核心的目录,所有内嵌的APK程序都在该目录中,如果要加入自己的Android系统应用,也需要将APK文件放到这个目录中,如果想了解Android系统有哪些窗口(Acitivity)可用,app目录中包含的源代码将告诉我们一切。

除了app目录外,其他一些目录,例如,providers,也非常重要,尤其是providers目录,会告诉我们整个Android系统有哪些Content Provider可共调用,并且会得知详细的使用方法。当然,我们还可以从Android系统应用的源代码中得到更多的信息。例如,开发过桌面小部件的读者都知道,桌面小部件不支持将EditText控件放到桌面上,那么Android桌面的部件是如何做的呢?

不过研究Android系统应用源代码还有个更重要的目的,就是定制ROM。像现在很多流行的ROM,如HTC的sense UI、小米的仿iPhone的UI,以及老罗模仿与创新并存的锤子ROM,都需要对Android系统应用的源代码相当了解实现(当然还要有很多的UI设计师才行)。

所以研究Android系统应用的源代码好处多多,综合起来读者至少从以下几个方面可以获益。

1. 了解Android系统中有哪些窗口、Content Provider、Service 和Broadcast可以与之交互。

2. 充分掌握很多高级应用的使用方法,例如,OTA升级是如何实现的。

3. 对实现原理比较感兴趣的读者可以通过这些源代码了解像Launcher2、短信管理等应用的内容构造。

4. 对于像编写可以完成系统级操作的应用的读者,可以学会如何将Android应用嵌入到ROM,升级为Android系统应用,进而可以做任何自己想做的事。

5. 对于那些有即可情结的读者,完全定制自己的ROM是令人振奋的梦想,而Android系统应用将是实现这一梦想重要的基石。