本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次。

前面有篇文章已经介绍了如何创建Xposed模块的文章了,这篇就让我们来实现一个简单的去除启动广告的功能吧。

起因

为什么要是要去掉微博国际版的开屏广告呢,因为广告烦人啊,而且我打开微博的时间也是偶尔才会打开的,每次一打开就能看到广告,所以就想把这个开屏广告给删掉,奇怪的是,打开一次后,再关掉再打开是没有广告的,要隔一段时候才会出现广告,这个原因会在下面解释。

实践

查找启动Activity

首先我们先拿到微博国际版的apk,apk的版本是2.5.7-5。

然后拉到Android Studio里面,然后点击AndroidManifest.xml文件,然后搜索android.intent.category.LAUNCHER,找到启动的Activity,在这里我们找到Activity是com.weico.international.activity.LogoActivity

反编译classes.dex

在这里所用到的反编译工具都是可以在网上找到,工具为dex2jar和jd-gui,大家自行搜索下载。

找到了启动的Activity后呢,我们就要将apk给反编译,把里面的classes.dex文件提取出来,首先将微博国际版的apk后缀改为.zip,然后打开

然后将里面的两个dex文件,拷贝出来,放到dex2jar目录里面,然后拖两个文件到dex2jar.bat上面,让其转换成jar文件

转换过程

转换完成之后会出现classes_dex2jar.jar和classes2_dex2jar.jar两个文件

然后我们用jd-gui打开这两个jar文件,然后找到LogoActivity

查找广告

使用jd-gui打开LogoActivity之后,我们就要在里面查找广告相关的内容了,我们搜索ad,最后找到loginOrGlance方法和openGDTAD方法。

通过下面代码可以看出,真正显示广告的是openGDTAD方法,而loginOrGlance方法则是判断当前启动是否需要显示广告,这下找到源头就好办了。

private void loginOrGlance()

{

if (!Setting.getInstance().loadBoolean("first_open_guide"))

{

Setting.getInstance().saveBoolean("first_open_guide", true);

startActivityForResult(new Intent(this.me, GuideActivity.class), 1025);

return;

}

if (AccountsStore.getCurAccount() != null)

{

if (Setting.getInstance().loadInt("display_ad") == 1)

{

if (System.currentTimeMillis() - Setting.getInstance().loadLong("ad_display_time") > ProcessMonitor.repeatedTime)

{

openGDTAD();

return;

}

initMainTabActivity();

return;

}

initMainTabActivity();

return;

}

initGuestActivity();

}

// 加载广告

private void openGDTAD()

{

getWindow().getDecorView().postDelayed(new Runnable()

{

public void run()

{

WIActions.startActivityWithAction(new Intent(LogoActivity.this.me, NewSplashActivity.class), Constant.Transaction.GROW_FADE);

LogoActivity.this.finish();

}

}

, 600L);

}

广告间隔出现原因

前面我们说过启动一次出现广告后,要隔一段时候才会重新出现广告,上面的代码System.currentTimeMillis() - Setting.getInstance().loadLong("ad_display_time") > ProcessMonitor.repeatedTime,这里就是原因,当前时间跟上一次显示广告的时间相差超过ProcessMonitor.repeatedTime的值的时候,就会出现广告。

我们来看一下repeatedTime的值是多少,进到ProcessMonitor类里面,值为1800000毫秒,也就是30分钟才出现一次广告,比起那些每次打开都会出现广告的好多了,但是也阻挡不了我干掉广告。

显示广告条件

我们来看loginOrGlance方法里面的广告相关代码

if (Setting.getInstance().loadInt("display_ad") == 1)

{

if (System.currentTimeMillis() - Setting.getInstance().loadLong("ad_display_time") > ProcessMonitor.repeatedTime)

{

openGDTAD();

return;

}

initMainTabActivity();

return;

}

initMainTabActivity();

return;

可以看出,首先先判断display_ad的值是否为1,如果不为1,就直接调用启动主界面的initMainTabActivity()方法。

如果为1,在继续判断上一次显示广告的时间ad_display_time是否超过30分钟,如果超过就显示,没有超过就启动主界面。

所以,显示广告有两个条件

display_ad的值为1

上一次显示广告的时间和现在的时间相差30分钟

Hook方法

这里我们来介绍一下Hook所用到的一下Xposed里面的方法

findAndHookMethod方法,其参数对应为加载的类(Class>) + 方法名 + 参数类型(根据所Hook方法的参数的类型,即有多少个写多少个,加上.class) + XC_MethodHook回调接口。

XC_MethodHook中定义了回调方法:

beforeHookedMethod(MethodHookParam param):被hook方法调用前执行,调用param.setResult可以跳过被Hook的方法。

afterHookedMethod(MethodHookParam param) : 被Hook方法调用后执行,调用param.setResult更改被hook方法的执行结果。

通过上面分析,我们知道了所需要的Hook的两个方法,这两个值居然是存到本地SharedPreferences里面,那么我们修改就更容易了。

一个是Setting.getInstance().loadInt("display_ad"),既是Setting类里面的loadInt方法。

public int loadInt(String paramString)

{

return this.mSharedPreferences.getInt(paramString, -1);

}

一个是Setting.getInstance().loadLong("ad_display_time"),既是Setting类里面的loadLong方法。

public long loadLong(String paramString)

{

return this.mSharedPreferences.getLong(paramString, -1L);

}

验证

首先我们来验证一下我们上面的两个条件是否正确,打开我们的Tutorial类,在handleLoadPackage方法里面实现我们的Hook。

我们先验证30分钟出现的条件,既然是要超过30分钟,那么我们只需要将loadLong("ad_display_time")返回的值改为-1L,也就是afterHookedMethod(MethodHookParam param)方法里面修改,就可以实现每次启动都能出现广告界面了

public class Tutorial implements IXposedHookLoadPackage {

@Override

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

// 只对微博国际版进行操作

if (lpparam.packageName.equals("com.weico.international")) {

try {

// 获取Setting类

Class> aClass = XposedHelpers.findClassIfExists("com.weico.international.activity.v4.Setting", lpparam.classLoader);

if (aClass == null) {

return;

}

// Hook方法

XposedHelpers.findAndHookMethod(aClass, "loadLong", String.class, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

String param1 = (String) param.args[0];

// 如果参数为ad_display_time的时候将返回值改为-1L

if (!TextUtils.isEmpty(param1) && param1.equals("ad_display_time")) {

Log.e("info", "com.weico.international---loadLong---ad_display_time");

param.setResult(-1L);

}

}

});

} catch (Throwable t) {

XposedBridge.log("Hook出错" + t);

}

}

}

}

接着运行重启手机,开机后,打开微博国际版。

可以看出,现在每次打开都会有广告,证明我们的猜测是正确的。

去除广告

我们只需要将Setting.getInstance().loadInt("display_ad")的返回值改为-1就能实现去除广告的效果了,下面看代码

public class Tutorial implements IXposedHookLoadPackage {

@Override

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

// 只对微博国际版进行操作

if (lpparam.packageName.equals("com.weico.international")) {

try {

Class> aClass = XposedHelpers.findClassIfExists("com.weico.international.activity.v4.Setting", lpparam.classLoader);

if (aClass == null) {

return;

}

// Hook loadInt方法

XposedHelpers.findAndHookMethod(aClass, "loadInt", String.class, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

String param1 = (String) param.args[0];

// 如果参数为display_ad的时候将返回值改为-1

if (!TextUtils.isEmpty(param1) && param1.equals("display_ad")) {

Log.e("info", "com.weico.international---loadInt---display_ad");

param.setResult(-1);

}

}

});

// Hook loadLong方法

XposedHelpers.findAndHookMethod(aClass, "loadLong", String.class, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

String param1 = (String) param.args[0];

// 如果参数为ad_display_time的时候将返回值改为当前时间

if (!TextUtils.isEmpty(param1) && param1.equals("ad_display_time")) {

Log.e("info", "com.weico.international---loadLong---ad_display_time");

param.setResult(System.currentTimeMillis());

}

}

});

} catch (Throwable t) {

XposedBridge.log("Hook出错" + t);

}

}

}

}

接着运行重启手机,开机后,打开微博国际版。

可以看出,再也没有广告了。

总结

这次使用Xposed实践,来去除微博国际版的启动广告,可以说是收获挺大的,Hook到所调用的方法,然后里面进行我们自己的操作,关键就是在于beforeHookedMethod和afterHookedMethod这两个方法里面实现的操作。

Github

Github地址在此奉上:XposedRemoveAd,欢迎star

微博 Android 启动广告,使用Xposed去除微博国际版的启动广告相关推荐

  1. 使用Xposed去除微博国际版的启动广告

    本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次. 前面有篇文章已经介绍了如何创建Xposed模块的文章了,这篇就让我们来实现一个简单的去除启动广告的功能吧. 起因 为什么要是要去掉微博国际版 ...

  2. android 微信 去广告插件,Xposed去除微信朋友圈广告

    一.背景:最近发现微信朋友圈的广告有点多,有时前十条就出现2条广告,还是针对性投放的,于是想着怎么去除广告. 本次研究用的是微信谷歌商店版,版本名是7.0.0,版本号是1363,云盘地址,反编译工具是 ...

  3. 基于Android + Web+ MySQL设计和开发微博应用

    基于Android + Web+ MySQL设计和开发微博应用 实践内容要求 客户端效果图 源码分享 微博应用系统设计 系统功能设计 关键问题设计 实践内容要求 ①用Android开发微博客户端: ② ...

  4. 长微博android,Android 上最强大的长微博工具:BlackLight 长微博

    手机端的长微博工具屈指可数,Android 上的更是寥寥无几.除却官方客户端那不太像样的长微博功能之外,能够将长文字转换成图片的恐怕就只有锤子便签和 Smooth 了.BlackLight 作为新晋的 ...

  5. android 腾讯微博授权,5腾讯微博Android客户端开发获取请求用户授权Request Token.pdf...

    腾讯微博Android客户端开发 博客:/coolszy Android Android 腾讯微博AAnnddrrooiidd客户端开发 RequestToken RequestToken --获取请 ...

  6. 腾讯微博android版本,腾讯微博 Android版

    腾讯微博这是专为Android用户打造的腾讯微博手机客户端,让您随时随地与亿万微博用户分享生活和资讯.腾讯微博Android客户端,专为Android用户打造,让您随时随地与亿万微博用户分享生活和资讯 ...

  7. 微博Android平台SDK文档

    博Android平台SDK文档 编号:WEIBO_ANDROID_SDK 版本:WEIBO_ANDROID_SDK V3.1.2 修订记录: 时间 文档版本 修订人 备注 2012/7/20 2.0. ...

  8. 轻松去除微博图片logo的方法

    想要微博上好看又高级的图片,首先要解决logo问题.那么如何去除微博图片的logo?本文给你介绍一款好用的微博图片去logo工具,轻松解决logo问题.关键是它在操作上也非常简单,尤其对小白来说十分友 ...

  9. Android 11 微信,QQ ,微博 分享适配

    Android 11 微信,QQ ,微博 分享适配 前言 微信篇 QQ篇 微博篇 前言 最近收到客服反馈 有用户反馈微信分享不了,具体询问一番发现是Android 11的小米机器,然后依次试了 QQ ...

最新文章

  1. 敏捷冲刺每日报告四(Java-Team)
  2. selinux-添加
  3. How Browser Works
  4. P4245-[模板]任意模数多项式乘法
  5. 删不干净_“我劝你别删前任微信”
  6. SSD(based on Caffe)环境配置
  7. UE3 关卡优化指南
  8. 手机页面尺寸设置(二)
  9. [转载] python的numpy.random详细解析
  10. matlab 有约束最小化,求解带等式约束和最小化目标的LMI
  11. SSM+基于ssm的汽车租赁平台的设计与实现 毕业设计-附源码211708
  12. 关于ioncube的license破解
  13. 单片机实验一 LED灯实验
  14. Matlab 括号用法
  15. 泰勒公式到欧拉公式的推导
  16. c语言数组升序排列,数组输入各数之间用空格隔开,输出用空格隔开
  17. 关于protel 99 SE如何建立自己的元件库,导入Sch文件file is not recognized.
  18. 维特WT931 姿态角度传感器(陀螺仪)使用记录
  19. 静态创意和动态创意_2020年创意工作的5个预测
  20. PixelUtils:像素转换工具

热门文章

  1. 使用PHP管理SQL
  2. java遍历文件夹并获取所有路径
  3. android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...
  4. 【Set jsonObj = toJson( jsonString )】创建JSON实例
  5. 我的前端工具集(五)提示工具之模态窗提示
  6. CSS中的overflow属性
  7. http://www.tldp.org/LDP/abs/abs-guide.txt.gz
  8. php开发微信图灵机器人
  9. AlvinZH双掉坑里了
  10. 【校招面试 之 网络】第3题 HTTP请求行、请求头、请求体详解