Xposed简介以及小米去桌面广告的简单实现
提起Xposed,大多數Android開發者都聽過或者用過,甚至有一些開發過比較炫酷的模塊。這是我前段時間在公司的分享內容,分享給大家。
#最先發表于個人博客 https://guolei1130.github.io/
Xposed簡介
Xposed框架是一款可以在不修改APK的情況下影響程序運行(修改系統)的框架服務,基于它可以制作出許多功能強大的模塊,且在功能不沖突的情況下同時運作。項目地址:https://github.com/rovo89 包括以下幾個部分:
那么,Xposed有什么應用場景么,就目前來說,我們耳熟能詳的應用場景就是搶紅包了,xposed的應用場景取決于我們的思維和想法。現在比較火的模塊如搶紅包之類的,消息防撤回、綠色守護、黑獄、小米去廣告等等。
如何使用Xposed
就目前的國內情況來講,要想用Xposed的話,我個人推薦小米手機。
如何開發自己的Xposed模塊
關于開發自己的Xposed模塊,在Xposed項目的wiki中,有很詳細的介紹,并且開發Xposed模塊的話確實比較簡單,難點在于找到你想實現功能的切入點,我們這里以去掉小米桌面的廣告為例。關于如何開發Xposed模塊,前往Xposed Wiki 查看學習
要想實現去廣告,首先我們需要想一些辦法,我最初想到的辦法是從廣告的Api入手,替換掉url地址,經過試驗,失敗了。但是發現,小米桌面文件夾(就那個好幾個app放在一起的地方)有個隱藏的功能,修改名稱的時候,下面有個是否推薦那個,這里可以關掉廣告,所以,從這里入手。
第一步,我們需要拿到小米Home的代碼,這個對于我們root了的手機,簡單的很,不過,這里我們要對代碼進行一些操作,因為我們能拿到的是odex文件,我們要將其轉化為jar文件,轉換過程odex->smail->dex->jar,這里我們借助兩個開源項目可以輕松完成。https://github.com/JesusFreke/smali (https://bitbucket.org/JesusFreke/smali/downloads/)
https://github.com/pxb1988/dex2jar
第二步,找到對應點擊文件夾圖標的方法,我們直接在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";@Overridepublic 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() {@Overrideprotected Object replaceHookedMethod(MethodHookParam param) throws Throwable {Log.e(TAG, "replaceHookedMethod: " + "被調用了");return false;}});}}} |
安裝,勾選,重啟。然后點開文件夾,發現,舒服的很,確實沒了,在編輯文件夾屬性,把這個推薦打開,哈,還是沒有。果然,我們成功了。
最后
有沒有學到呢?我把小米Home的jar包以及當時做的簡陋的ppt放在了 blog_resource這個倉庫,有需要的可以去拿。
https://guolei1130.github.io/2017/11/18/Xposed%E7%AE%80%E4%BB%8B%E4%BB%A5%E5%8F%8A%E5%B0%8F%E7%B1%B3%E5%8E%BB%E6%A1%8C%E9%9D%A2%E5%B9%BF%E5%91%8A%E7%9A%84%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0/
總結
以上是生活随笔為你收集整理的Xposed简介以及小米去桌面广告的简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析Android插件化
- 下一篇: 滴滴开源Android插件化框架Virt