如何阅读android 阅读器源码framework源码

android源码如何查看
&来源:读书人网&【读书人网():综合教育门户网站】
android源码怎么查看?最近刚接触android,老大给了一个公司项目的源码给我,教我先看看,可不知道从哪看起呀
android源码怎么查看?最近刚接触android,老大给了一个公司项目的源码给我,教我先看看,可不知道从哪看起呀&,
谁给个地址&?&&,其实我的初衷是想直接在eclipse中查看最好1eclipse中也可以看的,你新建一个java工程,然后import源码就行报错没关系,又不是编译,导进去后java源码都可以看了[解决办法]引用:Quote: 引用:Quote: 引用:Quote: 引用:如果你是搞底层和c接触比较多的话,就用source&insigt&如果是java的话就用eclipse,我自己也是用eclipse看的,只要去修改.classpath文件就可以了classpath是环境变量里的那个吗?去development/ide/eclipse/&里面拷贝一个来修改找了找没发现development/这文件夹-&-&请参考,根据实际情况修改&classpath&&classpathentry&kind="src"&path="packages/apps/Bluetooth/src"/&&classpathentry&kind="src"&path="packages/apps/Camera/src"/&&classpathentry&kind="src"&path="packages/apps/Browser/src"/&&classpathentry&kind="src"&path="packages/apps/Calendar/src"/&&classpathentry&kind="src"&path="packages/apps/Calendar/extensions_src"/&&classpathentry&kind="src"&path="packages/apps/Calculator/src"/&&classpathentry&kind="src"&path="packages/apps/CertInstaller/src"/&&classpathentry&kind="src"&path="packages/apps/Contacts/src"/&&classpathentry&kind="src"&path="packages/apps/DeskClock/src"/&&classpathentry&kind="src"&path="packages/apps/Email/src"/&&classpathentry&kind="src"&path="packages/apps/Email/emailcommon/src"/&&classpathentry&kind="src"&path="packages/apps/Gallery2/src"/&&classpathentry&kind="src"&path="packages/apps/Gallery2/src_pd"/&&classpathentry&kind="src"&path="packages/apps/Gallery2/gallerycommon/src"/&&classpathentry&kind="src"&path="packages/apps/HTMLViewer/src"/&&classpathentry&kind="src"&path="packages/apps/Launcher2/src"/&&classpathentry&kind="src"&path="packages/apps/Mms/src"/&&classpathentry&kind="src"&path="packages/apps/Nfc/src"/&&classpathentry&kind="src"&path="packages/apps/Nfc/nci/src"/&&classpathentry&kind="src"&path="packages/apps/PackageInstaller/src"/&&classpathentry&kind="src"&path="packages/apps/Phone/src"/&&classpathentry&kind="src"&path="packages/apps/QuickSearchBox/src"/&&classpathentry&kind="src"&path="packages/apps/Provision/src"/&&classpathentry&kind="src"&path="packages/apps/Settings/src"/&&classpathentry&kind="src"&path="packages/apps/SoundRecorder/src"/&&classpathentry&kind="src"&path="packages/apps/Stk/src"/&&classpathentry&kind="src"&path="packages/apps/VoiceDialer/src"/&&classpathentry&kind="src"&path="packages/providers/CalendarProvider/src"/&&classpathentry&kind="src"&path="packages/providers/ContactsProvider/src"/&&classpathentry&kind="src"&path="packages/providers/DownloadProvider/src"/&&classpathentry&kind="src"&path="packages/providers/DrmProvider/src"/&&classpathentry&kind="src"&path="packages/providers/MediaProvider/src"/&&classpathentry&kind="src"&path="packages/providers/TelephonyProvider/src"/&&classpathentry&kind="src"&path="packages/screensavers/Basic/src"/&&classpathentry&kind="src"&path="packages/screensavers/PhotoTable/src"/&&classpathentry&kind="src"&path="packages/screensavers/WebView/src"/&&classpathentry&kind="src"&path="frameworks/base/cmds/am/src"/&
&classpathentry&kind="src"&path="frameworks/base/cmds/input/src"/&&classpathentry&kind="src"&path="frameworks/base/cmds/pm/src"/&&classpathentry&kind="src"&path="frameworks/base/cmds/svc/src"/&&classpathentry&kind="src"&path="frameworks/base/core/java"/&&classpathentry&kind="src"&path="frameworks/base/drm/java"/&&classpathentry&kind="src"&path="frameworks/base/graphics/java"/&&classpathentry&kind="src"&path="frameworks/base/icu4j/java"/&&classpathentry&kind="src"&path="frameworks/base/keystore/java"/&&classpathentry&kind="src"&path="frameworks/base/location/java"/&&classpathentry&kind="src"&path="frameworks/base/location/lib/java"/&&classpathentry&kind="src"&path="frameworks/base/media/java"/&&classpathentry&kind="src"&path="frameworks/base/media/mca/effect/java"/&&classpathentry&kind="src"&path="frameworks/base/media/mca/filterfw/java"/&&classpathentry&kind="src"&path="frameworks/base/media/mca/filterpacks/java"/&&classpathentry&kind="src"&path="frameworks/base/nfc-extras/java"/&&classpathentry&kind="src"&path="frameworks/base/obex"/&&classpathentry&kind="src"&path="frameworks/base/opengl/java"/&&classpathentry&kind="src"&path="frameworks/base/packages/FusedLocation/src"/&&classpathentry&kind="src"&path="frameworks/base/packages/SettingsProvider/src"/&&classpathentry&kind="src"&path="frameworks/base/packages/SystemUI/src"/&&classpathentry&kind="src"&path="frameworks/base/policy/src"/&&classpathentry&kind="src"&path="frameworks/base/sax/java"/&&classpathentry&kind="src"&path="frameworks/base/services/java"/&&classpathentry&kind="src"&path="frameworks/base/telephony/java"/&&classpathentry&kind="src"&path="frameworks/base/test-runner/src"/&&classpathentry&kind="src"&path="frameworks/base/voip/java"/&&classpathentry&kind="src"&path="frameworks/base/wifi/java"/&&classpathentry&kind="src"&path="frameworks/ex/carousel/java"/&&classpathentry&kind="src"&path="frameworks/ex/chips/src"/&&classpathentry&kind="src"&path="frameworks/ex/common/java"/&&classpathentry&kind="src"&path="frameworks/ex/photoviewer/src"/&&classpathentry&kind="src"&path="frameworks/ex/variablespeed/src"/&&classpathentry&kind="src"&path="frameworks/opt/calendar/src"/&&classpathentry&kind="src"&path="frameworks/opt/telephony/src/java"/&&classpathentry&kind="src"&path="frameworks/opt/mms/src/java"/&&classpathentry&kind="src"&path="frameworks/opt/vcard/java"/&&classpathentry&kind="src"&path="frameworks/support/v4"/&&classpathentry&kind="src"&path="frameworks/support/v13/java"/&&classpathentry&kind="src"&path="frameworks/support/v13/ics"/&&classpathentry&kind="src"&path="frameworks/support/v13/ics-mr1"/&&classpathentry&kind="src"&path="mediatek/packages/apps/Stk1"/&&classpathentry&kind="src"&path="mediatek/packages/apps/Stk2"/&&classpathentry&kind="src"&path="mediatek/packages/apps/WorldClockWidget"/&&classpathentry&kind="src"&path="mediatek/frameworks-ext/"/&&classpathentry&kind="src"&path="development/samples/ApiDemos/src"/&。。。。。。&classpathentry&kind="src"&path="libcore/dalvik/src/main/java"/&&classpathentry&kind="src"&path="libcore/json/src/main/java"/&&classpathentry&kind="src"&path="libcore/luni/src/main/java"/&&classpathentry&kind="src"&path="libcore/xml/src/main/java"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/ApiDemos_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/Browser_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/CalendarProvider_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/ContactsProvider_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/Gallery2_intermediates/src/renderscript/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/MediaProvider_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/Music_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/Phone_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/APPS/QuickSearchBox_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/android-common-carousel_intermediates/src/renderscript/src"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/com.android.emailcommon_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/keystore/java"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/location/java"/&
&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/media/java"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/telephony/java"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/voip/java"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/NfcLogTags_intermediates/src/src"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/services_intermediates/src"/&&classpathentry&kind="src"&path="out/target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates/src/src/java"/&&classpathentry&kind="src"&path="out/target/common/R"/&&classpathentry&kind="src"&path="external/apache-http/src"/&&classpathentry&kind="src"&path="external/bouncycastle/bcprov/src/main/java"/&&classpathentry&kind="src"&path="external/libphonenumber/java/src"/&&classpathentry&kind="src"&path="external/mp4parser/isoparser/src/main/java"/&&classpathentry&kind="src"&path="external/nist-sip/java"/&&classpathentry&kind="src"&path="external/tagsoup/src"/&&classpathentry&kind="src"&path="external/xmp_toolkit/XMPCore/src"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates/classes-jarjar.jar"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/android-support-v4_intermediates/javalib.jar"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/core-junit_intermediates/classes.jar"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/javalib.jar"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/guava_intermediates/javalib.jar"/&&classpathentry&kind="lib"&path="packages/apps/Calculator/arity-2.1.2.jar"/&&classpathentry&kind="lib"&path="out/target/common/obj/JAVA_LIBRARIES/junit-runner_intermediates/javalib.jar"/&&classpathentry&kind="output"&path="out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes"/&如何使用Android Studio开发/调试Android源码_Linux教程_Linux公社-Linux系统门户网站
你好,游客
如何使用Android Studio开发/调试Android源码
来源:Linux社区&
作者:Lefter
本文是以源码中development/tools/idegen/README作为指导文档.
14.10,openJdk 1.7, Studio 1.0.2,android-5.0.1_r1源码
由于AS是基于IntelliJ IDEA开发的,所以本文也适用于IntelliJ IDEA&
一、修改Android Studio(以下简称AS)的内存配置
因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m,&可自行修改。
&二、配置AS的JDK、SDK
在IDE中添加一个没有classpath的JDK,&这样可以确保使用源码里的库文件
并将其作为要使用的SDK的Java SDK。如下图
三、生成导入AS所需配置文件(*.ipr)
①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)
②检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在,执行:
mmm development/tools/idegen/
在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。
我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。
development/tools/idegen/idegen.sh
等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms
这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件
AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:
&excludeFolder url="file://$MODULE_DIR$/.repo" /&&excludeFolder url="file://$MODULE_DIR$/abi" /&&excludeFolder url="file://$MODULE_DIR$/art" /&
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.
④在AS中打开源码根目录下新生成的android.ipr
如果在导入时AS出现
&则建议按照其给定的解决方法来解决(网址:/display/IDEADEV/Inotify+Watches+Limit),具体内容如下图:
四、解决源码中跳转错误问题
①为当前工程设置正确的SDK和JDK
②设置'Modules'的依赖
先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.
如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)
点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:
其它版本的代码在添加frameworks时可能会显示成:
没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的.
如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可.
五、DEBUG源码
我们可以通过给刚导入的工程在'Modules'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便我们调试代码.
可以按照上图中'1'和'2'来添加Android Framework支持.
在代码中加断点,然后选择'Run'-&'Attach&debugger&to&Android&process'或者直接点击下图所示的图标
在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.
代码中很多地方提示Call&requires&API&Level&x.... 出现这个问题是因为AS将我们的工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion.
我们只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。
也可以考虑使用build.gradle来解决该问题。&
文中所使用的文件地址:
------------------------------------------分割线------------------------------------------
免费下载地址在
用户名与密码都是
具体下载目录在 /2015年资料/4月/19日/如何使用Android Studio开发&调试Android源码/
下载方法见
------------------------------------------分割线------------------------------------------
Ubuntu 12.04(64位)安装Android Studio 全过程 &
Android Studio v0.1尝鲜 &
Android Studio使用教程 &
Android Studio开发指南 &
Android Studio设置主题 和 不支持中文的问题解决方法 &
Android Studio 下载安装以及不能打开的解决办法 &
Android Studio安装使用图文教程 &
Android Studio 的详细介绍:Android Studio 的下载地址:&
本文永久更新链接地址:
相关资讯 & & &
& (07月23日)
& (04月14日)
& (02月18日)
& (04月27日)
& (03月09日)
& (02月12日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款从android framework源码去认识android app的开发(1) - 简书
下载简书移动应用
写了4041字,被36人关注,获得了58个喜欢
从android framework源码去认识android app的开发(1)
android的framework是直接用应用之下的一层,定义了,view,thread,等的java实现,他通过JNI的方式去与下层的硬件去通信,为了去了解android的世界,我们将从java源码的世界去认识一个app是如何使用sdk的代码构建起来的。
一.认识android的架构
Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了,
国内开发者访问() 上面已经有了所有你要的资源,同时可以下载到我们的主角
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
三.开始主题
我们知道我们在一开始写c程序的时候都有一个运行的入口,比如
#include &iostream&
#include &cmath&
#include &algorithm&
//这里的main就是应用的入口
int main(int argc, const char * argv[]){
那问题来了
android程序的入口在哪里呢?
答:在android/app/ActivityThread.java
但是上面的c语言程序一运行完就退出程序了,app会一直运行,他是怎样做到的呢?
在计算机网络原理中我们用实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include &winsock2.h&
#pragma comment(lib, "WS2_32.lib")
#include &stdio.h&
void main()
WORD wVersionR//版本号
WSADATA wsaD
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrS
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrC//字义用来接收客户端Socket的结构体
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr));//格式化输出
//用返回的套接字和客户端进行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
//接收数据
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
他采用了一个while死循环去监听客户端的请求。
在一遍啰嗦之后,我们的主角终于闪亮的登场了。
先上源代码
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(new EventLoggingReporter());
Security.addProvider(new AndroidKeyStoreProvider());
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("&pre-initialized&");
Looper.prepareMainLooper();
//从中可以看到为我们的app开辟了一个线程进入了looper之中
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();
Looper.loop();
进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No L Looper.prepare() wasn't called on this thread.");
final MessageQueue queue = me.mQ
Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();
// 我们在这里看到了一个循环监听消息
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
Printer logging = me.mL
if (logging != null) {
logging.println("&&&&& Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("&&&&& Finished to " + msg.target + " " + msg.callback);
// Make sure that during the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
msg.recycleUnchecked();
四. 下一篇的任务
从源码的角度去分析AsyncTask的原理和实现,并且实现一个模仿的AsyncTask,,源码请关注,我会放在这里的
希望一起成长,一起学习。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 156470人关注
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 125776人关注
Android深入理解、基础详解及各种Library使用介绍。认真做技术,好好享受人生。。
· 3324人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 androidframework源码 的文章

 

随机推荐