最先發表於個人部落格 guolei1130.github.io/
提起Xposed,大多數Android開發者都聽過或者用過,甚至有一些開發過比較炫酷的模組。這是我前段時間在公司的分享內容,分享給大家。
Xposed簡介
Xposed框架是一款可以在不修改APK的情況下影響程式執行(修改系統)的框架服務,基於它可以製作出許多功能強大的模組,且在功能不衝突的情況下同時運作。專案地址:github.com/rovo89 包括以下幾個部分:
- Xposed & android_art ,Xposed framework,核心
- XposedBridge java 部分的framework,我們開發模組要用到
- XposedInstaller 安裝器,用去安裝Xposed framework以及管理Xposed 模組
那麼,Xposed有什麼應用場景麼,就目前來說,我們耳熟能詳的應用場景就是搶紅包了,xposed的應用場景取決於我們的思維和想法。現在比較火的模組如搶紅包之類的,訊息防撤回、綠色守護、黑獄、小米去廣告等等。
如何使用Xposed
就目前的國內情況來講,要想用Xposed的話,我個人推薦小米手機。
- root
- 安裝Xposed,要找對應手機RAM對應Android版本的Xposed framework,可以去小米論壇上找
- 從酷安市場或者Xposed installer裡安裝自己喜歡的模組,
- 勾選,重啟生效
如何開發自己的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/…)
第二步,找到對應點選資料夾圖示的方法,我們直接在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這個倉庫,有需要的可以去拿。