前言:

  • 最近似乎有点无聊,就到谷歌商店找找应用玩玩,看到一款叫encore_tvb的app,下载后发现还挺不错的里面的港剧都是可以免费看的的哟,看到”尋秦記”准备再看一遍,然后就中毒了….天天看哈哈…,
  • 说了那么多这个软件真的有那么好吗,免费看哦!想太多了,其实是有广告的,首先是banner广告,打开软件的主界面会有banner广告,第二你每次打开一个剧都会先弹出一个全屏广告给你看的,这个广告可以手动关闭,第三个广告,在你播放每一集电视剧或者节目的时候首先会播放一个十多秒的视频广告,这个视屏广告是不可以手动关闭或者跳过的,必须要看完广告才能看正片!(其实软件打开后就会跳出一个全屏广告的,但是应该是软件的兼容性问题我在有些系统并没有跳出来)
  • 因为想不想看广告,于是我动了”歪念”,把这个软件的广告移除掉了,把三个形式的广告都剔除掉了,实现了清爽煲剧的想法~~~

无广告的实现

让我们来干点坏事吧!

  1. 准备工具
    apktool - 反编译apk用
    jadx或jeb - smali转java工具,分析代码有用
    Atom - 查看和编辑smali代码用,支持smali语法高亮
  2. 开始工作
    反编译apk
    1
    apktool d encore_tvb.apk -o encore_tvb
apktool
apktool

在apk里面把dex文件拖出来,用jeb或者jadx打开

  1. 思考
    我们分析一下广告的特征再去看代码

    • 首先,弹出的广告或者banner广告一般都会有广告提供商的logo字样
      ad logo
    • 其次,做android有嵌入过第三方sdk的应该都知道,嵌入别人的sdk肯定有初始化的地方
    • 最后,广告的显示弹出肯定会调用,一些显示view的函数的
      有了这些思路之后,我们就可以沿着这个方向去分析代码了!

    观察后看到广告的提供商是Google,那就好办了,我们直接去GoogleAdMod的官网看Google AD的接入方式,就可以知道广告初始化的代码是什么了
    进入到Google AdModde 官网看到,android的广告类型有好几种,其中红框框起来的有两种种就是这个app所用的广告形式
    ad_type
    进去看这些广告是如何使用的,因为这个app是用java写的,所以看java的初始化代码就行了

    • Interstitial Ads(全屏广告)
      interstitial_ad
      全屏广告的的初始化和加载函数
      interstitial_ads_load
      全屏广告的弹出函数
      interstitial_ads_show
      全屏广告的回调函数,这个不是重点,因为广告不执行的话,这些函数永远无法执行
      interstitial_ads_callback
      好了知道了全屏的使用方法那我们就最直接的方法就是在代码中找到这些代码,然后删掉,或者注释掉,我是用注释的方法,因为出问题了可以关掉注释测试下
      用jadx打开dex文件,打开后发现这个app并没有加密,也没有混淆….我已经好久没有见到大公司还有这么耿直的app了
      open_by_jadx
      因为打开app就弹出一个全屏广告,所以猜想在app的第一屏有调用了show()这个函数,我们就去第一屏的class文件找是否存在这个函数,在AndroidManifest.xml找到第一屏的class
      frist_activity
      或者使用adb shell dump 查看当前的弹出广告的activity是什么

      1
      2
      3
      4
      #windows
      adb shell dumpsys activity | findstr "mFoucsedActivity"
      #mac linux
      adb shell dumpsys activity | grep "mFoucsedActivity"

      adb_dump_activity
      找到了弹出的activity直接用jadx在这个class里面搜索show()函数
      search_show
      可以看到,requestInterstitial函数是获取广告和弹出广告的
      !(spalsh_requestInterstitial)[]
      找到smali代码注释掉相关的代码段代码,这里不贴答案,就是讲一种思路
      requestInterstitial_smali
      好,注释完后保存,回编译
      apktool_b
      签名apk
      sign_apk
      安装运行查看效果
      run_app
      我们每次改完部分代码之后都 回编译->签名->安装运行->查看效果 这样做的目的是为了验证改的代码到底对不对和有没有造成bug,不过这样子改的有bug很容易定位,在adb logcat查看报错的代码,很容易找到原因
      error_log
      就像这个错误是我改了播放视频的代码所引起的bug,按着这个错误看下去,是因为我注释了广告的初始化所以,后面的代码如果有引用到前面的List的话就会引起奔溃,解决办法就是把后面的引用也注释就好了

    • banner Ads
      banner_ad
      因为banner广告是嵌入到app的界面布局去的所以会事先在xml布局文件声明,这个广告的控件
      banner_ad_xml
      banner Ads的初始化函数
      banner_init
      banner Ads的回调函数
      banner_ad_event
      进入app主界面就是banner Ad了,直接去找主界面的class,搜索laodAd函数
      laod_ad
      en..很明显了
      还有一个地方就是点击那些剧场的时候回弹出一个全屏广告,那就直接找这些item的onclick事件
      进入到剧场选集的界面还有一个banner Ad,因为是banner ad所以直接搜索loadAd,瞬间找到
      drama_ad
    • Video Ads
      这个视频广告是你点击播放视频的时候必然会播放的广告,还不止播放一次,每隔一段时间播放一次,虽然不是屠龙宝刀免费送,不过不能跳过,而且因为是国外的广告提供商的广告在国内放…还是挺卡的
      vedio_ad
      广告是点开播放界面就会播放,不过呢我们不知道是谁的广告就是没有搜索广告的关键函数了,所以直接去activity的入口函数开始找,找到oncreate函数找
      player_oncrete
      看到了一些关键的字眼,广告的提供商分别是 spotxdfp,这个其实不用管知道就行了,红框部分就是视屏广告的配置构造的函数,这里修改的方式很简单,直接不让程序执行这段代码,直接修改this.adFrequency让它用永远为null那就可以了,再次 回编译->签名->安装运行->查看效果
      no_ad_bingo
      不错,不错,广告都没了,哈哈,可以开心的煲剧了
      一些小细节没写,直接打包运行app可能会蹦掉,不过跟着log找错就很容易找到问题了,其实蹦掉也挺好的,你可以在log看到更加详细的调用时序.毕竟是学习思路的,所以那些答案就不要贴出来了,动手做了你就知道了
      这个app去广告不算很完美,因为有些地方我没有弄,好像主页的最顶部的banner Ad的广告位是没有广告了,但是还是有个灰色的东西在哪里,这个不难,有时间再弄吧,反正可以用…,

成品下载

题外话

  • 这个app是TVB(USA)公司的,所以看剧需要翻 墙,你懂的哇,看的时候你会看到右上角有个TVBUS的标致(请问有大陆有TVB频道吗?),如果你不会翻 墙,或者想翻.可以问下我,不说了我要去继续看我的尋秦記了…..

    欢迎学习交流,如有错漏,欢迎批评指正!^__^