Activity布局流程+资源加载过程+插件化换肤思路,android开发文档规范

image.png

1.1 generateDecor里就是直接return了new DecorView

  1. onResourcesLoaded加载资源

3.1 onResourcesLoaded()方法里,其实调用了inflater.inflate()来生成View,然后addView添加到父布局下面

mLayoutInflater.inflate() - LayoutInflater.java

  1. LayoutInflater.inflate()就是用来加载xml的

  1. View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)三个参数分别是 XML解析器、父布局的类型、是否要添加到父布局下面(详情看第四步)

attachToRoot 用到的地方image.png

  1. 查看inflate方法,重点方法 createViewFromTag()创建View。

3.1 查看 createViewFromTag() 方法,如果有mFactory、mFactory2、mPrivateFactory就走Factory的onCreateView,不然就走系统的onCreateView

重点中的重点!!! 因为这里是这样构造view的,所以可以通过自定义的Factory或者Factory2,来使构造View的代码走我们自己的,这样就可以实现 -- 插件化换肤

还有一种方法就是直接给LayoutInflate.java这一整个类都给替换了 -- 插件化换肤

3.2 系统的onCreateView其实是根据反射来创建的

①根据name创建constructor 构造器(之前见过的先从HashMap的缓存里取,没取到才自己创建)

②通过构造器创建View View view = constructor.newInstance(args);

③补充:因为View是通过反射constructor.newInstance(args)创建的所以这时候其实View是空的,在xml里写的各种属性都是没有的

①反射获取constructor

② constructor.newInstance(args); 构建View

③ 补充这时候xml的属性都是空的

  1. 因为第三步,View创建是通过反射的,所以现在xml里自己写的属性还是没有的,所以得通过获取 LayoutParams在将属性设置给View

  1. View有了(反射),属性也设置了,也添加到布局树下面了 root.addView(temp, params),所以view就构建完事了

资源加载流程


刚刚上面的全都是Activity的加载流程,下面看资源的加载流程

Resoureces的结构图

1.ResourcesManager管理着一个Resources类

2.Resources类里有他的实现类ResourcesImpl,各种创建,调用,getColor等方法都是在实现类里实现的

3.ResourcesImpl里管理着一个AssetManager

4.AssetManager负责从apk里获取资源,写入资源等 addAssetPath()

resources.arsc这个文件就是apk中存资源的(字典表),addAssetPath()取的就是他的值

handleBindApplication()–ActivityThread.java

  1. 起点是ActivityThread.java handleBindApplication()方法 ,在这加载Application的

  1. 先new了一个Instrumentation(翻译仪表),这个类是用来加载Activity的

image.png

  1. 生产了makeApplication,然后调用了Application.onCreate();

makeApplication()-- LoadedApk.java

先看Application的生产过程

  1. 先创建了上下文createAppContext

![](https://img-blog.csdnimg.cn/img_convert/2719579148b1e7a43bdb453e89bb8144.png

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

)

  1. 通过反射ClassLoader.loadClass(className).newInstance()创建Application

  1. 第一步创建上下文createAppContext,点进去

重要方法context.setResources(packageInfo.getResources()); 根据LoadedApk获取资源

  1. 点进LoadedApk.getResources(),发现在ResourcesManager包里。具体里面方法是getOrCreateResources获取或者创建资源

  1. 点进getOrCreateResources方法,发现是ResourcesManager.java里的方法。他先从缓存 WeakReference<ResourcesImpl>里取,取不到再创建资源

  1. 看createResourcesImpl()创建资源,是通过AssetManager创建的

  1. createAssetManager()方法里,调用了addApkAssets()重点方法,这个方法是native方法,作用是给一个路径,用来加载apk里的资源在android27 里 叫addAssetPath()

插件化换肤思路


根据上面最后第7步:

1.apk里所有的资源都是通过/resources.arsc 这个表格,然后去找具体apk的资源的。image.png

2.而Resoures实际是通过AssetManager来资源加载的,外面的都是一层包装YDpng

3.AssetManager重点方法根据资源id找包名、类型、资源等等。根据name获取资源

插件化换肤思路:

1.插件apk跟宿主apk有同名的资源


版权声明:本文为m0_64603776原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。