2016-12-03 57 views
0

Xposed框架中名为“网络速度指示器”的应用程序可以在android状态栏上显示网速。如何实现这一目标?Xposed框架如何修改Android状态栏?

我抬头看了其他一些像这样的问题Customizing android status bar。它说:“这与android开发无关,它相当于android黑客入侵。但是它真的很简单,你需要root,pull framework-res.apk设备,解压缩它(7Zip或WinRar),并且你有大量的pngs,你只需要编辑它们并重新安装apk,签名并将其推送到设备并重新启动。

xposed也是这样做的吗?

回答

0

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的 - 你必须“深入”代码创建状态栏中显示的文本。

+0

谢谢!在我完成开发教程后,它更加清晰,但“钩子”机制的工作方式仍然让我感到困惑。我认识到在jni中实现了钩子。我是否应该学习其他知识来理解这种机制? – Zhang