通过参考网上的相关资料,我编译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中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
⑶ 如何调试跟踪Android Framework源代码
本文讲解如何在Eclipse中导入Android源代码(包括Framework和Application的代码),然后通过模拟器或真机跟踪/调试Android的Java代码,区别于一般基于Android SDK的纯应用开发,这里可以跟踪/调试Framework中的代码。
一、准备工作
确保机器上已经安装并配置下列软件环境:JDK/ Eclipse / Android SDK / ADT
即,机器上已经安装了Eclipse下Android应用开发所需的环境。如果还未配置,移步《搭建Windows下Android应用开发环境——Eclipse/Android/ADT》。
另外,为了跟踪调试Android源码,你还需要有Android源码,并有源码的编译环境,可以是:
虚拟机环境 虚拟机中安装Linux,Linux下编译Android源码。此环境下,如果要在宿主机的Eclipse中调试,还需要把Android的源码路径共享出来,宿主机可访问到;
有单独的可编译Android的网络环境 在你的客户端的机器上访问服务器共享出来的Android的源码路径;
Linux环境下直接通过Eclipse跟踪调试本机上的Android源码。
注意:不管哪种工作方式,Android源码要都是已经编译过的,且编译时采用的是Eng模式(vs User mode)。编译Android Platform和Kernel的过程,可参考《Ubuntu10.10下编译Android2.2平台》及《Ubuntu10.10下编译Android2.2内核》。
二、基本设置
准备工作完毕之后,现在做一些基本的设置。
1. 把Android源码路径<Android_ROOT>下的developmentideeclipse中的.classpath文件复制到<Android_ROOT>下;如果需要在模拟器中进行调试的话,需要复制三个img(具体方法见http://wenku..com/view/26d9063c87c24028915fc366.html)
2. 修改Eclipse的设置
修改eclipse.ini文件,更改下列内容:
[plain]view plain
-Xms40m
-Xmx384m
改为:
[java]view plain
-Xms128m
-Xmx512m
这里增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。
三、Eclipse中创建工程
1. File > New > Java Project
⑷ 如何在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怎么修改源码
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源码开发记录-自定义系统服务和jar包生成
创建文件 IMyApiService
文件路径 frameworks/base/core/java/android/os/
定义了一个计算和的方法。
在frameworks/base/Android.mk
LOCAL_SRC_FILES最后加入
创建文件 MyApiService.java
文件路径 frameworks/base/core/java/com/android/server/
实现aidl的接口,计算参数和。
(1)Context添加服务名
文件路径 frameworks/base/core/java/android/content/Context.java
添加
(2)添加启动服务
文件路径 frameworks/base/services/java/com/android/server/SystemServer.java
在startOtherServices方法中添加
创建 MyApiManager.java文件
文件路径 frameworks/base/core/java/android/app/
文件路径 frameworks/base/core/java/android/app/ContextImpl
添加registerService
记住make update-api
编译打包完成后,烧写新的固件。
jar主要为了在android studio编译环境中MyApiManager报错导致编译不通过问题。
也可以导入frameworks jar包或使用反射。
在源码目录packages/app下新建MyJar文件夹
并新建目录com/myapi/(包名)
在目录com/myapi/新建文件MyApi.java
具体Android.mk语法这里不做解释,可以自行查阅
在MyApi目录下直接运行mm编译命令(记得先source build/envsetup.sh)
待编译完成后,jar生成目录
out/target/common/obj/JAVA_LIBRARIES/Myapi_intermediates/javalib.jar
可更改为其他名称。
⑻ 怎么用android 5.0.2源码
以前写的程序都主要是针对android2.3和android4.x平台的,最近想从源码的角度看一下5.0都增添了哪些新的特性,那么必须要有源码了。怎么下载源码,谷歌官方给出了详细的介绍 。想搞懂源码的话不推荐windows操作系统,这里推荐一款集成android开发以及各种反编译工具的linux操作系统-Santoku.各种IDE, 环境等都随系统配置好了,开发人员只需要关注自己想做的事情就行了。为了看最新的android源码:
1.更新java到java 7:
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
2.设置默认的java版本(系统中可能有多个版本的jdk):
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
3.针对santoku或者Ubuntu 12.04的系统,需要安装以下的package(其他版本系统详情见http://source.android.com/source/initializing.html):
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
4.安装repo
4.1新建保存repo文件的目录
$ mkdir ~/bin
$ PATH=~/bin:$PATH
4.2下载repo文件,并添加可执行权限
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
5.初始化repo
5.1新建repo工作目录
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
5.2初始化工作目录,下载最新的android-5.0.2_r1分支
repo init -u https://android.googlesource.com/platform/manifest -b android-5.0.2_r1
5.3开始下载源码(需要git config 用户名和email地址,填写自己常用的即可)
$ repo sync
⑼ 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 APP源代码
将apk文件拷贝至sdcard上。
命令顺序如下:
进入Android sdk文件夹/tools目录下
输入adb shell
输入su
输入cd data
输入cd app
这时就可以看到你安装的所有的apk文件。输入cp 空格 对应的apk 空格 /sdcard/
这样就将apk文件拷贝出来了。
将apk文件后缀直接变成rar格式,可以看到熟悉的目录结构了,
其中xml文件打开后都是二进制的,无法查看。
这时就用到了一个android4me的AXMLPrinter2工具。(请自行网络搜索)
输入以下命令,将xml文件解析出来
java -jar AXMLPrinter2.jar showtimes_list.xml
此命令是在命令行中查看此showtimes_list.xml
将showtimes_list.xml生成xml文件,则输入以下命令:
java -jar AXMLPrinter2.jar showtimes_list.xml > h.xml
目前进行到这一步,只能看到xml文件的内容,其工程中的java源文件还是看不到,看目录结构下有一个classes.dex文件,我们需要将dex文件变为jar文件。
这里用到了另一个工具dex2jar。(自行搜索下载)
在Windows下解压之后的目录如下图所示:
在命令行中,进入到此目录下:
在Windows下,输入以下命令:
dex2jar.bat c:classes.dex
运行完之后,在C盘会多一个classes.dex.dex2jar.jar文件,此文件就是我们需要的jar文件。
利用jd-gui,将jar文件反向工程为java代码。(请自行搜索下载)
它分为Windows、Linux、和max三个版本,这里我下载的是Windows版本的。
解压之后,双击运行exe文件,选择classes.dex.dex2jar.jar文件,相应的jar文件中的Java文件就被反向工程显示出来了!