В Settings->Developer options->HARDWARE ACCELERATED RENDERING
есть переключатель под названием Disable HW overlays
. Если вы откроете его, система закроет HWC
и использует OpenGLES
для рендеринга слоев. Если вы хотите закрыть его всегда, вы можете погрузиться в код и найти флаг, который он устанавливает, а затем вы можете установить его в значение, чтобы отключить HWC
.
Обновление 1:
В DevelopmentSettings.java
ниже приведен код для отправки флага на SurfaceFlinger
:
private void writeDisableOverlaysOption() {
try {
IBinder flinger = ServiceManager.getService("SurfaceFlinger");
if (flinger != null) {
Parcel data = Parcel.obtain();
data.writeInterfaceToken("android.ui.ISurfaceComposer");
final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0;
data.writeInt(disableOverlays);
flinger.transact(1008, data, null, 0);
data.recycle();
updateFlingerOptions();
}
} catch (RemoteException ex) {}
}
В SurfaceFlinger.cpp
он сохранит этот флаг в mDebugDisableHWC
и использует приведенный ниже код, чтобы уведомить Layer
об использовании OpenGLES
для принудительной визуализации:
// build the h/w work list
if (CC_UNLIKELY(mGeometryInvalid)) {
mGeometryInvalid = false;
for (size_t dpy = 0; dpy < mDisplays.size(); dpy++) {
sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
const auto hwcId = displayDevice->getHwcDisplayId();
if (hwcId >= 0) {
const Vector<sp<Layer> >& currentLayers(
displayDevice->getVisibleLayersSortedByZ());
for (size_t i = 0; i < currentLayers.size(); i++) {
const auto& layer = currentLayers[i];
if (!layer->hasHwcLayer(hwcId)) {
if (!layer->createHwcLayer(mHwc.get(), hwcId)) {
layer->forceClientComposition(hwcId);
continue;
}
}
layer->setGeometry(displayDevice, i);
if (mDebugDisableHWC || mDebugRegion) {
layer->forceClientComposition(hwcId);
}
}
}
}
}
Хорошо, если вы хотите отключить его по коду, вы можете написать метод, например writeDisableOverlaysOption
, и отключить переключатель в Settings
, чтобы пользователь не использовал переключатель для сброса состояния.