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

最早發表於我的博客 guolei1130.github.io/

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

Xposed簡介

Xposed框架是一款能夠在不修改APK的狀況下影響程序運行(修改系統)的框架服務,基於它能夠製做出許多功能強大的模塊,且在功能不衝突的狀況下同時運做。項目地址:github.com/rovo89 包括如下幾個部分:android

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

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

如何使用Xposed

就目前的國內狀況來說,要想用Xposed的話,我我的推薦小米手機。github

  1. root
  2. 安裝Xposed,要找對應手機RAM對應Android版本的Xposed framework,能夠去小米論壇上找
  3. 從酷安市場或者Xposed installer裏安裝本身喜歡的模塊,
  4. 勾選,重啓生效

如何開發本身的Xposed模塊

關於開發本身的Xposed模塊,在Xposed項目的wiki中,有很詳細的介紹,而且開發Xposed模塊的話確實比較簡單,難點在於找到你想實現功能的切入點,咱們這裏以去掉小米桌面的廣告爲例。關於如何開發Xposed模塊,前往Xposed Wiki 查看學習bash

要想實現去廣告,首先咱們須要想一些辦法,我最初想到的辦法是從廣告的Api入手,替換掉url地址,通過試驗,失敗了。可是發現,小米桌面文件夾(就那個好幾個app放在一塊兒的地方)有個隱藏的功能,修更名稱的時候,下面有個是否推薦那個,這裏能夠關掉廣告,因此,從這裏入手。app

第一步,咱們須要拿到小米Home的代碼,這個對於咱們root了的手機,簡單的很,不過,這裏咱們要對代碼進行一些操做,由於咱們能拿到的是odex文件,咱們要將其轉化爲jar文件,轉換過程odex->smail->dex->jar,這裏咱們藉助兩個開源項目能夠輕鬆完成。github.com/JesusFreke/… (bitbucket.org/JesusFreke/…)框架

github.com/pxb1988/dex…ide

第二步,找到對應點擊文件夾圖標的方法,咱們直接在Launcher中搜索openF(older),關於Launcher,這裏很少說。咱們能搜索到以下代碼。post

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這個倉庫,有須要的能夠去拿。

相關文章
相關標籤/搜索