您的位置:首页 > 移动开发 > Android开发

Android源码硬件加速简析

2017-09-04 21:24 483 查看
硬件加速从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;
}
创建过程复杂,还在研究中,推荐看老罗的笔记了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: