如何在Eclipse中浏览Android源码
Google的Android SDK包括了android.jar,这个Jar文件包含了Android公有API类文件。他们还提供了一个Eclipse插件,这使得开始Android上的开发相当简单。然而,你却不能找到androidSrc.jar这个Jar文件,所以当你想要在Eclipse中看一下Android SDK源代码的时候,你会碰到如图所示的情况:
开源来解救我们了!
这个月早些时候,Google开放了Android的全部源码,顺便说一下,这相当大!不管怎样,为了在Eclipse中浏览源码,你需要访问http://source.android.com/,并且按照他们的说明用Git把每一样东西都拖下来。绝对值得拿出一个晚上做这件事,因为有完整的源码使得理解SDK的工作机制变得更容易了。
(把源码)附加到Eclipse上……兄弟,没有想象中那么快
既然你有了源代码,你可以告诉Eclipse它的位置在哪。我尝试过在android.jar上右击然后选择【属性】,但是欢迎我的是下面的截图:
嗯哈……“当前的类路径入口点属于Android Library这个容器,它不允许用户在它的入口点修改源附件。”这真是让我陷入死循环了,因为我通常使用IDEA,所以我真的被这个难住了。因此,我深入研究了源代码,想要找出一个解决方案。
测试源码
当你下载了Android源码,你就得到了一切,其中包括操作系统、Dalvik虚拟机、Eclipse插件、公有SDK等。
在com.android.ide.eclipse.adt.project.internal包中,我找到了一个叫AndroidClassspathContainerInitializer.java的类。它有如下的代码:
IPath android_src = new Path(AdtPlugin.getOsAbsoluteAndroidSources());
好的,很好。接着,再进AdtPlugin.java看一下:
/** Returns the absolute android sources path in the sdk */ public
static String getOsAbsoluteAndroidSources() { return
getOsSdkFolder() + getOsRelativeAndroidSources(); }
/** Returns
the android sources path relative to the sdk folder */ public static String
getOsRelativeAndroidSources() { return
AndroidConstants.FD_ANDROID_SOURCES; }
最后再进AndroidConstants.java看一下:
public static final String FD_ANDROID_SOURCES = "sources";
我成功啦!
方案一
基于以上的分析,你需要在你的Android SDK 安装目录中新建一个名为“sources”的目录。
既然你有了这个目录,你可以在你从Git下载下来的Android源代码中找到这个恰当的源码目录。Google的测试指导建议这个目录命名为“mydroid”,所以这边我也用这个名称。公有SDK源码可以在这里找到:mydroid/frameworks/base/core/java。在那个文件夹下,你可以找到一个Android目录,它应该被拷贝到你的Android SDK 安装目录下的源码目录。
你将会不得不在周遭做一些寻找来找到所有的源码,它散置于mydroid目录树的各个地方。最后,你应该可以得到这样一个目录结构:
SDK_PATH
| android.jar
+--docs/...
+--samples/...
+--sources
+--android
| ...accounts, annotation, app, bluetooth, etc...
+--com/android/etc...
+--dalvik/...
+--java/...
+--javax/...
我抓取了所有的目录,但是我没有做很好的记录,所以我可能并且不注意地增加了太多。你可能仅仅需要公有SDK源码,但是我认为学习一下类实现也是很棒的。
现在当我在Android SDK类中浏览时,我看到了源码:
方案二
如果你不愿意拷贝(或者链接)所有需要的源码目录到你的SDK目录,你也可以创建一个Eclipse用户库。首先,我试图创建我自己的包含android.jar的用户库,但是Eclipse抱怨说那会成为一个重复的Jar文件。所以,我挑选了任意一个Jar文件作为我的用户库,然后开始附加所有的Android源目录到那个库文件。
我的用户库似乎可以起作用,但是我更喜欢复制源目录的方式,这样无需在每次新建工程的时候记得增加用户库。