提起Xposed,大多數Android開發者都聽過或者用過,甚至有一些開發過比較炫酷的模塊。這是我前段時間在公司的分享內容,分享給你們。java
Xposed框架是一款能夠在不修改APK的狀況下影響程序運行(修改系統)的框架服務,基於它能夠製做出許多功能強大的模塊,且在功能不衝突的狀況下同時運做。項目地址:github.com/rovo89 包括如下幾個部分:android
那麼,Xposed有什麼應用場景麼,就目前來講,咱們耳熟能詳的應用場景就是搶紅包了,xposed的應用場景取決於咱們的思惟和想法。如今比較火的模塊如搶紅包之類的,消息防撤回、綠色守護、黑獄、小米去廣告等等。git
就目前的國內狀況來說,要想用Xposed的話,我我的推薦小米手機。github
關於開發本身的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/…)框架
第二步,找到對應點擊文件夾圖標的方法,咱們直接在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這個倉庫,有須要的能夠去拿。