Android13實(shí)時刷新頻率的實(shí)現(xiàn)代碼(完整代碼)
設(shè)置->開發(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) { // 設(shè)置打開顯示刷新頻率 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實(shí)際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(); }
到此這篇關(guān)于Android13實(shí)時刷新頻率的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Android刷新頻率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 深入探究自定義view之流式布局FlowLayout的使用
FlowLayout(int align, int hgap, int vgap)創(chuàng)建一個新的流布局管理器,它具有指定的對齊方式以及指定的水平和垂直間隙,意思就是說從左上角開始添加原件,依次往后排,第一行擠滿了就換一行接著排2021-11-11Android形狀圖形與狀態(tài)列表圖形及九宮格圖片超詳細(xì)講解
這篇文章主要介紹了Android形狀圖形與狀態(tài)列表圖形及九宮格圖片的應(yīng)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09Android Studio配置反混淆的實(shí)現(xiàn)
這篇文章主要介紹了Android Studio如何混淆的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Android實(shí)現(xiàn)簡易計步器功能隔天步數(shù)清零查看歷史運(yùn)動紀(jì)錄
這篇文章主要介紹了Android實(shí)現(xiàn)簡易計步器功能隔天步數(shù)清零查看歷史運(yùn)動紀(jì)錄,需要的朋友可以參考下2017-06-06詳解Android Material Design自定義動畫的編寫
這篇文章主要介紹了詳解Android Material Design自定義動畫的編寫,其中對Activity的過渡動畫進(jìn)行了重點(diǎn)講解,需要的朋友可以參考下2016-04-04Android 自動化測試經(jīng)驗(yàn)分享 深入UiScrollable
UiScrollable是一個UiCollection(這東西還沒搞懂),我們可以使用它,在可滑動的頁面(水平滑動或上下滑動都可以)上查找我們想要的控件(item)2013-05-05android PopupWindow 和 Activity彈出窗口實(shí)現(xiàn)方式
本人小菜一個。目前只見過兩種彈出框的實(shí)現(xiàn)方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過,需要的朋友可以參考下2012-11-11Android自定義ViewPager實(shí)現(xiàn)個性化的圖片切換效果
這篇文章主要介紹了Android自定義ViewPager實(shí)現(xiàn)個性化的圖片切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05