Android源码分析(三)-----系统框架设计思想
一 : 术在内而道在外
Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已......
近来发现很多关于Android文章都是以源码的方向入手分析Android这个系统,最终结果可想而知,甚是凄惨。正所谓自信满满的来,一脸懵逼的走。
想要真正了解Android系统,首先一定要站在更高的层次上做分析,以设计者的角度去思考。如果让你去设计Android系统,你会如何设计?而并不是把已经设计好的源码当做学习Android系统的切入点,源码只是让你进一步去验证自己的想法是否正确。Android Framework设计之初就必须要考虑系统诞生后,AP开发者该如何使用,怎么设计系统才会处于主导地位,占据主动权。
二 : 框架设计
框架是如何知道开发者后来撰写的应用子类的名称呢? 如果不知道应用子类的名称又如何创建应用子类的对象呢?
答案是:依赖AndroidManifest.xml文档。 java中的反射机制还有泛型。
任何系统的设计都是框架在先,AP开发者在后。Framework层框架的设计同样是早于AP开发者,所有的设计基本都是反向调用,基于IOC(控制反转),类似Spring框架的IOC/DI(控制反转/依赖注入),包括Activity的生命周期,setContentView(int layoutResId),startActivity(Intent , intent)等方法全部都是在Framework诞生时就已经定义完成。
源码路径:/frameworks/base/core/java/android/app/Activity.java
/*** Set the activity content from a layout resource. The resource will be* inflated, adding all top-level views to the activity.** @param layoutResID Resource ID to be inflated.** @see #setContentView(android.view.View)* @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)*/public void setContentView(@LayoutRes int layoutResID) {getWindow().setContentView(layoutResID);initWindowDecorActionBar();}/*** Set the activity content to an explicit view. This view is placed* directly into the activity's view hierarchy. It can itself be a complex* view hierarchy. When calling this method, the layout parameters of the* specified view are ignored. Both the width and the height of the view are* set by default to {@link ViewGroup.LayoutParams#MATCH_PARENT}. To use* your own layout parameters, invoke* {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}* instead.** @param view The desired content to display.** @see #setContentView(int)* @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)*/public void setContentView(View view) {getWindow().setContentView(view);initWindowDecorActionBar();}/*** Set the activity content to an explicit view. This view is placed* directly into the activity's view hierarchy. It can itself be a complex* view hierarchy.** @param view The desired content to display.* @param params Layout parameters for the view.** @see #setContentView(android.view.View)* @see #setContentView(int)*/public void setContentView(View view, ViewGroup.LayoutParams params) {getWindow().setContentView(view, params);initWindowDecorActionBar();}
Android中的对象由基类创建,基类主导一切的控制权,这样框架便占据了主导地位。在RunTime时刻根据Manifest文件回传相关数据。AP开发者同样也可以使用反射机制调用Framework的隐藏API。
三 : 总结
- Android的精髓在源码之外,而不在源码之内。
- 以设计者的角度去思考系统架构。
- 从源码中验证自己的结论。
- 多角度思考,重复验证。
喜欢源码分析系列可参考其他文章:
Android源码分析(一)-----如何快速掌握Android编译文件
Android源码分析(二)-----如何编译修改后的framework资源文件
转载于:https://www.cnblogs.com/ljx646566715/p/10893856.html
Android源码分析(三)-----系统框架设计思想相关推荐
- Android源码分析-PackageManagerService(PMS)源码分析(三)- queryIntentActivities函数来查找activity
queryIntentActivities函数的作用: 在Android应用程序开发中,用startActivity可以开启另外一个Activity或应用.startActivity函数必须包含Int ...
- Android源码分析(十一)-----Android源码中如何引用aar文件
一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...
- Android 源码分析
查看源码版本号: build\core\version_defaults.mk //搜索该文件中的 PLATFORM_VERSION值 frameworks 目录 (核心框架--java及C++语言) ...
- Android源码分析-全面理解Context
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...
- Android源码分析--MediaServer源码分析(二)
在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...
- Android源码分析 - Framework层的Binder(客户端篇)
开篇 本篇以aosp分支android-11.0.0_r25作为基础解析 我们在之前的文章中,从驱动层面分析了Binder是怎样工作的,但Binder驱动只涉及传输部分,待传输对象是怎么产生的呢,这就 ...
- Android源码分析 - Zygote进程
开篇 本篇以android-11.0.0_r25作为基础解析 上一篇文章Android源码分析 - init进程,我们分析了Android第一个用户进程init进程的启动过程和之后的守护服务 init ...
- 【投屏】Scrcpy源码分析三(Client篇-投屏阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- Android源码分析—属性动画的工作原理
转载请注明出处: http://blog.csdn.net/singwhatiwanna/article/details/17853275 前言 本文为Android动画系列的最后一篇文章,通过对源码 ...
最新文章
- android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常
- [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
- C++ — 智能指针的简单实现以及循环引用问题
- C++socket编程(七):7.3 http的响应协议
- HTML5 DOM File API 转)
- HD TUNE 下载使用
- 华为路由器怎么看是不是公网_如何查看华为路由器默认ip地址
- 微信获取openid出现40163
- git clone报错error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly
- TOM邮箱的全新域名,163vip.com、163vip.net,老朋友的新问候!
- 从行业到技术,一位嵌入式er带你清晰总览嵌入式行业职业规划
- Class文件格式总结
- SCI 论文过去时和现在时 时态的使用
- Breast Cancer Wisconsin (Diagnostic) Data Set
- 11、异常 异常解决方案
- 腾讯云8核 16G 18M配置服务器评测
- 自顶向下的GAMMA显著性——学习搜索复杂场景中的对象
- bp神经网络原理 实现过程,BP神经网络的实现包括
- mysql中英文拼音首字母获取及排序
- 日元技术预测Mogafx
热门文章
- java上课签到如何写_java签到程序怎么设置?学生考勤程序怎么写?
- android 初始化变量,变量初始化 - Android Studio
- python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...
- 请领导批阅文件怎么说_有请考过的说物业经理资格证怎么考?
- android html模板下载地址,Android HTML模板
- python assert_Python中何时使用断言 assert
- 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
- 什么是SQL Server GETDATE()函数?
- Spring @Service批注
- java集合替换集合_Java集合–您必须知道的13件事