Android13實時刷新頻率的實現(xiàn)代碼(完整代碼)

設置->開發(fā)者選項->顯示刷新頻率
packages/apps/Settings/src/com/android/settings/development/ShowRefreshRatePreferenceController.java
public class ShowRefreshRatePreferenceController extends DeveloperOptionsPreferenceController
implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
......
private static final int SETTING_VALUE_QUERY = 2;
private static final int SETTING_VALUE_ON = 1;
private static final int SETTING_VALUE_OFF = 0;
@VisibleForTesting
static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
@VisibleForTesting
static final int SURFACE_FLINGER_CODE = 1034;
private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
private final IBinder mSurfaceFlinger;
......
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean isEnabled = (Boolean) newValue;
writeShowRefreshRateSetting(isEnabled);
return true;
}
@Override
public void updateState(Preference preference) {
updateShowRefreshRateSetting();
}
......
@VisibleForTesting
void updateShowRefreshRateSetting() {
// magic communication with surface flinger.
try {
if (mSurfaceFlinger != null) {
final Parcel data = Parcel.obtain();
final Parcel reply = Parcel.obtain();
data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
data.writeInt(SETTING_VALUE_QUERY);
mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data, reply, 0 /* flags */); // 調(diào)用 SurfaceFlinger::onTransact 中 1034 方法
final boolean enabled = reply.readBoolean(); // 通過 SurfaceFlinger 獲取 mRefreshRateOverlay != null判斷顯示是否打開
((SwitchPreference) mPreference).setChecked(enabled);
reply.recycle();
data.recycle();
}
} catch (RemoteException ex) {
// intentional no-op
}
}
@VisibleForTesting
void writeShowRefreshRateSetting(boolean isEnabled) { // 設置打開顯示刷新頻率
try {
if (mSurfaceFlinger != null) {
final Parcel data = Parcel.obtain();
data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
final int showRefreshRate = isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF;
data.writeInt(showRefreshRate);
mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data,
null /* reply */, 0 /* flags */);
data.recycle();
}
} catch (RemoteException ex) {
// intentional no-op
}
updateShowRefreshRateSetting();
}
}RefreshRateOverlay實際Layer顯示刷新頻率
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
namespace {
......
status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags) {
if (const status_t error = CheckTransactCodeCredentials(code); error != OK) {
return error;
}
status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
IPCThreadState* ipc = IPCThreadState::self();
const int uid = ipc->getCallingUid();
if(code == 8002) {
reply->writeInt32(mScheduler->getDfrcFps());
return NO_ERROR;
}
if (CC_UNLIKELY(uid != AID_SYSTEM
&& !PermissionCache::checkCallingPermission(sHardwareTest))) {
const int pid = ipc->getCallingPid();
ALOGE("Permission Denial: "
"can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
int n;
switch (code) {
......
case 1034: {
auto future = mScheduler->schedule([&] {
switch (n = data.readInt32()) {
case 0:
case 1:
FTL_FAKE_GUARD(mStateLock,
enableRefreshRateOverlay(static_cast<bool>(n)));
break;
default: {
reply->writeBool(
FTL_FAKE_GUARD(mStateLock, isRefreshRateOverlayEnabled()));
}
}
});
future.wait();
return NO_ERROR;
}
......
void SurfaceFlinger::enableRefreshRateOverlay(bool enable)
{
for (const auto& [ignored, display] : mDisplays) {
if (display->isInternal() && !display->isVirtual()) {
if (enable) {
auto fpsRange = display->refreshRateConfigs().getSupportedRefreshRateRange();
mRefreshRateOverlay = std::make_shared<RefreshRateOverlay>(fpsRange, mRefreshRateOverlaySpinner);
} else {
mRefreshRateOverlay.reset(); //disable RefreshRateOverlay
}
display->enableRefreshRateOverlay(mRefreshRateOverlay);
}
}
}
......初始化RefreshRateOverlay
frameworks\native\services\surfaceflinger\RefreshRateOverlay.cpp
RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, bool showSpinner)
: mFpsRange(fpsRange),
mShowSpinner(showSpinner),
mSurfaceControl(SurfaceComposerClient::getDefault()
->createSurface(String8("RefreshRateOverlay"), kBufferWidth,
kBufferHeight, PIXEL_FORMAT_RGBA_8888,
ISurfaceComposerClient::eFXSurfaceBufferState)) {
if (!mSurfaceControl) {
ALOGE("%s: Failed to create buffer state layer", __func__);
return;
}
createTransaction(mSurfaceControl)
.setLayer(mSurfaceControl, INT32_MAX - 2)
.setTrustedOverlay(mSurfaceControl, true)
.apply();
}到此這篇關于Android13實時刷新頻率的實現(xiàn)代碼的文章就介紹到這了,更多相關Android刷新頻率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android 深入探究自定義view之流式布局FlowLayout的使用
FlowLayout(int align, int hgap, int vgap)創(chuàng)建一個新的流布局管理器,它具有指定的對齊方式以及指定的水平和垂直間隙,意思就是說從左上角開始添加原件,依次往后排,第一行擠滿了就換一行接著排2021-11-11
Android形狀圖形與狀態(tài)列表圖形及九宮格圖片超詳細講解
這篇文章主要介紹了Android形狀圖形與狀態(tài)列表圖形及九宮格圖片的應用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09
Android實現(xiàn)簡易計步器功能隔天步數(shù)清零查看歷史運動紀錄
這篇文章主要介紹了Android實現(xiàn)簡易計步器功能隔天步數(shù)清零查看歷史運動紀錄,需要的朋友可以參考下2017-06-06
詳解Android Material Design自定義動畫的編寫
這篇文章主要介紹了詳解Android Material Design自定義動畫的編寫,其中對Activity的過渡動畫進行了重點講解,需要的朋友可以參考下2016-04-04
Android 自動化測試經(jīng)驗分享 深入UiScrollable
UiScrollable是一個UiCollection(這東西還沒搞懂),我們可以使用它,在可滑動的頁面(水平滑動或上下滑動都可以)上查找我們想要的控件(item)2013-05-05
android PopupWindow 和 Activity彈出窗口實現(xiàn)方式
本人小菜一個。目前只見過兩種彈出框的實現(xiàn)方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過,需要的朋友可以參考下2012-11-11
Android自定義ViewPager實現(xiàn)個性化的圖片切換效果
這篇文章主要介紹了Android自定義ViewPager實現(xiàn)個性化的圖片切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

