Xposed簡介以及小米去桌面廣告的簡單實現

全世界_Coder發表於2017-11-18

最先發表於個人部落格 guolei1130.github.io/

提起Xposed,大多數Android開發者都聽過或者用過,甚至有一些開發過比較炫酷的模組。這是我前段時間在公司的分享內容,分享給大家。

Xposed簡介

Xposed框架是一款可以在不修改APK的情況下影響程式執行(修改系統)的框架服務,基於它可以製作出許多功能強大的模組,且在功能不衝突的情況下同時運作。專案地址:github.com/rovo89 包括以下幾個部分:

  1. Xposed & android_art ,Xposed framework,核心
  2. XposedBridge java 部分的framework,我們開發模組要用到
  3. XposedInstaller 安裝器,用去安裝Xposed framework以及管理Xposed 模組

那麼,Xposed有什麼應用場景麼,就目前來說,我們耳熟能詳的應用場景就是搶紅包了,xposed的應用場景取決於我們的思維和想法。現在比較火的模組如搶紅包之類的,訊息防撤回、綠色守護、黑獄、小米去廣告等等。

如何使用Xposed

就目前的國內情況來講,要想用Xposed的話,我個人推薦小米手機。

  1. root
  2. 安裝Xposed,要找對應手機RAM對應Android版本的Xposed framework,可以去小米論壇上找
  3. 從酷安市場或者Xposed installer裡安裝自己喜歡的模組,
  4. 勾選,重啟生效

如何開發自己的Xposed模組

關於開發自己的Xposed模組,在Xposed專案的wiki中,有很詳細的介紹,並且開發Xposed模組的話確實比較簡單,難點在於找到你想實現功能的切入點,我們這裡以去掉小米桌面的廣告為例。關於如何開發Xposed模組,前往Xposed Wiki 檢視學習

要想實現去廣告,首先我們需要想一些辦法,我最初想到的辦法是從廣告的Api入手,替換掉url地址,經過試驗,失敗了。但是發現,小米桌面資料夾(就那個好幾個app放在一起的地方)有個隱藏的功能,修改名稱的時候,下面有個是否推薦那個,這裡可以關掉廣告,所以,從這裡入手。

第一步,我們需要拿到小米Home的程式碼,這個對於我們root了的手機,簡單的很,不過,這裡我們要對程式碼進行一些操作,因為我們能拿到的是odex檔案,我們要將其轉化為jar檔案,轉換過程odex->smail->dex->jar,這裡我們藉助兩個開源專案可以輕鬆完成。github.com/JesusFreke/… (bitbucket.org/JesusFreke/…)

github.com/pxb1988/dex…

第二步,找到對應點選資料夾圖示的方法,我們直接在Launcher中搜尋openF(older),關於Launcher,這裡不多說。我們能搜尋到如下程式碼。


  public void openFolder(FolderInfo paramFolderInfo, View paramView)
  {
    this.mFolderClosingInNormalEdit = false;
    this.mWorkspace.post(new Runnable(this, paramFolderInfo)
    {
      public void run()
      {
        if (Launcher.access$1100(this.this$0).isOpened())
          return;
        Launcher.access$3702(this.this$0, false);
        ShortcutIcon.setEnableLoadingAnim(true);
        Launcher.access$1100(this.this$0).bind(this.val$folderInfo);
        Launcher.access$1100(this.this$0).open();
        this.this$0.updateStatusBarClock();
        Launcher.access$3800(this.this$0).cancel();
        if ((this.this$0.isInNormalEditing()) || (this.this$0.isSceneShowing()))
          Launcher.access$3800(this.this$0).setDuration(Folder.DEFAULT_FOLDER_BACKGROUND_SHORT_DURATION);
        while (true)
        {
          do
          {
            Launcher.access$3800(this.this$0).setFloatValues(new float[] { 0F, 1F });
            Launcher.access$3800(this.this$0).setInterpolator(new CubicEaseInOutInterpolater());
            Launcher.access$3800(this.this$0).start();
          }
          while (this.this$0.isInEditing();
          this.val$folderInfo.onLaunch();
          LauncherModel.updateItemFlagAndLaunchCount(this.this$0, this.val$folderInfo);
          return;
          Launcher.access$3800(this.this$0).setDuration(Folder.DEFAULT_FOLDER_OPEN_DURATION);
        }
      }
    });
  }複製程式碼

我們這裡,能發現FolderInfo這個類作為了一個引數,很明顯,這是描述Folder的資訊的,那麼是否推薦這個屬性,一定是在這裡面了。我們進去看看。

在這裡搜尋recommend,我們能發現這麼一個變數。

private boolean mEnbaleRecommendAppsView = false;複製程式碼

細心的同學發現他這個變數名是不是手抖了。。。

private?那麼,我們不管三七二十一,直接幹掉get方法,直接返回false是不是就可以實現呢?嘗試一波,寫下如下程式碼。

public class XposedDemo implements IXposedHookLoadPackage {
    private static final String TAG = "myxposed";

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        Log.e(TAG, "handleLoadPackage: " + lpparam.packageName + "----->" + lpparam.appInfo.sourceDir);
        if (lpparam.packageName.equals("com.miui.home")) {
            Log.e(TAG, "handleLoadPackage: " + "miui.home ");

            findAndHookMethod("com.miui.home.launcher.FolderInfo", lpparam.classLoader, "isRecommendAppsViewEnable", Context.class, new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    Log.e(TAG, "replaceHookedMethod: " + "被呼叫了");
                    return false;
                }
            });
        }
    }
}複製程式碼

安裝,勾選,重啟。然後點開資料夾,發現,舒服的很,確實沒了,在編輯資料夾屬性,把這個推薦開啟,哈,還是沒有。果然,我們成功了。

最後

有沒有學到呢?我把小米Home的jar包以及當時做的簡陋的ppt放在了 blog_resource這個倉庫,有需要的可以去拿。

相關文章