android编译内置应用以及调用隐藏API(@hide)

来源:互联网 发布:淘宝的发展历程概述 编辑:程序博客网 时间:2024/05/21 14:06

Android系统内置有:Browser(浏览器)、Mms(彩信/短信)、Phone(电话)、Contacts(联系人)等众多的核心应用。

然而,在SDK开发环境(即Eclipse + ADT) 下, 这些应用却无法被正确编译,究其原因 至少有以下几种情况:

1、它们使用到了未包括在SDK中(公开发布)的API,有两种情况:

A、被 @hide 标注了的类:这 些类是被隐藏起来的,这些类大多都在com.android.internal包下面;

B 、一些未包括在SDK中的、Google私有的Api,它们大多都在com.google.android包下面;例如:

2、它们使用了一些由framework层声明的aidl接口访问系统服务,然而这些aidl在编译时才会转换成.java源码,因此在SDK环境下编译这些应用时无法访问到它们。

 

解决方法是:

(请注意:out目录 是在完整源码编译环境下(Linux下),执行一次完整编译后的输出目录)

1、找到那些被隐藏起来的类、它们在以下两个位置:

A、out\target\common\obj\JAVA_LIBRARIES\framework_intermediates/ classes.jar

B、out\target\common\obj\JAVA_LIBRARIES\android-common_intermediates\ classes.jar

将找到的.jar文件,在Eclipse中作为User Library 添加到 Project 的Librarys依赖中,并将该库的顺序置于Android SDK Library之上。 

      不过在现在的android版本都未发现android-common_intermediates\ classes.jar 这个东西,不过没关系,可能是集成到framework_intermediates/ classes.jar 里面了。

 

在 out\target\common\obj\JAVA_LIBRARIES\ 目录下,还有很多其它具体应用相关的jar包,.... ;

2、找到那些缺失的、编译时才生成的,.java源文件,它们通常在以下位置:

A、 out\target\common\obj\JAVA_LIBRARIES\XXX _intermediates\src 目录下,XXX是相关模块的名称;

B、out\target\common\obj\APPS\ XXX _intermediates\src 目录下;

将找到的src目录,在Eclipse下,以Link Source的方式,连接到Project 中作为源码的一部分。

 

简单来说,也就是只要以自定义库的方式导入framework_intermediates/ classes.jar ,out\target\common\obj\JAVA_LIBRARIES\XXX _intermediates下的jar包和out\target\common\obj\APPS\ XXX _intermediates下的jar包eclipse就不会报错,其他小错误结合代码简单处理一下就行了。

单独编译单个项目:

先在android目录下执行

$ . build/envsetup.sh

然后你就会多出几个可用的命令。

例如,我们在改了Contacts联系人项目后,可以简单的执行一下命令来单独编译这个部分:
  $mmm packages/apps/Contacts/
为了可以直接测试改动,需要生成新的system.img,在android目录下执行:
    $ make snod
当然,如果你改动的是emulator或者其它外围相关的,而非系统内部的东西,就不只是要重新生成system.img了

0 0
原创粉丝点击