1.插件的加载:从PmBase.loadAppPlugin()说起
在RePlugin解析-startActivity流程分析 文章的最后提到PmBase.loadAppPlugin()方法, 如下:
|
|
这里的3个参数都很重要,首先看mPlugins是如何来的。
mPlugins其实包含的就是插件信息,key为插件的包名或别名,而value则为插件对象。它其实是在常驻进程初始化时赋值的。当然,中间如果安装了新的插件,mPlugins中的信息也会有更新。
mPlugins的初始化流程如下
小楼一夜听春雨
在RePlugin解析-startActivity流程分析 文章的最后提到PmBase.loadAppPlugin()方法, 如下:
|
|
这里的3个参数都很重要,首先看mPlugins是如何来的。
mPlugins其实包含的就是插件信息,key为插件的包名或别名,而value则为插件对象。它其实是在常驻进程初始化时赋值的。当然,中间如果安装了新的插件,mPlugins中的信息也会有更新。
mPlugins的初始化流程如下
所有plugin中的Activity子类都会在编译时由gradle插件进行替换,即将继承自Activity或Activity子类(如AppCompatActivity)的类改为继承PluginActivity和PluginAppCompatActivity等,这样做的原因在于:RePlugin既不想Hook AMP,Instrumentation等,又想达到动态加载未在Manifest中声明的组件的目的,那么就只能在编译期做更多的事情,即通过gradle插件来修改plugin中的代码(特别是组件的代码),比如这里所有本来继承自Activity或AppCompatActivity改为继承PluginActivity和PluginAppCompatActivity,而PluginActivity虽然也是继承自Activity,但是其内部的方法已经重写了,代码如下
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
|
|
More info
Android框架提供了两种绘制图形的方式:Canvas和OpenGL.
android.graphics.Canvas是一个2D图形API, 并且是在开发者中最流行的图形API. Canvas运算会在Android中绘制所有原生和自定义android.view.View. 在Android中,Canvas API通过一个名为OpenGLRender的绘制库实现硬件加速,该绘制库将Canvas运算转换为OpenGL运算,以便它们可以在GPU上执行。
从Android 4.0开始,硬件加速的Canvas默认情况下处于启用状态。因此,支持OpenGL ES 2.0的硬件GPU对于Android 4.0及更高版本的设备来说是强制要求。
除了Canvas,开发者渲染图形的另一个主要方式是使用OpenGL ES直接渲染到Surface. Android在Android.opengl包中提供了OpenGL ES接口,开发者可以使用这些接口通过SDK或Android NDK中提供的原生API调用其GL实现。
无论开发者使用什么渲染API,一切内容都会渲染到”Surface”. Surface表示缓冲队列中的生产方,而缓冲队列通常会被SurfaceFlinger消耗。在Android平台上创建的每个窗口都由Surface提供支持。所有被渲染的可见Surface都被SurfaceFlinger合成到显示部分。
下图显示了关键组件是如何协作的