在安卓源码环境下开发的时候,需要将安卓源码整个导入到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