javaandroid源码
‘壹’ android sdk下的java源码与JDK的Java源码的区别在哪
Android 使用的Java 库是Apache的Harmony, 与官方Java库接口相同,里面实现不一样。
就在06年的时候Sun公司宣布会将JDK开源,但是直到2009年4月才正式发布,而Android已经在2008年发布第一步部智能手机了。所以Google最早的时候使用了当时Apache的Java开源实现Harmony项目。
说
到这个Harmony可是大有来头,2005年的时候Java并不是开源的,当是Apache搞了一个提案,就是Harmony项目,目标是开发出一个独
立并且与现有 JDK 兼容的 Java SE 实现,它是开源的并且Apache授权对开发者友好,于是得到了飞速发展。
可惜Sun公司一直不承认Harmony,前不久Harmony那一帮人怒了,给Oracle放狠话说再不承认我我就抵制Java7,结果反倒把Google吓坏了,于是就出现了google宣布切换到openjdk上这条新闻。
‘贰’ 怎么在eclipse中查看android源码
在eclipse中查看android源代码的两种方法
方法一:
一名Java开发工程师经常会查看库的源代码,因为我们用ADT发现android库没有自带source code,我就创建一个user library来解决这个问题的。
1、首先你需要下载android源代码,用git,详见android开发官方网站。
然后找到源码目录下的\frameworks\base\core\java,把android压缩成android.zip把下面这些文件夹拖入到里面(结构android.zip\)\frameworks\base\graphics\java\android\
\frameworks\base\location\java\android\
\frameworks\base\media\java\android\
\frameworks\base\opengl\java\android\
\frameworks\base\sax\java\android\
\frameworks\base\telephony\java\android\
\frameworks\base\services\java\com\android\\frameworks\base\vpn\java\android\
\frameworks\base\wifi\java\android\
2、在你的android工程上,右键->属性,找到Java Build Path3、Add Library->User Library->Next->User Libraries->New4、输入Library的名称,比如android_src2.0
5、Add JARs->选择刚刚创建的android.zip
这样你就把android源码添加上了。
方法二:
上面的方法我试了一下1.6的就是不行,只有2.0的才行,所以用网上搜索到的一种方法,添加1.6SDK的源代码。
from __future__ import with_statement# for Python < 2.6import os
import re
import zipfile
# open a zip file
DST_FILE = 'sources.zip'
if os.path.exists(DST_FILE):
print DST_FILE, "already exists"
exit(1)
zip = zipfile.ZipFile(DST_FILE, 'w', zipfile.ZIP_DEFLATED)# some files are plicated, them only oncewritten = {}
# iterate over all Java files
for dir, subdirs, files in os.walk('.'):
for file in files:
if file.endswith('.java'):
# search package name
path = os.path.join(dir, file)
with open(path) as f:
for line in f:
match = re.match(r'\s*package\s+([a-zA-Z0-9\._]+);', line)if match:
# source into the zip file using the package as pathzippath = match.group(1).replace('.', '/') + '/' + fileif zippath not in written:
written[zippath] = 1
zip.write(path, zippath)
break;
zip.close()
把这些代码拷贝一下,新建一个叫 makesrc.py的文件,放到< 源码位置>/frameworks/base下面,然后执行makesrc.py,完毕之后会有sources.zip然后在platforms\android-1.6\sources 下面解压到这个目录具体目录格式是\platforms\android-2.1\sources\
android
com
java
javax
junit
mock_android
org
‘叁’ android源码包在哪个文件夹
android源码主要位于两个文件夹中。橡洞src文件咐如哪夹,存放java代码。res文件夹存放资源,如res->layout存放布局文件;res->drawable存放图片文件等。android代衡码码主要就存在于这两个文件夹下
‘肆’ 如何在Android源码里查找Java中native方法对应的C++实现
android源码只包含android app java的客户端代码。
native部分可能有可能没有,先全局搜索.c或者.cpp文件,有这些文件才可能有。
如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的C++代码。
Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码:
static native Thread currentThread();
如何根据方法名找到其对应的C++实现,有两个方法。
先来个java代码的示例VMThread.java:
package java.lang;
class VMThread {
Thread thread;
int vmData;
VMThread(Thread t) {
thread = t;
}
native static void create(Thread t, long stackSize);
static native Thread currentThread();
static native boolean interrupted();
static native void sleep (long msec, int nsec) throws InterruptedException;
static native void yield();
native void interrupt();
native boolean isInterrupted();
......
}
我们要查找currentThread方法的实现。
方法一:
由于Android源码中对每个native实现都会写一个java方法名和C++方法名映射的列表,所以我们直接搜索这个列表内容即可。
zkw@zkw $ grep -rns '"currentThread"' ./*
./art/compiler/dex/quick/dex_file_method_inliner.cc:108: "currentThread", // kNameCacheCurrentThread
匹配到二进制文件 ./dalvik/vm/native/.java_lang_VMThread.cpp.swp
./dalvik/vm/native/java_lang_VMThread.cpp:241: { "currentThread", "()Ljava/lang/Thread;",
./external/android-mock/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread");
./external/android-mock/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:407: Method method = Thread.class.getMethod("currentThread");
可以看到,在文件./dalvik/vm/native/java_lang_VMThread.cpp中找到currentThread方法相关的信息,后面()Ljava/lang/Thread代表这个方法的返回值。
进入java_lang_VMThread.cpp这个文件可以看到:
17 /*
18 * java.lang.VMThread
19 */
20 #include "Dalvik.h"
21 #include "native/InternalNativePriv.h"
22
23
24 /*
25 * static void create(Thread t, long stacksize)
26 *
27 * This is eventually called as a result of Thread.start().
28 *
29 * Throws an exception on failure.
30 */
31 static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)
32 {
33 Object* threadObj = (Object*) args[0];
34 s8 stackSize = GET_ARG_LONG(args, 1);
35
36 /* ing collector will pin threadObj for us since it was an argument */
37 dvmCreateInterpThread(threadObj, (int) stackSize);
38 RETURN_VOID();
39 }
40
41 /*
42 * static Thread currentThread()
43 */
44 static void Dalvik_java_lang_VMThread_currentThread(const u4* args,
45 JValue* pResult)
46 {
47 UNUSED_PARAMETER(args);
48
49 RETURN_PTR(dvmThreadSelf()->threadObj);
50 }
51
......
237
238 const DalvikNativeMethod dvm_java_lang_VMThread[] = {
239 { "create", "(Ljava/lang/Thread;J)V",
240 Dalvik_java_lang_VMThread_create },
241 { "currentThread", "()Ljava/lang/Thread;",
242 Dalvik_java_lang_VMThread_currentThread },
243 { "getStatus", "()I",
244 Dalvik_java_lang_VMThread_getStatus },
245 { "holdsLock", "(Ljava/lang/Object;)Z",
246 Dalvik_java_lang_VMThread_holdsLock },
247 { "interrupt", "()V",
248 Dalvik_java_lang_VMThread_interrupt },
249 { "interrupted", "()Z",
250 Dalvik_java_lang_VMThread_interrupted },
251 { "isInterrupted", "()Z",
252 Dalvik_java_lang_VMThread_isInterrupted },
253 { "nameChanged", "(Ljava/lang/String;)V",
254 Dalvik_java_lang_VMThread_nameChanged },
255 { "setPriority", "(I)V",
256 Dalvik_java_lang_VMThread_setPriority },
257 { "sleep", "(JI)V",
258 Dalvik_java_lang_VMThread_sleep },
259 { "yield", "()V",
260 Dalvik_java_lang_VMThread_yield },
261 { NULL, NULL, NULL },
262 };
源码中第242行找到对应的名字,用红色标出,其实现就在第44行。
这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。
方法二:
还是找VMThread.java的currentThread函数,找多了会发现,C++的名字一般都是包名+类名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。
如何在Android源码里查找Java中native方法对应的C++参考:http://e.51cto.com/course/course_id-4377.html
‘伍’ EclipseADT怎么关联android的源码
在eclipse里直接看它的源,大概需要经由下面的几个步骤:
1.下载源码
这部分网上有大量的资料,这是我参考的文章:《Windows平台下Android源码的下载》
2.在eclipse中关联源码
常用eclipse的人对在eclipse中关联源码的操作应该也都很熟悉。
1、找到项目中的android.jar,右键→properties
‘陆’ eclipse怎么查看android源码
1、eclipse安装了ADT插件后可以进行Android开发(目前已经不推荐使用eclipse开发,官方建议使用Android studio)
2、eclipse中Android项目的结构如下
3、源代码查看,进入src--com.example(以实际包名为准)查看java源代码
在res--layout下查看xml布局文件