环境
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=800persist.panel.height=480persist.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 1920x720p30setprop persist.vendor.framebuffer.aux 1920x720p30setprop persist.vendor.resolution.main 1920x720p30setprop persist.vendor.resolution.aux 1920x720p30wm size 1920x720wm 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);} }
<完>