导航:首页 > 编程语言 > androidjava源码

androidjava源码

发布时间:2022-10-02 08:58:13

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上这条新闻。

❷ 如何在Android源码里查找Java中native方法对应的C++实现

在Android源码里,有许多方法都是使用Jni机制调用底层的C++实现,比如大家都很熟悉的Binder.java里,就有

public static final native int getCallingPid();

public static final native int getCallingUid();

public static final native long clearCallingIdentity();

等方法都是直接调用C++里的实现。

通过下面命令可以很快找到对应的实现,

. build/envsetup

cgrep ./frameworks '"getCallingPid"'

这时会查找到如下结果:

./frameworks/base/core/jni/android_util_Binder.cpp:745: { "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid },

这样就可以知道对应的C++实现方法名字为android_os_Binder_getCallingPid, 在该文件中找这个方法的实现即可。

❸ ubuntu 编译android源码 java虚拟机吗

通过参考网上的相关资料,我编译Android源码的步骤如下:
1 我的系统是Ubuntu 8.04
2 系统上必须安装以下工具(摘自网上的资料):

sudo apt-get install build-essential
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install libc6-dev

sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install patch
sudo apt-get install texinfo
sudo apt-get install libncurses-dev

sudo apt-get install git-core gnupg //(gnupg系统可能已自带)
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
sudo apt-get install ncurses-dev
sudo apt-get install zlib1g-dev
sudo apt-get install valgrind(可选,有21M大,我觉得一般人是用不到的)
sudo apt-get install python2.5 (实际上不用装,Ubuntu 8.04 已经自带)
sudo apt-get install sun-java5-jdk

注意:
a. 不要用 sun-java6-jdk, 不然在make sdk, 具体来说是make doc这一步中, 遇到这个错误:
Docs droiddoc: out/target/common/docs/dx
javadoc: error - In doclet class DroidDoc, method start has thrown an
exception java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for
sun.util.resources.OpenListResourceBundle not found
b. 网上资料说需要设置环境变量, 但我并没有设置:
export ANDROID_JAVA_HOME=$JAVA_HOME

c. 网上并没有提及要安装ncurses-dev, 但安装之前我编译过程中会出现编译错误.

3 建立android源码的存放目录
$ mkdir ~/open_src
$ mkdir ~/open_src/android
$ cd ~/open_src/android
$ mkdir bi
4 下载repo脚本,放到~/open_src/android/bin目录下,加上可执行权
$ curl http://android.git.kernel.org/repo > repo
$ sudo mv repo ~/open_src/android/bin
$ sudo chmod a+x ~/open_src/android/bin/repo
5 在源码存放目录android中执行
$ ~/open_src/android/bin/repo init -u git://android.git.kernel.org/platform/manifest.git
//中间会提示输入电子邮件什么的,如果你打算要提交patch的话,用google accounts注册过的邮箱

6 在android目录中执行repo sync就可以开始下载源码了.
我们也可以从其他地方把源码复制到android目录, 而我正是这么做的.
7 编译源码, 并得到~/open_src/android/out 目录
在命令行执行make命令:
$make
这是一个很漫长的过程, 等吧......
8 测试运行
8.1 先设置环境变量:
打开~/.bashrc文件, 并在最后添加下面两行:
export PATH=$PATH:~/open_src/android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=~/open_src/android/out/target/proct/generic

8.2 运行模拟器:
emulator --debug-init -skin QVGA-L //可能会提示unknown option: --debug-init, 去掉--debug-init即可
或者直接执行emulator, 这样使用的是默认的皮肤

如果最后能进入到系统并看到一个大时钟, 说明就大功告成了.

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

❹ android源码放在什么目录下面

源码一般指Java文件,src文件下的.java就是,其他布局代码在res下的layout文件中

❺ android怎么修改源码

1、通过 ubuntu 软件中心安装 wine;
2、通过 ubuntu 软件中心安装 winetricks;
3、通过 winetricks 在 shell中输入: winetricks mfc42

1、通过 wine windows 的方式启动代理服务器
2、设置浏览器代理服务器
3、设置shell代理服务器:
在shell中输入 sudo gedit /etc/bash.bashrc
在文件 /etc/bash.bashrc 中添加

通过shell安装如下的组件:
1、sudo apt-get install bison g++-multilib git gperf libxml2-utils
2、新建一个存放源码的目录,如:mkdir ~/andorid/source
3、在源码目录中输入命令:repo init -u -b android-4.0.1_r1
其中: android-4.0.1_r1是android源码的版本,更多的版本可以通过下面的方式查询:

4、修改source/.repo/manifest/default.xml 文件中的 fetch 的值为:
git://Android.git.linaro.org/

通过如下的指令来设置邮箱和用户名
git config --global user.name "<your name>" ----修改用户名git config --global user.email "<your email>" ----修改email
5、在source目录下输入指令:repo sync
便开始了代码的下载
方便他人亦是方便自己,如果觉得还行就点下下边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!

❻ 如何阅读Android应用层源代码

当阅读Android原生的应用层源代码时,当遇到不理解的API时,如果仅凭将API函数放到google的官方API网页中去搜索的话,不一定合适,可以用eclipse先搜到该函数的定义处,看属于哪个类,然后再在google的官方API网页中搜该类,然后找到这个方法,如果该方法还是没在该类中,那么可以用eclipse找找该方法是不是继承与其子类,再从子类中搜搜。

构建开发环境
1、 构建Android编译环境:
Ubuntu11.10-64bit系统、一系列编译库、JDK、Android SDK、Eclipse +ADT。

2、 Android官方原生Android代码。

3、 源代码根目录下:

source build/envsetup.sh
lunch full-eng
make –j4
1、2、3相关内容在http://source.android.com/source/index.html都有相关说明。

4、 编译Android源码的同时,可以建立Android源代码Java工程
(1)将源码目录\development\ide\eclipse 中的.classpath复制到源码根目录下。
(2)更改eclipse缓存设置
在eclipse安装根目录下修改eclipse.ini
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
(3)将 源码目录\development\ide\eclipse 中的android-formatting.xml和android.importorder导入eclipse。
android-formatting.xml用来配置eclipse编辑器的代码风格;android.importorder用来配置eclipse的import的顺序和结构。

❼ 如何在Android源码中加入Java层系统服务

1. 在android/app/目录下创建接口文件IServiceTest.aidl
package android.app;
oneway interface IServiceTest
{
void show();
}
2. 在Android.mk文件中的变量LOCAL_SRC_FILES中加入core/java/android/app/IServiceTest.aidl
如果要在sdk中发布这个服务就在变量aidl_files中加入一样的路径。
3. 通过aidl编译器编译IServiceTest.aidl,会生成一个IServiceTest.java文件。
4. 创建服务类ServiceTestSerice
class ServiceTestSerice extends IServiceTest.Stub{
private static final String TAG = “ServiceTestSerice”;
Context mContext;
public ServiceTestSerice(Context context){
mContext = context;
}
public void show() throws RemoteException {
System.out.println(“My ServiceTestSerice”);
}
}
.5. 注册服务
Java系统服务在ServerThread类的run()方法中生成并注册到android平台,生成ServiceTestSerice实例对象,通过ServiceManager的addService方法将服务注册到系统中。
try{
serviceTestSerice = new ServiceTestSerice(context);
ServiceManager.addService(Context.SERVICE_TEST, serviceTestSerice);
} catch (Throwable t) {

}

ServiceTestSerice serviceTestSerice;
以上代码在ServerThread类的run()方法中。
在Context类中加入:
public static final StringSERVICE_TEST = “servicetest”
ServiceTestManager sServiceTestManager;
6. 使用系统服务
编写一个ServiceTestManager类,为包装类。
public class ServiceTestManager{
private final IServiceTest mService;

ServiceTestManager(IServiceTest service){
mService = service;
}

public void test(){
try{
mService. show()
} catch (RemoteException ex){

}
}
}
7 提供应用层开发接口
在ContextImpl类中的getSystemService()方法中加入如下代码:
else if (SERVICE_TEST.equals(name)){
return getServiceTestManager();
}
private ServiceTestManager getServiceTestManager(){
synchronized(sSync) {
if (sServiceTestManager == null){
IBinder b = ServiceManager.getService(SERVICE_TEST);
IServiceTest service = IServiceTest.Stub.asInterface(b);
sServiceTestManager = new ServiceTestManager(service);
}
}
调用过程如下:
ServiceTestManager manager= (ServiceTestManager) getSystemService(Context. SERVICE_TEST);
manager.show();
8. 测试
make
make update-api 更新current.xml文件
生成system.imz文件,放到<ANDROID_SDK>/platform/android-20/images/目录下,
adb shell
service list

❽ 如何在Android源码里查找Java中native方法对应的C++实现

知道方法名就知道C++里的函数名了,native方法的函数名是
Java_包名_类名_函数名
开头的,包名要把.换成_。比如com.xxx.yyy.ClassA.methodB在C++那边找Java_com_xxx_yyy_ClassA_methodB就行了

❾ 如何编译android手机源码

编译android系统源码准备工作:
下载android源码
在windows上用gitbash ,git clone 下载代码
在linux上这样下载
创建~/bin目录,用来存放repo程序,如下:

$ cd ~
$ mkdir bin
初始化repo
repo是android对git的一个封装,简化了一些git的操作。
创建工程目录:
$ mkdir android
$ cd android
下载repo脚本并使其可执行:
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此过程中需要输入名字和email地址。初始化成功后,会显示:
repo initialized in /android
在~/android下会有一个.repo的隐藏目录。
5)同步源代码
$ repo sync
这一步要很久很久。
安装linux系统,推荐ubuntu,图形界面
安装编译需要的支持包
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
安装java6.0
$ sudo apt-get install sun-java6-jdk
配置java环境
sudo gedit ~/.bashrc

末尾加上

JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
sudo source ~/.bashrc
是环境变量生效

编译android源码,并得到~/android/out目录

$ cd ~/andoird
$ make
这一过程很久。
这就编译结束了

❿ 如何在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

阅读全文

与androidjava源码相关的资料

热点内容
程序员东北大学 浏览:426
编译忽略空字符 浏览:117
多店铺阿里云服务器教程 浏览:378
单片机求初值 浏览:420
安卓机如何在电脑备份图片 浏览:925
ca证书加密机价格 浏览:798
天干地支年份算法 浏览:796
程序员打造的视频 浏览:7
java和php通信 浏览:680
为什么黑程序员 浏览:163
程序员男生 浏览:456
戴尔文件夹内文件怎么置顶 浏览:582
云服务器6m网速 浏览:722
vivo手机中国联通服务器地址 浏览:862
工程总控编译失败 浏览:707
燕赵红枫app如何下载 浏览:867
php查杀软件 浏览:878
教育管理学pdf 浏览:547
服务器均衡怎么使用 浏览:626
linux中jps 浏览:954