一、 准备

  • 要去广告的app: 追杀神器3.75
  • 反编译工具: AndroidKiller1.3.1
  • 查看布局工具: UIAnimationView
  • 查看源码好工具: jadx

工具和例子源码打包链接:http://pan.baidu.com/s/1eSv6WpW 密码:ofe4
uiautomatorviewer在sdk的tool目录下,运行uiautomatorviewer.bat即可。
源码只有第一个例子

二、 思路

获取到广告控件,隐藏广告控件。
要去除的有: 首页的游戏中心(其余的广告自己尝试)

三、 分析宿主app

1. 获取控件类型和id

安装打开追书神器,利用UIAnimationView获取界面。

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_sed


可以看到游戏中心控件是一个ImageView,id是home_action_menu_game

2. 获取所在类

利用反编译工具,我这里是AndroidKill1.3.1,反编译追书神器,可以知道追书神器的包名为com.ushaqi.zhuishushenqi,然后搜索home_action_menu_game,在public.xml可以看到控件的id:

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_Android开发跳过广告怎么实现方法_02


再搜索这个id,可以看到调用类为HomeActivity,路径为.ui.home.HomeActivity

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_android_03

3. 获取控件实例

点击编辑器上部的java图标查看源码,把控件id转为十进制,ctrl+F进行搜索,获取对应的控件实例,这里看到为r

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_sed_04

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_android_05

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勾选,重启。再打开追书神器是不是发现游戏中心的按钮不见了。

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_sed_06

五、去除发现Tab的内容

去除 发现tab第4个item之后的内容

1. 查看控件布局

这里发现是一个ScrollView包裹LinearLayout,LinearLayout有Id,下面的frameLayout没有id,大概可以确定是通过addView来添加每个item,接下来看看源码验证。

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_android_07

2. 寻找控件

和之前一样,利用AndroidKiller搜索id,看在那个文件使用。查看到id是home_find_container,路径是ui.home.HomeFindFragment,这次利用jadx查看逻辑代码:

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_Android开发跳过广告怎么实现方法_08

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);
                            }
                        }
                    }
                }
        );

结果:

Android开发跳过广告怎么实现方法 安卓自动跳过广告插件_控件_09

六、 去除第一屏等待

把第一屏的延迟设置为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秒
                    }
                }
        );