V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eyeshuaji
V2EX  ›  Android

懂 xposed 开发的大佬来指点下

  •  
  •   eyeshuaji · 2023-03-25 11:04:52 +08:00 · 10423 次点击
    这是一个创建于 639 天前的主题,其中的信息可能已经有所发展或是发生改变。
    xposed 怎么单独修改一个软件的 dpi?
    第 1 条附言  ·  2023-03-25 16:28:55 +08:00
    忘了讲了,其实我的意思是如果自己开发一个 xposed 模块,要怎么 hook 才能修改单个软件的 dpi
    14 条回复    2023-03-26 10:04:25 +08:00
    cxtrinityy
        1
    cxtrinityy  
       2023-03-25 11:20:33 +08:00 via Android
    Dpi 是物理参数吧,不是软件能改的。
    deng81416754
        2
    deng81416754  
       2023-03-25 11:54:01 +08:00
    @cxtrinityy 设置-开发者选项-最小宽度,我猜楼主说的是这个
    @eyeshuaji 我记得"应用伪装" 就能满足你的需求,里面直接就可以改,还不需要 xposed 框架,貌似和应用转生配合使用
    Serino
        3
    Serino  
       2023-03-25 14:41:23 +08:00   ❤️ 1
    试试 App Settings Reborn ,需要 Xposed/LSPosed ,可以修改单个 app 的 语言 /dpi 等等
    calloc
        4
    calloc  
       2023-03-25 17:06:56 +08:00 via iPhone
    只对单个应用注入
    eyeshuaji
        5
    eyeshuaji  
    OP
       2023-03-25 18:19:14 +08:00
    @calloc 大佬可以讲下代码方面大概怎么写吗
    tanranran
        6
    tanranran  
       2023-03-25 18:58:43 +08:00
    @cxtrinityy #1 root 后,可以改
    Bay0net
        7
    Bay0net  
       2023-03-25 20:39:54 +08:00   ❤️ 1
    我之前从来没接触过 AutoJS 和 Magisk 编程,我也不是一个程序员,
    但最近两个周,用 ChatGPT 写了一些相关的小工具,它提供的代码修改一下就可以直接使用。
    楼主的这个问题也可以尝试使用 ChatGPT ,下面是回复,自己改改就行了。

    BTW ,之前在 v2 上看过一句话,AI 不会让程序员失业,但是可能会让不会用 AI 的程序员失业,现在看来是真的。。

    --------------------------------------------
    Q:编写一个 xposed 模块,修改某个 APP 的 DPI

    A:以下是修改屏幕 DPI 的 Xposed 模块的基本步骤。需要注意的是,这种操作可能会导致一些不可预知的后果,同时涉及到隐私和安全问题,因此请谨慎操作。

    1.创建一个新的 Android Studio Gradle 工程,并在模块的 build.gradle 文件中引入 Xposed 框架的依赖库。

    2.创建一个新的类,最好继承自 XposedBridge 类并覆盖 handleLoadPackage 方法,以便您可以在该方法中处理新加载的应用程序。

    Copy code
    public class DPIModifyModule implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

    // Hook 目标应用程序的 ActivityThread 类
    if ("com.target.package.name".equals(loadPackageParam.packageName)) {
    XposedHelpers.findAndHookMethod("android.app.ActivityThread",
    loadPackageParam.classLoader, "currentActivityThread", new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    // 获取当前 ActivityThread 实例并 Hook 其 getDisplayMetrics 方法
    Object currentActivityThread = param.getResult();
    XposedHelpers.findAndHookMethod(currentActivityThread.getClass(),
    "getDisplayMetrics", new XC_MethodHook() {
    //在这里修改的屏幕密度
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    DisplayMetrics realMetrics = (DisplayMetrics) param.getResult();
    realMetrics.density = 1.5f;
    realMetrics.scaledDensity = 1.5f;
    realMetrics.densityDpi = DisplayMetrics.DENSITY_HIGH;
    }
    });
    }
    });
    }
    }
    }
    3.在 AndroidManifest.xml 文件中注册模块,并赋予适当的权限。

    Copy code
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dpimodifymodule"
    <application>
    <meta-data
    android:name="xposedmodule"
    android:value="true"
    />
    <meta-data
    android:name="xposeddescription"
    android:value="This module modifies DPI of the target app."
    />
    <meta-data
    android:name="xposedminversion"
    android:value="54"
    />
    </application>
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    </manifest>
    4.编译并打包该模块,并复制到目标设备中。在 Xposed Installer 中启用该模块后,重新启动目标应用程序,即可看到 DPI 已经被修改。

    需要注意的是,由于 Android 版本的不同,修改 DPI 的方式可能有所不同。此外,有可能出现一些应用程序会检测其自身 DPI 的情况,如果发现被修改,则无法使用。因此,在使用这种模块时,请务必先进行充分测试和评估,以确保您的行为符合相关规定并不会影响其他用户。
    scukmh
        8
    scukmh  
       2023-03-25 20:48:31 +08:00
    为什么不问问 chatgpt 呢?
    jdgui
        9
    jdgui  
       2023-03-25 22:00:49 +08:00
    由于涉及到特定技术和工具,我建议您在进行 xposed 模块的编写之前,先掌握以下基础知识和技能:

    掌握 Java 编程语言和 Android 开发基础知识;
    熟悉 Xposed 框架和 Hook 技术;
    熟悉 Android DPI 相关知识。
    接下来,我们来简单介绍一下如何编写一个 xposed 模块,修改某个 APP 的 DPI:

    下载 Xposed Installer ,并安装到您的 Android 手机上。具体安装步骤可以在网上查找相关教程。
    在 Android Studio 中创建一个新项目,并在项目中引入 Xposed SDK 。
    编写 Hook 代码,通过 Hook 某个 APP 的相关方法,实现修改 DPI 的功能。例如:
    XposedHelpers.findAndHookMethod("android.app.Activity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
    super.beforeHookedMethod(param);
    Object activity = param.thisObject;
    XposedHelpers.setIntField(activity, "mOverrideConfiguration.densityDpi", 240);
    XposedHelpers.callMethod(activity, "recreate");
    }
    });
    以上代码可以 Hook Activity 的 onCreate 方法,在该方法执行前修改 densityDpi 的值,再调用 recreate 方法使其生效。

    将编写好的代码打包成 APK 文件,并通过 Xposed Installer 安装到您的 Android 手机上。
    在 Xposed Installer 中启用该模块,并重启手机。
    打开需要修改 DPI 的 APP ,观察效果。
    需要注意的是,该方法可能会影响某些 APP 的正常使用。因此,应该在测试过程中注意观察和排除问题。
    这个是 gpt 的回答
    jdgui
        10
    jdgui  
       2023-03-25 22:06:47 +08:00
    要开发一个 xposed 模块来修改单个软件的 DPI ,可以通过 hook 被 hook 的软件的 WindowManager 类来实现。WindowManager 类是 Android 系统的一个重要组件,用于管理屏幕上的窗口,包括 Activity 、Dialog 、PopupWindow 等。其中,WindowManager.LayoutParams 类的实例用于设置窗口的一些属性,包括宽度、高度、位置等,以及 DPI ( densityDpi )。

    下面是一个简单的示例代码,演示了如何在 xposed 模块中 hook WindowManager 类,修改指定应用的 DPI:

    java
    Copy code
    import android.content.Context;
    import android.util.DisplayMetrics;
    import android.view.Display;
    import android.view.WindowManager;
    import de.robv.android.xposed.XC_MethodHook;
    import de.robv.android.xposed.XposedHelpers;

    public class MyAppDpiChanger implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
    if (!lpparam.packageName.equals("com.example.myapp")) {
    return;
    }

    // hook WindowManager 类
    XposedHelpers.findAndHookMethod(WindowManager.class, "getDefaultDisplay", new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    DisplayMetrics metrics = new DisplayMetrics();
    ((Display) param.getResult()).getMetrics(metrics);
    // 修改 DPI
    metrics.densityDpi = 240;
    // 设置修改后的 DisplayMetrics 对象
    XposedHelpers.setObjectField(metrics, "densityDpi", metrics.densityDpi);
    XposedHelpers.callMethod(param.getResult(), "getMetrics", metrics);
    }
    });
    }
    }
    上述代码中,我们首先判断当前加载的应用包名是否为需要修改 DPI 的应用("com.example.myapp"),如果不是则直接返回。接着,我们使用 XposedHelpers 工具类的 findAndHookMethod() 方法来 hook WindowManager 类的 getDefaultDisplay() 方法。在这个方法的执行完成之后,我们获取到当前屏幕的 DisplayMetrics 对象,并修改其 densityDpi 属性。最后,我们使用 XposedHelpers 工具类的 setObjectField() 方法和 callMethod() 方法分别设置和应用修改后的 DisplayMetrics 对象。

    需要注意的是,由于 DPI 的修改可能会导致应用的 UI 显示异常,因此修改 DPI 的操作应该谨慎进行,并在模拟器或测试设备上进行测试。
    winterbells
        11
    winterbells  
       2023-03-25 22:39:40 +08:00 via Android
    @Livid chatgpt 回复
    bs10081
        12
    bs10081  
       2023-03-26 00:20:49 +08:00 via iPhone
    Xposed ,記憶又被拉回到了刷機的年代,現在已經成為 Apple ecosystem 的一員了
    eyeshuaji
        13
    eyeshuaji  
    OP
       2023-03-26 00:25:39 +08:00
    看来 chatgpt 在这方面挺厉害的,可惜我找不到能用的 chatgpt ,也不想花钱买个美国号码注册账号😂
    calloc
        14
    calloc  
       2023-03-26 10:04:25 +08:00 via iPhone
    @eyeshuaji 就和普通的 Xposed 模块一样写,然后 handleLoadPackage 过滤包名,或者在 Lsposed 里只勾选只想修改 dpi 的应用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:13 · PVG 23:13 · LAX 07:13 · JFK 10:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.