- 浏览: 638137 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
记得公司同事也提过这个启动过程,共4个步骤:
1 .init进程启动
2 .Native服务启动
3 .SystemSever,Android服务Init2
4 .Home启动
现在我们按照执行顺序挨个来看:
1. init进程启动
Init.c[1047行]:看main函数可知,他在解析init.rc和/init.%s.rc脚本
/* -----------------init.rc-----------------------------*/
INFO("reading config file\n");parse_config_file("/init.rc");
qemu_init();import_kernel_cmdline(0); get_hardware_name();
/* -----------------init.%s.rcinit.%s.rc-----------------------------*/
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);parse_config_file(tmp);
Init.rc[383行]:这是一个Android自定义格式的脚本【详细我将用一片文档类别的日志粘贴上去】有4中类型:Action,Commands,Service,Options
那么他的启动如下:
Init.c打开rc文件解析服务,存于service_list中/*具体怎么解析不做研究*/
简单的解释下:int parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0);
if (!data) return -1;
parse_config(fn, data);
/* DUMP();它解析内容:struct service *svc;struct action *act;struct command *cmd;struct listnode *node;struct listnode *node2;struct socketinfo *si;
是list_for_each()这个方法进行具体解析的,这里就不作更深的代码黏贴了,读者可以自己去看*/
int n;
return 0;
}
那么他是如何开启Native和Android的服务的呢?
Service的启动靠的是serivce_start在main函数启动,在死循环中:
for(;;) {
int nr, i, timeout = -1;
for (i = 0; i < fd_count; i++)
ufds[i].revents = 0;
drain_action_queue();
restart_processes();// 会遍历Service,restart_service_if_needed,调用serivce_start()
if (process_needs_restart) {
timeout = (process_needs_restart - gettime()) * 1000;
if (timeout < 0)
timeout = 0;
}
而serivce_start()做的时期就是初始化好srv[service],并调用execve()方法,从而建立Service进程。
//具体代码请作者自己去看,这里就不黏贴了。
启动Zygote:Zygote的职责就是产生Activity,(接受ActivityManagerService请求)将单独写文章理解
启动System Server:在ZygoteInit这个类中,他启动了SystemServer进程:
在ZygoteInit这个类的main函数中 :有这样一段代码
if (argv[1].equals("true")) {
startSystemServer();
//Zygote.forkSystemServe->启动了SystemServer进程
}
至于系统的Native服务和Android服务的启动过程,上一次日志,我们已经写过了,这里就不在缀诉。在每个服务启动后了之后,都会回调相应服务的onSystemReady()来执行回调的代码,同样的ActivityManager也是又这个回调函数:,
// 如下服务是构建回调ActivityManagerService所要的服务,我们单独列出来
final BatteryService batteryF = battery;
final ConnectivityService connectivityF = connectivity;
final DockObserver dockF = dock;
final ThrottleService throttleF = throttle;
final UiModeManagerService uiModeF = uiMode;
final AppWidgetService appWidgetF = appWidget;
final WallpaperManagerService wallpaperF = wallpaper;
final InputMethodManagerService immF = imm;
final RecognitionManagerService recognitionF = recognition;
final LocationManagerService locationF = location;
//我们告诉ActivityManagerService现在可以运行第三方代码了,他们一旦获得状态就会回调我们的CallBack来完成整个初始化过程。原文注释如下:
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
// where third party code can really run (but before it has actually
// started launching the initial applications), for us to complete our
// initialization.
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() {
public void run() {
if (batteryF != null) batteryF.systemReady();
if (connectivityF != null) connectivityF.systemReady();
if (dockF != null) dockF.systemReady();
if (uiModeF != null) uiModeF.systemReady();
if (recognitionF != null) recognitionF.systemReady();
Watchdog.getInstance().start();
if (appWidgetF != null) appWidgetF.systemReady(safeMode);
if (wallpaperF != null) wallpaperF.systemReady();
if (immF != null) immF.systemReady();
if (locationF != null) locationF.systemReady();
if (throttleF != null) throttleF.systemReady();
}
});
这样就调用了ActivityManagerService的systemReady(final Runnable goingCallback)。
ActivityManagerService的systemReady(),当判断为mSystemReady为true的时候,便会回调goingCallback.run。这种多线程的代码的组织技巧也是我们应该学习的。我们甚至看到如果主题是CategoryHome,那么系统是不会回收的。
言归正传:在systemReady()里调用这么个方法:resumeTopActivityLocked(null),他引导了Home的启动。
在这个resumeTopActivityLocked (HistoryRecord prev)有这样一个代码
if (next == null) {// HistoryRecord next = topRunningActivityLocked(null);
// 没有其他Activity,只要启动Home就好
return startHomeActivityLocked();
}
付解释代码:
private final HistoryRecord topRunningActivityLocked(HistoryRecord notTop) {
int i = mHistory.size()-1;
while (i >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(i);
if (!r.finishing && r != notTop) {
return r;
}
i--;
}
return null;
}
在这个函数里便启动了HomeActivity。
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1471当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 22021.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1640刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 1037从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2486android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1562F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1168添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1182declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5321如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1082从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1857JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2896Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1657public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1650使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10088PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 907这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9741.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1124在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1058public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1944首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
通过以上知识点,我们可以了解到,解压并研究"安卓Android源码——Android Launcher 源码修改可编译.zip"文件,不仅可以深入了解Android系统的工作机制,还能动手实践,创造出独具特色的Android启动器。
在Android应用开发中,启动画面(Splash Screen)是用户打开应用程序时首先看到的界面,它通常展示品牌...开发者可以通过研究这个源码,理解并掌握自定义启动画面的实现方法,进一步提升自己的Android应用开发能力。
通过研究《疯狂Android讲义》的源码,开发者不仅可以深化对Android开发的理解,还能学习到作者在实际开发过程中的经验和技巧。同时,这也有助于提升问题解决能力,为日后的项目开发打下坚实基础。
本资料包提供的是一个经过修改,可编译的Android Launcher源码,旨在帮助开发者深入理解Android启动器的工作原理,并进行定制化开发。以下是对这个高级应用源码的详细分析。 一、Android Launcher概述 Android ...
通过深入研究《Android经典源码全集》,开发者不仅可以掌握Android开发的基本技能,还能了解到许多高级特性和最佳实践,从而在实际项目中编写出更高效、更稳定、用户体验更好的应用。这是一份宝贵的资源,值得每一个...
【AndroidDriver-master_layers2x3_简单android源码_androidapp源码_android】是一个与Android应用程序开发相关的项目,从描述来看,这可能是某个人学习或练习Android编程时创建的第一个APP程序。这个项目的名称...
《安卓系统源码详解——基于Android 14的探索与学习》 Android系统源码是开发者深入了解操作系统工作原理、定制个性化系统以及优化应用性能的重要工具。Android 14的源码,作为Android发展历程中的一个重要版本,为...
此外,源码可能还包括了Intent的使用,它是Android中传递信息的关键机制,用于启动新的Activity或Service。 再者,源码中可能包含对SQLite数据库的运用,用于存储书籍信息和用户的阅读进度。这涉及到Android的数据...
1. **系统启动流程**:源码中包含了开机启动流程,包括bootloader、kernel以及Android系统的初始化。理解这一过程有助于开发者调试设备启动问题,如了解zygote进程如何启动,系统服务如何加载。 2. **HAL(硬件抽象...
通过阅读和研究《精通Android》这本书的源码,开发者不仅可以深化对Android平台的理解,还能提高实际开发能力,解决实际问题。这份源码是书本理论知识的实践验证,是每一个Android开发者不可多得的学习资料。
Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目...
这个源码是植物大战僵尸的简单版本,非常适合初级到中级的Android开发者学习和研究,尤其是对于想要提升Java编程和Android应用开发技能的人来说,这是一个绝佳的学习资源。 首先,我们要明确的是,这个项目是基于...
总之,通过研究Android 2.2源码,开发者不仅可以了解Android系统的架构,还能学习到最佳实践,提高解决问题的能力。同时,这对于那些希望参与系统级定制或开发定制ROM的开发者来说,更是不可或缺的学习资源。因此,...
再者,Android的事件分发机制也是源码研究的重点。从Activity到View,事件是如何层层传递并响应的,这在处理复杂的触摸交互时非常关键。理解这个过程,能让我们编写出更灵活、响应更快的应用。 此外,Intent作为...
通过研究这些实例源码,开发者不仅可以加深对Android系统的理解,还能积累实战经验,提高解决问题的能力。在学习过程中,应结合官方文档和其他教程,逐步建立自己的知识体系,成为更优秀的Android开发者。
通过源码,你可以深入研究Android系统的启动过程,从Zygote进程的创建到System Server的初始化,再到用户界面的显示。 11. **编译与构建系统** Android Framework的构建过程涉及Makefile、Gradle等工具,了解这...
总的来说,通过深入研究这个【Android应用源码之安卓记账本】,开发者可以学习到Android应用开发的多个核心领域,包括UI设计、数据存储、事件处理、权限管理、网络编程以及架构设计。这将对提升个人的Android开发...
通过研究这个源码,开发者可以学习到如何在Android平台上构建一个简单的应用,理解Android应用的工作原理,以及如何处理用户交互和数据管理。同时,这也是提升Java编程技能和Android开发经验的好机会。
Android 23源码是Google在2015年发布的Android操作系统版本,也被称为Marshmallow(棉花糖)。这个版本带来了许多关键的更新和改进,旨在...通过深入学习和研究这些源码,可以推动Android生态系统的持续创新和发展。
通过阅读和研究这些源码,开发者不仅可以加深对Android开发的理解,还能提升实际项目中的问题解决能力。同时,PPT说明将帮助理解源码背后的逻辑和设计思路,是学习和提高Android技能的重要参考资料。