在安卓源码环境下开发的时候,需要将安卓源码整个导入到eclipse中,下面给出导入方法和导入后源码报错的排除方法

导入源码

复制.classpath文件到源码根目录1

2$ cd AndroidSource

$ cp development/ide/eclipse/.classpath ./

使用统一的代码格式化风格

在eclipse中点击Window - Preferences - Java - Code Style - Formatter选择development/ide/eclipse/android-formatting.xml

使用源码提供的导入顺序和结构

在eclipse中点击Window - Preferences - Java - Code Style - Organize Imports选择development/ide/eclipse/android-importorder

导入源码新建Java Project(不是Android project)

选择从已存在的工程导入,选择安卓源码所在目录,填写项目名称,例如Android、cm11等

点击finish,等待导入完成

排除源码中的报错

编译源码

要排除源码内的报错,首先是必须完整的编译一次源码。

1

2

3$ source build/envsetup.sh

$ lunch full-eng

$ make -jN #N为编译线程数

编译完成后刷新项目,某些报错已经没有了。

import语句报错

import语句报错,某个类找不到。

情形一

如果该类包含在一个static_java_lib(可以通过Android.mk)来确定。

例如spongycastle-light-jdk15on这就是一个静态java库,源码编译完成后会生成jar文件,那么只需要在.classpath中加入该jar即可。

1

情形二

如果该类库并未被编译成一个jar,而是以源码形式存在于android项目中。

例如volley,这时需要将该类库的src目录加入到.classpath中

1

这里确认src的位置很重要,并不是目录名是src就加这个目录,关键是看包名。先查看eclipse中import的类的包名。

包名的第一段是类库所在文件夹的根目录名,例如com.xxx.xxx,那么src目录应该是com这个目录的父目录。

通常是src命名的,也有的是src/main/java这种的形式,根据包名来判断应该怎么添加。

情形三

R.java找不到

这种情况一般是没有完整编译过安卓源码,完整编译一次即可。参见编译源码

package语句报错

这种情况比较特殊了,通常情况下,java的类的包名是对应着文件夹的结构的。

例如类Test1.java,在src/com/my/test目录下,那么其包名就应该是com.my.test。

Test.java中的第一行有效代码就是申明包名,应该是这样的:

1package com.fiui.test;

如果这一行报错让你移到别的包或者改包名,那么通常是因为某些项目没有遵守上述的规范导致的,eclipse必须按照目录结构来指定包名。而在android源码编译中用的是Gradle编译器,并不强制遵守上述规范,只是作为习惯,大部分都遵守了这种规范。

在Gradle中,允许一种情况,如下:

在src/com/my/packagetest目录下,有一个类Test2.java,

正常情况下,Test2.java第一行是这样的:

1package com.fiui.packagetest;

但Gradle中可以不是这样的,例如:

1package com.fiui.test;

这样就导致了eclipse不认识包名,但gradle却依然编译正常。

需要说明的是,编译成jar或者dex之后,gradle里这种特殊的写法会按照标准重新生成目录结构。

gradle编译之后,会把src/com/fiui/packagetest/Test2.java编译到包com.fiui.test下。

可以反编译来验证一下。

这时候,要去除eclipse报错,只能把这些类复制到其正确的包名的目录下,删除原错误包对应的目录。但这样一来会改变源码的目录结构,如果你从自己的git服务器上获取源码,那么推荐你修改一下,一劳永逸。如果你没有自己的git服务器,建议不要修改。

import aidl报错

该情况出现在某些某些aidl中。

不能直接import一个aidl,而是import一个aidl编译出来的java文件。

例如源码中的:

1packages/apps/Calendar/src/com/android/lunar/ILunarService.aidl

这时候在eclispe中

1import com.android.lunar.ILunarService;

就会提示一个错误,ILunarService类不存在。

解决该错误需要事先完整编译过安卓源码,然后在out/target/common/obj/下找到该aidl生成的java文件然后导入eclipse即可。

例如这里的ILunarService.aidl最终在

1out/target/common/obj/APPS/Calendar_intermediates/src/src

目录中被发现。通常该目录下还有一个扩展名为.p的文件。

并且通常目录路径的最后是src/src

那么在.classpath中加入

1

对于APK,通常在

1out/target/common/obj/APPS/[module_name]__intermediates/src/src

对于JAR,通常在

1out/target/common/obj/JAVA_LIBRARIES/[module_name]__intermediates/src/src