一 : 术在内而道在外

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。

三 : 总结

  1. Android的精髓在源码之外,而不在源码之内。
  2. 以设计者的角度去思考系统架构。
  3. 从源码中验证自己的结论。
  4. 多角度思考,重复验证。

喜欢源码分析系列可参考其他文章:
Android源码分析(一)-----如何快速掌握Android编译文件
Android源码分析(二)-----如何编译修改后的framework资源文件

转载于:https://www.cnblogs.com/ljx646566715/p/10893856.html

Android源码分析(三)-----系统框架设计思想相关推荐

  1. Android源码分析-PackageManagerService(PMS)源码分析(三)- queryIntentActivities函数来查找activity

    queryIntentActivities函数的作用: 在Android应用程序开发中,用startActivity可以开启另外一个Activity或应用.startActivity函数必须包含Int ...

  2. Android源码分析(十一)-----Android源码中如何引用aar文件

    一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...

  3. Android 源码分析

    查看源码版本号: build\core\version_defaults.mk //搜索该文件中的 PLATFORM_VERSION值 frameworks 目录 (核心框架--java及C++语言) ...

  4. Android源码分析-全面理解Context

    前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...

  5. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  6. Android源码分析 - Framework层的Binder(客户端篇)

    开篇 本篇以aosp分支android-11.0.0_r25作为基础解析 我们在之前的文章中,从驱动层面分析了Binder是怎样工作的,但Binder驱动只涉及传输部分,待传输对象是怎么产生的呢,这就 ...

  7. Android源码分析 - Zygote进程

    开篇 本篇以android-11.0.0_r25作为基础解析 上一篇文章Android源码分析 - init进程,我们分析了Android第一个用户进程init进程的启动过程和之后的守护服务 init ...

  8. 【投屏】Scrcpy源码分析三(Client篇-投屏阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  9. Android源码分析—属性动画的工作原理

    转载请注明出处: http://blog.csdn.net/singwhatiwanna/article/details/17853275 前言 本文为Android动画系列的最后一篇文章,通过对源码 ...

最新文章

  1. android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常
  2. [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
  3. C++ — 智能指针的简单实现以及循环引用问题
  4. C++socket编程(七):7.3 http的响应协议
  5. HTML5 DOM File API 转)
  6. HD TUNE 下载使用
  7. 华为路由器怎么看是不是公网_如何查看华为路由器默认ip地址
  8. 微信获取openid出现40163
  9. git clone报错error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly
  10. TOM邮箱的全新域名,163vip.com、163vip.net,老朋友的新问候!
  11. 从行业到技术,一位嵌入式er带你清晰总览嵌入式行业职业规划
  12. Class文件格式总结
  13. SCI 论文过去时和现在时 时态的使用
  14. Breast Cancer Wisconsin (Diagnostic) Data Set
  15. 11、异常 异常解决方案
  16. 腾讯云8核 16G 18M配置服务器评测
  17. 自顶向下的GAMMA显著性——学习搜索复杂场景中的对象
  18. bp神经网络原理 实现过程,BP神经网络的实现包括
  19. mysql中英文拼音首字母获取及排序
  20. 日元技术预测Mogafx

热门文章

  1. java上课签到如何写_java签到程序怎么设置?学生考勤程序怎么写?
  2. android 初始化变量,变量初始化 - Android Studio
  3. python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...
  4. 请领导批阅文件怎么说_有请考过的说物业经理资格证怎么考?
  5. android html模板下载地址,Android HTML模板
  6. python assert_Python中何时使用断言 assert
  7. 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
  8. 什么是SQL Server GETDATE()函数?
  9. Spring @Service批注
  10. java集合替换集合_Java集合–您必须知道的13件事