Xposed框架如何修改Android状态栏?
问题描述:
Xposed框架中名为“网络速度指示器”的应用程序可以在android状态栏上显示网速。如何实现这一目标?Xposed框架如何修改Android状态栏?
我抬头看了其他一些像这样的问题Customizing android status bar。它说:“这与android开发无关,它相当于android黑客入侵。但是它真的很简单,你需要root,pull framework-res.apk设备,解压缩它(7Zip或WinRar),并且你有大量的pngs,你只需要编辑它们并重新安装apk,签名并将其推送到设备并重新启动。
xposed也是这样做的吗?
答
Xposed实际工作中更有趣的方式,它通过添加一个罐子(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar
要准确),它允许您“挂钩”,以任何方法调用修改/system/bin/app_process
。基本上,你可以在任何方法之前或之后运行你自己的代码。下面是the GitHub page一些示例代码:
package de.robv.android.xposed.mods.tutorial;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import android.graphics.Color;
import android.widget.TextView;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.android.systemui"))
return;
findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
TextView tv = (TextView) param.thisObject;
String text = tv.getText().toString();
tv.setText(text + " :)");
tv.setTextColor(Color.RED);
}
});
}
}
这挂接到系统UI时钟更新方法,并增加了:)
的时间,再加上使文本显示为红色。希望这可以让你对Xposed的工作方式有所了解。
有意义的好处是你不会取代原来的应用程序,所以不需要解压缩符号推送程序。只要有原始的应用程序,Xposed框架和你的模块。
编辑此外,只是解压缩和替换PNG不会让你访问工作代码,这就是为什么在状态栏中的网络速度是需要你使用Xposed的 - 你必须“深入”代码创建状态栏中显示的文本。
谢谢!在我完成开发教程后,它更加清晰,但“钩子”机制的工作方式仍然让我感到困惑。我认识到在jni中实现了钩子。我是否应该学习其他知识来理解这种机制? – Zhang