2016-12-03 192 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