Android源码硬件加速简析
来源:互联网 发布:上海网络推广铭心 编辑:程序博客网 时间:2024/06/05 07:38
硬件加速从Android4.4 (Target API level >=14)就可以就被默认开启了。当然也可以明确指定在开发应用的配置里。如果使用谷歌标准的views和frawables,全局都是通用的,不会引起任何绘制问题。但是往往开发者定制太严重,所以会造成异常或者错误的渲染像素。为了针对这个问题,Android给了几个选项去打开或者关闭硬件加速在不同的等级。
其中有四个不同的等级去控制,分别是application,Activity,Window,和view
1、应用: 全局,可以打开可以关闭
<application android:hardwareAccelerated="true">
2、Activity:activity级别,可以打开可以关闭
<activity android:hardwareAccelerated="true">
3、Window:window级别,只可以打开,不可以关闭
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
4、View:view级别,只可以关闭。
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
请参考:https://developer.android.com/guide/topics/graphics/hardware-accel.html
1、在源码里,首先会从Application去判断,是否应用开启硬件加速,这一步的操作是在frameworks/core/java/android/content/pm/PackageParser.java里进行判断的,函数为解析Apk
。具体的判断会在parseBaseApplication()函数里,其调用者为packagemanagerservie.java出发,在开机,安装apk,或者想获得apk信息时,就会被调用,
owner.baseHardwareAccelerated = sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated,
owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.ICE_CREAM_SANDWICH);
if (owner.baseHardwareAccelerated) {
ai.flags |= ApplicationInfo.FLAG_HARDWARE_ACCELERATED;
}
2、确定好Application的等级是否开启硬件加速,然后再去解析Activity的时候,去判断Acitivity是否需要开启硬件加速。函数为parseActivity()。具体代码如下:
if (sa.getBoolean(R.styleable.AndroidManifestActivity_hardwareAccelerated,
hardwareAccelerated)) {//首先会判断Activity是否请求,然后默认值为application的值。
a.info.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED;
}
application的值为全局的,只要application为true,所以的view都会被硬件加速。
3、关于window的判断,其代码在/core/java/android/view/Window.java类里边,具体函数为adjustLayoutParamsForSubWindow()作用就是判断一些窗口属性,然后给窗口设置一个title。
具体代码为:
if (mHardwareAccelerated ||
(mWindowAttributes.flags & FLAG_HARDWARE_ACCELERATED) != 0) {
wp.flags |= FLAG_HARDWARE_ACCELERATED;
}
启动mHardwareAccelerated , 是从Activity那里判断得来的,mWindowAttributes.flags是否开启,应该有很多地方可以设置,比如说:在Activityrecored里 构造函数中:
if ((aInfo.flags&ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
windowFlags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
}
会通过判断acitivity是否有硬件加速去给window的标志位赋值。
4、最后去判断是否开机硬件加速的位置viewrootimpl.java中的setView()方法中,具体代码为:
// If the application owns the surface, don't enable hardware acceleration
if (mSurfaceHolder == null) {
enableHardwareAcceleration(attrs);
}
mSurfaceHolder一般情况下都是为null,除非view想让自己成为一个surfaceview,例如显示相机的图像。attrs则为窗口属性值集了,接下来的判断为:
final boolean hardwareAccelerated =
(attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
if (hardwareAccelerated) {
if (!ThreadedRenderer.isAvailable()) {
return;
}
如果attrs具有硬件加速位,则为true,然后继续判断threadedrenderer.isaviailable(),如果可以用,则创建一个hardwarerenderer线程,具体代码为:
mAttachInfo.mHardwareRenderer = ThreadedRenderer.create(mContext, translucent);
if (mAttachInfo.mHardwareRenderer != null) {
mAttachInfo.mHardwareRenderer.setName(attrs.getTitle().toString());
mAttachInfo.mHardwareAccelerated =
mAttachInfo.mHardwareAccelerationRequested = true;
}
创建过程复杂,还在研究中,推荐看老罗的笔记了。
阅读全文
0 0
- Android源码硬件加速简析
- android硬件加速
- android硬件加速
- Android硬件加速
- Android硬件加速
- android硬件加速
- Android硬件加速
- android硬件加速
- Android-硬件加速
- Android硬件加速
- Android硬件加速
- android硬件加速
- Android硬件加速
- Android 硬件加速
- android 硬件加速
- Android--硬件加速
- Android硬件加速
- android 硬件加速
- MySQL笔记【持续更新……】
- Java中==和equals的区别
- 树形依赖动态规划
- C++ List的用法(整理)
- 领域驱动设计,读书笔记:4 绑定模型和实现
- Android源码硬件加速简析
- Leetcode659——Split Array into Consecutive Subsequences
- 学习笔记-IO流-系统输出
- 【美团】最大矩形面积(分治法)
- 模式识别绪论
- 操作mysql数据库,出现中文乱码如何解决?
- linux僵尸进程和孤儿进程
- 利用maven搭建modules工程
- 2017.9.4 斜堆 失败总结