一、 准备
- 要去广告的app: 追杀神器3.75
- 反编译工具: AndroidKiller1.3.1
- 查看布局工具: UIAnimationView
- 查看源码好工具: jadx
工具和例子源码打包链接:http://pan.baidu.com/s/1eSv6WpW 密码:ofe4
uiautomatorviewer在sdk的tool目录下,运行uiautomatorviewer.bat即可。
源码只有第一个例子
二、 思路
获取到广告控件,隐藏广告控件。
要去除的有: 首页的游戏中心(其余的广告自己尝试)
三、 分析宿主app
1. 获取控件类型和id
安装打开追书神器,利用UIAnimationView获取界面。
可以看到游戏中心控件是一个ImageView,id是home_action_menu_game
2. 获取所在类
利用反编译工具,我这里是AndroidKill1.3.1,反编译追书神器,可以知道追书神器的包名为com.ushaqi.zhuishushenqi,然后搜索home_action_menu_game,在public.xml可以看到控件的id:
再搜索这个id,可以看到调用类为HomeActivity,路径为.ui.home.HomeActivity
3. 获取控件实例
点击编辑器上部的java图标查看源码,把控件id转为十进制,ctrl+F进行搜索,获取对应的控件实例,这里看到为r
ps: AndroidKiller查看源码用的是dex2jar,这个工具有点鸡肋,所以推荐使用jadx或者jeb,用过都说屌
四、 编写Xposed插件
上面已经获取到类路径,和控件实例,接下来写插件。
1. 建立插件项目
利用AnrdoidStudio新建一个项目为去TM追书广告,把库和入口文件写好(不会的看我第一篇文章:)
2. 编写hook方法
直接贴代码:
package com.tpnet.testxposed;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Main implements IXposedHookLoadPackage {
//要hook的应用的包名
private String packet = "com.ushaqi.zhuishushenqi";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//不是追书神器就不hook了
if (!loadPackageParam.packageName.equals(packet)) {
return;
}
XposedBridge.log("开始hook追书神器");
XposedHelpers.findAndHookMethod(packet + ".ui.home.HomeActivity", loadPackageParam.classLoader,
"onCreate",
Bundle.class,
new XC_MethodHook() {
/**
* onCreate之后把按钮隐藏掉
* @param param
* @throws Throwable
*/
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//这个是我打包的一个方法
ImageView image = HookUtils.getHookView(param,"r");
// 设置属性,隐藏这个imageView
if (image != null) {
XposedBridge.log("开始去除游戏中心");
//这里隐藏游戏中心这个ImageView
image.setVisibility(View.GONE);
}
}
}
);
}
}
getHookView 的源码,上一篇有说,就是获取控件:
public static <T> T getHookView(XC_MethodHook.MethodHookParam param,String name) throws NoSuchFieldException, IllegalAccessException {
Class clazz = param.thisObject.getClass();
// 通过反射获取控件,无论parivate或者public
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
return (T) field.get(param.thisObject);
}
3. 安装运行
安装后,在xposed勾选,重启。再打开追书神器是不是发现游戏中心的按钮不见了。
五、去除发现Tab的内容
去除 发现tab第4个item之后的内容
1. 查看控件布局
这里发现是一个ScrollView包裹LinearLayout,LinearLayout有Id,下面的frameLayout没有id,大概可以确定是通过addView来添加每个item,接下来看看源码验证。
2. 寻找控件
和之前一样,利用AndroidKiller搜索id,看在那个文件使用。查看到id是home_find_container,路径是ui.home.HomeFindFragment,这次利用jadx查看逻辑代码:
3. 编写插件
好了,和之前的推测是一致的,现在来继续编写插件,获取到控件实例,把5以前的都remove掉。
XposedHelpers.findAndHookMethod(packet + ".ui.home.HomeFindFragment", loadPackageParam.classLoader,
"a", //hook a方法
Activity.class, //参数
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//获取内容LinearLayout
LinearLayout linear = HookUtils.getHookView(param,"a");
if (linear != null) {
XposedBridge.log("开始去除item");
for(int i= linear.getChildCount()-1; i>4 ;i--){
linear.removeViewAt(i);
}
}
}
}
);
结果:
六、 去除第一屏等待
把第一屏的延迟设置为0秒
XposedHelpers.findAndHookMethod(packet + ".ui.SplashActivity", loadPackageParam.classLoader,
"a", //hooka方法
long.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0] = 0; //把延迟秒数设置为0秒
}
}
);