Android14窗口管理自适应投屏分辨率
环境
console:/ # cat /proc/version
Linux version 6.1.57 (机密信息) (Android (10087095, +pgo, +bolt, +lto, -mlgo, based on r487747c) clang version 17.0.2 (https://android.googlesource.com/toolchain/llvm-project d9f89f4d16663d5012e5c09495f3b30ece3d2362), LLD 17.0.2) #22 SMP PREEMPT Mon Feb 24 09:56:40 UTC 2025
auto_wm.c
$ cat auto_wm.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> /* persist.panel.width=800 persist.panel.height=480 persist.panel.density=178 */ struct panel { int width; int height; int density; }; static int get_remote_panel_info(struct panel *info) { int ret = -1; FILE *fp = NULL; char buf[64] = {0}; if((fp = fopen("/mnt/vendor/qcache/display_config.txt", "r")) != NULL) { do { fgets(buf, sizeof(buf), fp); if(sscanf(buf, (char *)"persist.panel.width=%d", &info->width) != 1) break; fgets(buf, sizeof(buf), fp); if(sscanf(buf, (char *)"persist.panel.height=%d", &info->height) != 1) break; fgets(buf, sizeof(buf), fp); if(sscanf(buf, (char *)"persist.panel.density=%d", &info->density) != 1) break; ret = 0; } while(0); fclose(fp); } return ret; } static int get_local_panel_info(struct panel *info) { int ret = -1; FILE *fp = NULL; if((fp = popen("wm size", "r")) != NULL) { if(fscanf(fp, (char *)"Physical size: %dx%d", &info->width, &info->height) == 2) ret = 0; pclose(fp); } if(ret != -1) { if((fp = popen("wm density", "r")) != NULL) { if(fscanf(fp, "Physical density: %d", &info->density) != 1) ret = -1; } else { ret = -1; } pclose(fp); } return ret; } static int get_override_panel_info(struct panel *info) { int ret = -1; FILE *fp = NULL; char buf[64] = {0}; if((fp = popen("wm size", "r")) != NULL) { fgets(buf, sizeof(buf), fp); if(fscanf(fp, (char *)"Override size: %dx%d", &info->width, &info->height) == 2) ret = 0; pclose(fp); } if((fp = popen("wm density", "r")) != NULL) { fgets(buf, sizeof(buf), fp); if(fscanf(fp, "Override density: %d", &info->density) != 1) ret = -1; } else { ret = -1; } pclose(fp); return ret; } int main(int argc, char *argv[]) { int ret = -1; struct panel panel_remote = {0}; struct panel panel_local = {0}; struct panel panel_override = {0}; char buf[64] = {0}; while(1) { ret = get_remote_panel_info(&panel_remote); ret |= get_local_panel_info(&panel_local); get_override_panel_info(&panel_override); printf("remote:%d,%d,%d\n", panel_remote.width, panel_remote.height, panel_remote.density); printf("local:%d,%d,%d\n", panel_local.width, panel_local.height, panel_local.density); printf("override:%d,%d,%d\n", panel_override.width, panel_override.height, panel_override.density); if(ret != 0) { sleep(1); continue; } if(((panel_remote.width == panel_local.width) || (panel_remote.width == panel_override.width)) && ((panel_remote.height == panel_local.height) || (panel_remote.height == panel_override.height)) && ((panel_remote.density == panel_local.density) || (panel_remote.density == panel_override.density))) { printf("#### ok\n"); break; } /* setprop persist.vendor.framebuffer.main 1920x720p30 setprop persist.vendor.framebuffer.aux 1920x720p30 setprop persist.vendor.resolution.main 1920x720p30 setprop persist.vendor.resolution.aux 1920x720p30 wm size 1920x720 wm density 160 */ snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.framebuffer.main %dx%dp30", panel_remote.width, panel_remote.height); system(buf); snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.framebuffer.aux %dx%dp30", panel_remote.width, panel_remote.height); system(buf); snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.resolution.main %dx%dp30", panel_remote.width, panel_remote.height); system(buf); snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.resolution.aux %dx%dp30", panel_remote.width, panel_remote.height); system(buf); snprintf(buf, sizeof(buf), (char *)"wm size %dx%d", panel_remote.width, panel_remote.height); system(buf); snprintf(buf, sizeof(buf), (char *)"wm density %d", panel_remote.density); system(buf); } }
<完>