Android 16安兔兔分辨率作假显示(非修改TextView方案)

在我们做客制化android系统中经常会碰到这样的需求,屏的实际尺寸是12.2英寸,但在安兔兔或者其他设备信息检测类app中显示的却不是这个数,而是比他小的数,如5.66英寸,或者6.56英寸,就像下面这样

那么我们有没有什么方法实现不修改TextView来实现这个需求呢,答案是有的。

本篇文章也是借鉴两位大佬的思路来的,在这里要先感谢两位大佬:
Android 14 修改安兔兔等三方工具显示的屏幕尺寸
RK3588S Android12修改安兔兔等读到的屏幕尺寸大小

framework修改patch:

java 复制代码
diff --git a/sys/frameworks/base/core/java/android/view/DisplayInfo.java b/sys/frameworks/base/core/java/android/view/DisplayInfo.java
index bf000d5fa39..f25b00f5aad 100644
--- a/sys/frameworks/base/core/java/android/view/DisplayInfo.java
+++ b/sys/frameworks/base/core/java/android/view/DisplayInfo.java
@@ -923,6 +923,18 @@ public final class DisplayInfo implements Parcelable {
         outMetrics.xdpi = outMetrics.noncompatXdpi = physicalXDpi;
         outMetrics.ydpi = outMetrics.noncompatYdpi = physicalYDpi;
 
+        //三方检测app屏幕尺寸数据修正 add by lyw
+        if (width < height) {//竖屏 width == 1600 && height == 2400
+            outMetrics.xdpi = 597.65f;
+            outMetrics.ydpi = 201.63f;
+        } else if (width > height) {//横屏 width == 2400 && height == 1600
+            outMetrics.xdpi = 597.65f;
+            outMetrics.ydpi = 138.89f;
+        } else {
+            outMetrics.xdpi = outMetrics.noncompatXdpi = physicalXDpi;
+            outMetrics.ydpi = outMetrics.noncompatYdpi = physicalYDpi;
+        }
+
         final Rect appBounds = configuration != null
                 ? configuration.windowConfiguration.getAppBounds() : null;
         width = appBounds != null ? appBounds.width() : width;

xdpi来源:

安兔兔(整数,不精确),或者通过在上述类DisplayInfo中用日志的方式打印出来(带5位小数,更精确,推荐)

ydpi来源:

使用如下java代码生成。将如下代码复制到 IntelliJ IDEA 2024.3.5 (Community Edition) 中并修改main方法中的尺寸、分辨率、xdpi,然后Run就能生成ydpi了

java 复制代码
package cn.incartech;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Main {
    public static class Point {
        public int x;
        public int y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    private static double calculateSize(Point screenSize, double xdpi, double ydpi) {
        double sqrt = Math.sqrt(Math.pow(screenSize.x / xdpi, 2) + Math.pow(screenSize.y / ydpi, 2));
        return new BigDecimal(Double.toString(sqrt)).setScale(3, RoundingMode.HALF_UP).doubleValue();
    }

    public static float getYdpi(Point screenSize, double targetSize, float xdpi) {
        double y = 0.01;
        double calculatedSize;
        do {
            y += 0.01;
            calculatedSize = calculateSize(screenSize, xdpi, y);
        } while (Math.abs(calculatedSize - targetSize) >= 0.001);
        return (float) y;
    }

    private static void calculateYdpi(double targetSize, int width, int height, float xdpi) {
        System.out.println("----------------- start calculate -----------------");
        System.out.println("要在安兔兔中显示的尺寸为:" + targetSize);
        System.out.println("屏实际分辨率为:" + width + " x " + height);
        try {
            int screenWidth;
            int screenHeight;
            screenWidth = width;
            screenHeight = height;
            if (screenWidth < screenHeight) {
                System.out.println("开始计算竖屏参数...");
            } else {
                System.out.println("开始计算横屏参数...");
            }
            Point screenSize = new Point(screenWidth, screenHeight);
            float ydpi = getYdpi(screenSize, targetSize, xdpi);
            String result = String.format("xdpi: %.2f, ydpi: %.2f", xdpi, ydpi);
            System.out.println((screenWidth < screenHeight ? "竖屏参数" : "横屏参数") + " result = " + result);
        } catch (NumberFormatException e) {
            System.out.println(e);
        }
    }

    /**
     * xdpi参数来源(打印出来就行了,或者直接用安兔兔的):
     * 类-->frameworks\base\core\java\android\view\DisplayInfo.java
     * 方法-->private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfo compatInfo, Configuration configuration, int width, int height)
     *
     * @param args
     */
    public static void main(String[] args) {
        /**
         * 结果示例:
         * ----------------- start calculate -----------------
         * 要在安兔兔中显示的尺寸为:12.2
         * 屏实际分辨率为:1600 x 2400
         * 开始计算竖屏参数...
         * 竖屏参数 result = xdpi: 597.65, ydpi: 201.63
         */
        calculateYdpi(12.2, 1600, 2400, 597.64703f);
        /**
         * 结果示例:
         * ----------------- start calculate -----------------
         * 要在安兔兔中显示的尺寸为:12.2
         * 屏实际分辨率为:2400 x 1600
         * 开始计算横屏参数...
         * 横屏参数 result = xdpi: 597.65, ydpi: 138.89
         */
        calculateYdpi(12.2, 2400, 1600, 597.64703f);
    }
}

将xdpi、ydpi填入到前述patch中就能实现三方检测apk检测的屏幕尺寸与预期一致

----------------- 验证结果 修改前 -----------------

竖屏:

横屏

----------------- 验证结果 修改后 -----------------

竖屏:

横屏:

相关推荐
游戏开发爱好者82 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20352 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥3 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓3 小时前
[JDBC]元数据
android
独行soc3 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能3 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿3 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc4 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20354 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106324 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview