1.设置的源码-创建DisplayOutputManager实例
try { mDisplayManagement = new DisplayOutputManager(); }catch (RemoteException doe) { doe.printStackTrace(); }
2.设置的源码-设置分辨率
public void saveVideoMode(String videoMode){ Logger.d(TAG , "saveVideoMode, displayIntf = "+mMainDisplay_set+", videoMode = "+videoMode); mDisplayManagement.setMode(mDisplayManagement.MAIN_DISPLAY,mMainDisplay_set, videoMode); mDisplayManagement.setInterface(mDisplayManagement.MAIN_DISPLAY,mMainDisplay_set, true); mUIHandler.postDelayed(new Runnable() { @Override public void run() { mDisplayManagement.saveConfig(); } }, 3000); }
3.framework-DisplayOutputManager.java
public int saveConfig() { try { return mService.saveConfig(); } catch (Exception e) { Log.e(TAG, "Error save :" + e); return -1; } }
public DisplayOutputManager() throws RemoteException { IBinder b = ServiceManager.getService("display_device_management"); if(b == null) { Log.e(TAG, "Unable to connect to display device management service! - is it running yet?"); return; } mWM = IWindowManager.Stub.asInterface(ServiceManager.checkService( Context.WINDOW_SERVICE)); mService = IDisplayDeviceManagementService.Stub.asInterface(b); try { // Get main display interface String[] display_iface = mService.listInterfaces(MAIN_DISPLAY); if(DBG) Log.d(TAG, "main display iface num is " + display_iface.length); if(display_iface != null && display_iface.length > 0) { m_main_iface = new int[display_iface.length]; for(int i = 0; i < m_main_iface.length; i++) { if(DBG) Log.d(TAG, display_iface[i]); m_main_iface[i] = ifacetotype(display_iface[i]); } } else m_main_iface = null; // Get aux display interface display_iface = mService.listInterfaces(AUX_DISPLAY); if(DBG) Log.d(TAG, "aux display iface num is " + display_iface.length); if(display_iface != null && display_iface.length > 0) { m_aux_iface = new int[display_iface.length]; for(int i = 0; i < m_aux_iface.length; i++) { if(DBG) Log.d(TAG, display_iface[i]); m_aux_iface[i] = ifacetotype(display_iface[i]); } } else m_aux_iface = null; } catch (Exception e) { Log.e(TAG, "Error listing Interfaces :" + e); return; } }
4.framework-SystemServer.java
try { Slog.i(TAG, "DisplayDeviceManagementService Service"); ServiceManager.addService( "display_device_management", new DisplayDeviceManagementService(context)); } catch (Throwable e) { Slog.e(TAG, "Failure starting DisplayDeviceManagementService Service", e); }
5.framework-DisplayDeviceManagementService.java
/**
* Constructs a new NetworkManagementService instance
*
* @param context Binder context for this service
*/
public DisplayDeviceManagementService(Context context) {
mContext = context;
if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
return;
}
IntentFilter hdmiFilter = new IntentFilter();
hdmiFilter.addAction(ACTION_PLUGGED);
hdmiFilter.addAction(ACTION_CHANGE);
hdmiFilter.addAction("android.intent.action.DISPLAY_TOAST");
hdmiFilter.addAction(ACTION_TV_STANDBY);
mHdmiReceiver = new HdmiReceiver();
mContext.registerReceiver(mHdmiReceiver,hdmiFilter);
mConnector = new NativeDaemonConnector(
new DisplaydCallbackReceiver(), "displayd", 50, DISPLAYD_TAG, 160);
Thread thread = new Thread(mConnector, DISPLAYD_TAG);
thread.start();
if(DBG) Slog.d(TAG, "DisplayDeviceManagementService start");
}
6.mk文件搜索displayd:find ./ -name "*.mk" | xargs grep -rn displayd

7.经过上一步搜索,/system/displayd/模块下搜索:grep -rn "saveConfig" ./

8.分析DisplayManager.cpp的saveConfig方法即可
void DisplayManager::saveConfig(void) { FILE *fd = NULL; struct displaynode *node; char buf[BUFFER_LENGTH]; char tvdpi[BUFFER_LENGTH]; struct file_base_paramer base_paramer; memset(&base_paramer,0,sizeof(base_paramer)); fd = fopen(DISPLAY_CONFIG_FILE, "w"); if(fd != NULL) { for(node = main_display_list; node != NULL; node = node->next) { memset(node->savemode, 0, MODE_LENGTH); memcpy(node->savemode, node->mode, MODE_LENGTH); memset(buf, 0 , BUFFER_LENGTH); sprintf(buf, "display=%d,iface=%d,enable=%d,mode=%s\n", node->property, node->type, node->enable, node->mode); fwrite(buf, 1, strlen(buf), fd); } for(node = aux_display_list; node != NULL; node = node->next) { memset(node->savemode, 0, MODE_LENGTH); memcpy(node->savemode, node->mode, MODE_LENGTH); memset(buf, 0 , BUFFER_LENGTH); sprintf(buf, "display=%d,iface=%d,enable=%d,mode=%s\n", node->property, node->type, node->enable, node->mode); fwrite(buf, 1, strlen(buf), fd); } fflush(fd); fclose(fd); } sync(); int file; const char *baseparameterfile = GetBaseparameterFile(); if (!baseparameterfile) { ALOGW("base paramter file can not be find"); return; } file = open(baseparameterfile, O_RDWR); if (file < 0) { ALOGW("base paramter file can not be opened"); return; } // caculate file's size and read it unsigned int length = lseek(file, 0L, SEEK_END); lseek(file, 0L, SEEK_SET); if(length < sizeof(base_paramer)) { ALOGE("BASEPARAME data's length is error\n"); close(file); return; } read(file, (void*)&base_paramer, sizeof(file_base_paramer)); for(node = main_display_list; node != NULL; node = node->next) { if(node->type == DISPLAY_INTERFACE_HDMI) { if(node->mode) { base_paramer.hdmi.type = node->type; base_paramer.hdmi.interlaced = 0; if (strstr(node->mode, "YCbCr420")) base_paramer.hdmi.interlaced |= HDMI_VIDEO_YUV420; if (strchr(node->mode, 'p')) { sscanf(node->mode, "%dx%dp-%d", &base_paramer.hdmi.xres, &base_paramer.hdmi.yres, &base_paramer.hdmi.refresh); } else if (strchr(node->mode, 'i')) { sscanf(node->mode, "%dx%di-%d", &base_paramer.hdmi.xres, &base_paramer.hdmi.yres, &base_paramer.hdmi.refresh); base_paramer.hdmi.interlaced |= 1; } else if (strcmp(node->mode,"auto") == 0) { base_paramer.hdmi.xres = 0; base_paramer.hdmi.yres = 0; base_paramer.hdmi.refresh = 0; } ALOGD("[%s] hdmi_mode %s\n", __FUNCTION__,node->mode); } } else if(node->type == DISPLAY_INTERFACE_TV) { if(node->mode) { sscanf(node->mode, "%dx%di-%d", &base_paramer.tve.xres, &base_paramer.tve.yres, &base_paramer.tve.refresh); base_paramer.tve.interlaced = 1; ALOGD("[%s] tve_mode %s\n", __FUNCTION__,node->mode); } } } lseek(file, 0L, SEEK_SET); write(file, (char*)(&base_paramer), sizeof(base_paramer)); close(file); sync(); ALOGD("[%s] hdmi:%d,%d,%d,%d,%d,%d\n", __FUNCTION__, base_paramer.hdmi.xres, base_paramer.hdmi.yres, base_paramer.hdmi.interlaced, base_paramer.hdmi.type, base_paramer.hdmi.refresh, base_paramer.hdmi.reserve); ALOGD("[%s] tve:%d,%d,%d,%d,%d,%d\n", __FUNCTION__, base_paramer.tve.xres, base_paramer.tve.yres, base_paramer.tve.interlaced, base_paramer.tve.type, base_paramer.tve.refresh, base_paramer.tve.reserve); }
0