提起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这个仓库,有须要的能够去拿。