懂 xposed 开发的大佬来指点下

2023-03-25 11:04:52 +08:00
 eyeshuaji
xposed 怎么单独修改一个软件的 dpi?
10425 次点击
所在节点    Android
14 条回复
cxtrinityy
2023-03-25 11:20:33 +08:00
Dpi 是物理参数吧,不是软件能改的。
deng81416754
2023-03-25 11:54:01 +08:00
@cxtrinityy 设置-开发者选项-最小宽度,我猜楼主说的是这个
@eyeshuaji 我记得"应用伪装" 就能满足你的需求,里面直接就可以改,还不需要 xposed 框架,貌似和应用转生配合使用
Serino
2023-03-25 14:41:23 +08:00
试试 App Settings Reborn ,需要 Xposed/LSPosed ,可以修改单个 app 的 语言 /dpi 等等
calloc
2023-03-25 17:06:56 +08:00
只对单个应用注入
eyeshuaji
2023-03-25 18:19:14 +08:00
@calloc 大佬可以讲下代码方面大概怎么写吗
tanranran
2023-03-25 18:58:43 +08:00
@cxtrinityy #1 root 后,可以改
Bay0net
2023-03-25 20:39:54 +08:00
我之前从来没接触过 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
2023-03-25 20:48:31 +08:00
为什么不问问 chatgpt 呢?
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
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
2023-03-25 22:39:40 +08:00
@Livid chatgpt 回复
bs10081
2023-03-26 00:20:49 +08:00
Xposed ,記憶又被拉回到了刷機的年代,現在已經成為 Apple ecosystem 的一員了
eyeshuaji
2023-03-26 00:25:39 +08:00
看来 chatgpt 在这方面挺厉害的,可惜我找不到能用的 chatgpt ,也不想花钱买个美国号码注册账号😂
calloc
2023-03-26 10:04:25 +08:00
@eyeshuaji 就和普通的 Xposed 模块一样写,然后 handleLoadPackage 过滤包名,或者在 Lsposed 里只勾选只想修改 dpi 的应用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/927037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX