弹窗定位去更新,广告分析与布局优化

弹窗定位去更新,广告分析与布局优化

1.广告类型

启动广告     弹窗&更新广告   横幅广告

2.安卓四大组件

组件 描述
Activity(活动) 在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。
Service(服务) Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。
Broadcast Receiver(广播接收器) 一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。
Content Provider(内容提供者) 作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等)

1.activity的切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!---声明实现应用部分可视化界面的 Activity,必须使用 AndroidManifest 中的 <activity> 元素表示所有 Activity。系统不会识别和运行任何未进行声明的Activity。----->
<activity
android:label="@string/app_name"
android:name="com.zj.wuaipojie.ui.MainActivity"
android:exported="true"> <!--当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动-->
<!---指明这个activity可以以什么样的意图(intent)启动--->
<intent-filter>
<!--表示activity作为一个什么动作启动,android.intent.action.MAIN表示作为主activity启动--->
<action
android:name="android.intent.action.MAIN" />
<!--这是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity-->
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.zj.wuaipojie.ui.ChallengeFirst" />
<activity
android:name="com.zj.wuaipojie.ui.ChallengeFifth"
android:exported="true" />
<activity
android:name="com.zj.wuaipojie.ui.ChallengeFourth"
android:exported="true" />
<activity
android:name="com.zj.wuaipojie.ui.ChallengeThird"
android:exported="false" />
<activity
android:name="com.zj.wuaipojie.ui.ChallengeSecond"
android:exported="false" />
<activity
android:name="com.zj.wuaipojie.ui.AdActivity" /> //广告的Activity

启动广告流程:
启动Activity->广告Activity->主页Activity

修改方法:
1.修改加载时间
2.Acitivity切换定位,修改Intent的Activity类名

  • 修改Intent的Activity类名示例

    1.在查找过程中我们可以直接排除他自身一个类的调用

    2.观察改代码的调用逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    switch (position) {  
    case 0:
    Intent intent = new Intent();
    intent.setClass(it.getContext(), ChallengeFirst.class);
    it.getContext().startActivity(intent);
    return;
    case 1:
    Intent intent2 = new Intent();
    intent2.setClass(it.getContext(), ChallengeSecond.class);
    it.getContext().startActivity(intent2);
    return;
    case 2:
    Intent intent3 = new Intent(); //new一个Intent,
    intent3.setClass(it.getContext(), AdActivity.class); //传入要切换的Acitivity的类名
    it.getContext().startActivity(intent3); //启动对应的Activity
    return;
    case 3:
    Intent intent4 = new Intent();
    intent4.setClass(it.getContext(), ChallengeFourth.class);
    it.getContext().startActivity(intent4);
    return;
    default:
    return;
    }

    3.通过观察发现AdActivity.class是插入广告的地方,我们进入该地方将传入的广告Activity切换为我们正常的页面Activity

    4.重新签名安装后就发现我们直接进入到正常的Activity页面。该方法定位到具体的代码地方修改可以避免直接在XMl文件里修改而产生的页面内容无法加载或闪退等情况。

activity切换定位法

  • 修改时间示例

    1.先打开Activity记录

    2.可以查找定位到我们刚刚打开界面或自动弹出界面的Activity

    3.点击复制进行查找

    4.修改时间来关闭弹窗,我们发现调用时间的是loadAd()方法。

    1. 0xbb8是十六进制数值,对应十进制的 3000 毫秒(3 秒)。我们可以将其修改为0x0使其读秒数变为0

    6.保存安装后就可以发现界面仍会走到,但是因为停留时间太短可以忽略。

3.Activity生命周期

函数名称 描述
onCreate() 一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。
onStart() 当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。
onResume() 这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。
onPause() 这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。
onStop() 这个方法是在Activity完全不可见的时候调用的。
onDestroy() 这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。
onRestart() 当Activity从停止stop状态恢进入start状态时调用状态。

4.弹窗定位&堆栈分析

修改方法:

  • 1.修改xml中的versiocode

  • 2.Hook弹窗(推荐算法助手开启弹窗定位)

    (1)启动模块,勾选作用域重启软件

    (2)打开算法助手,找到该软件分别打开应用总开关和弹窗定位。


    (3)启动后点击返回就可以实现返回,但在Hook之前会把返回键给劫持掉。相当于去掉弹窗。

    (4)也可以直接启用的关键词弹窗,直接Hook掉两个弹窗。

  • 3.修改dex弹窗代码

    (1)打开日志找到最新弹窗,可以查看该弹窗的相关内容以及堆栈的调用

    (2)因为最终要定位到该onCreate方法,我们定位到最精准的地方进行查看。

    (3)会发现后面调用了show()方法来显示弹窗信息,我们可以将该段代码注释掉或删除。

  • 4.抓包修改响应体(也可以路由器拦截)

    详见后面抓包内容

  • 横幅广告

    1.使用开发助手的布局查看功能,同意其申请权限

    2.使用小放大镜选取横幅,查看其相关信息,ad_image是广告的意思

    3.进一步我们查看到其id等信息

    4.我们可以使用XML查找

    5.到定位位置修改其界面的相关信息

    6.同样也可以加入xml隐藏代码将该布局隐藏起来

    1
    2

    android:visibility="gone"


弹窗定位去更新,广告分析与布局优化
https://cc-nx.github.io/2025/03/23/ZJ4/弹窗定位去更新,广告分析与布局优化 1b0a6f4b4daf80019ef2e0767f50ce0e/
作者
CC
发布于
2025年3月23日
许可协议