前置理论知识

Android 的四大组件

  • Activity:活动,是用户与应用程序交互的窗口,一个应用程序可以有多个 Activity,每个 Activity 都是一个单独的类,负责处理用户的交互。 Android 应用必须包含一个 Activity,用于启动应用程序。 Activity 的生命周期: onCreate()、 onStart()、 onResume()、 onPause()、 onStop()、 onDestroy(),这些方法都是 Activity 类的回调方法,用于处理 Activity 的生命周期。
  • Service:服务,是一种没有用户界面的组件,用于在后台执行长时间运行的操作或处理网络请求。不依赖于用户界面,可以在后台运行,即使用户退出应用程序,服务仍然可以继续运行。 Service 的生命周期: onCreate()、 onStartCommand()、 onBind()、 onUnbind()、 onDestroy()。
  • Broadcast Receiver:广播接收器,用于接收系统或其他应用程序发送的广播消息,可以在应用程序之间传递消息。例如,当手机电量低时,系统会发送一个广播消息,应用程序可以注册一个广播接收器,接收这个消息并做出相应的处理。 Broadcast Receiver 的生命周期: onReceive()。
  • Content Provider:内容提供器,用于管理应用程序的数据,提供数据的访问接口,其他应用程序可以通过这个接口访问数据。 Content Provider 的生命周期: onCreate()、 query()、 insert()、 update()、 delete()。

Activity的生命周期

  • onCreate():Activity 创建时调用,用于初始化 Activity,加载布局文件,绑定数据,创建 View,注册监听等。
  • onStart():Activity 可见时调用,但不一定获取焦点,可以看到 Activity,但无法与 Activity 交互。
  • onResume():Activity 获取焦点时调用,此时 Activity 可以与用户交互,可以处理用户的输入事件。
  • onPause():Activity 失去焦点时调用,此时 Activity 仍然可见,但无法与用户交互,可以保存数据,释放资源。通常在启动新的 Activity 或弹出对话框时调用。
  • onStop():Activity 不可见时调用,此时 Activity 不可见,可以释放资源,停止动画等。通常在 Activity 被覆盖时调用。
  • onDestroy():Activity 销毁时调用,用于释放资源,取消注册监听,关闭数据库连接等。通常在 Activity 被销毁时调用。
  • onRestart():Activity 重新启动时调用,此时 Activity 重新可见,但不一定获取焦点。

以上所有方法都是 Activity 类的回调方法,用于处理 Activity 的生命周期。无法直接调用这些方法,只能通过系统调用。但可以重写这些方法,实现自定义的功能。

Android 的跳过广告

广告的执行流程

  1. 程序启动 Activity
  2. 执行广告的 Activity
  3. 广告 Activity 结束后,执行主 Activity

修改方法

  1. 修改广告 Activity 的加载时间,改成 0
  2. 修改广告 Activity 的跳转逻辑,直接跳转到主 Activity
  3. 修改广告 Activity 的布局文件,将广告内容隐藏

广告跳过

先启动示例程序,可以看到有有个开屏广告,三秒后进入主界面,主界面有两个个弹窗广告,和一个横幅广告
img
img
img
img

开屏广告

我们首先要定位这几个广告的 Activity
使用 MT 管理器的 Activity 记录功能
img
启动服务之后,打开示例程序,可以看到记录了几个 Activity
img
回到 MT 管理器,可以看到定位到的 Activitycom.zj.wuaipojie.ui.AdActivity
img
接下来用 NP 管理器查看安装包里的 classes.dex 文件,搜索 com.zj.wuaipojie.ui.AdActivity,可以看到这个 Activity 的代码
img
smail 看得有点麻烦,点击右上角菜单转化为 Java 代码,我们阅读 Java 代码
img

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
32
33
34
35
36
//
// Decompiled by Jadx (from NP Manager)
//
package com.zj.wuaipojie.ui;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
import com.zj.wuaipojie.ui.AdActivity$.ExternalSyntheticLambda0;
import kotlin.Metadata;
//d1
@Metadata(d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005 ¢ \u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0002J\b\u0010\u0005\u001a\u00020\u0004H\u0002J\u0012\u0010\u0006\u001a\u00020\u00042\b\u0010\u0007\u001a\u0004\u0018\u00010\bH\u0014 ¨ \u0006\t"}, d2 = {"Lcom/zj/wuaipojie/ui/AdActivity;", "Landroidx/appcompat/app/AppCompatActivity;", "()V", "jump", "", "loadAd", "onCreate", "savedInstanceState", "Landroid/os/Bundle;", "app_release"}, k = 1, mv = {1, 7, 1}, xi = 48)
/* compiled from: AdActivity.kt */
public final class AdActivity extends AppCompatActivity {//AdActivity 类继承自 AppCompatActivity
protected void onCreate(Bundle bundle) {// 重写 onCreate 方法
super.onCreate(bundle);// 调用父类的 onCreate 方法
setContentView(2131427363);// 设置布局文件
loadAd();// 调用 loadAd 方法
}

private final void jump() {// 定义 jump 方法
startActivity(new Intent((Context) this, ChallengeThird.class));// 跳转到 ChallengeThird 类
finish();// 结束当前 Activity
}

private final void loadAd() {// 定义 loadAd 方法
new Handler().postDelayed(new ExternalSyntheticLambda0(this), 3000);// 延迟 3000ms 后执行 jump 方法
}

/* renamed from: loadAd$lambda-0 */
private static final void m0loadAd$lambda-0(AdActivity adActivity) {// 定义 loadAd$lambda-0 方法
adActivity.jump();// 调用 jump 方法
}
}

方法一:修改广告 Activity 的加载时间

可以知道,广告 Activity 的逻辑是在 loadAd 方法中,延迟 3 秒后执行 jump 方法,jump 方法中跳转到 ChallengeThird 类,我们可以直接修改 loadAd 方法,将延迟时间改为 0 ,这样就可以直接跳转到主 Activity
由于无法直接修改 Java 代码,我们可以使用 smali 修改 smali 代码,将 3000 改为 0
将对应 smail 代码的 0xbb8 改为 0x0
img
保存修改后的文件,重新打包安装包安装,启动示例程序,可以看到开屏广告直接跳转到主 Activity。
需要注意的是,实际上广告的 activity 并没有被跳过,只是跳转到主 Activity 的时间被缩短了。这点我们同样可以通过 Activity 记录来验证。还有一点就是,如果广告的时间是由服务器控制的,那我们就无法通过修改本地代码来跳过广告了,需要通过修改服务器的返回数据来跳过广告。这里就不讨论了。

方法二:修改广告 Activity 的跳转逻辑

记得上一篇文章 Android_Note( 一 ) 中介绍过 AndroidManifest.xml 文件,我们可以在这里修改广告 Activity 的跳转逻辑。
AndroidManifest.xml 中声明了实现应用部分可视化界面的 Acticity,系统不会识别和运行任何未进行声明的 Activity。
android:exported 表示 Activity 是否可以被其他应用程序组件调用,true 表示可以被调用,false 表示不可以被调用。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
android:compileSdkVersion="32"
android:compileSdkVersionCodename="12"
package="com.zj.wuaipojie"
platformBuildVersionCode="32"
platformBuildVersionName="12">
<uses-sdk android:minSdkVersion="27" android:targetSdkVersion="32"/>
<!-- 拥有完全的网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 修改或删除您共享存储空间中的内容 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:theme="@style/Theme.Wuaipojie"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:supportsRtl="true"
android:extractNativeLibs="false"
android:fullBackupContent="@xml/backup_rules"
android:networkSecurityConfig="@xml/network_config"
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:dataExtractionRules="@xml/data_extraction_rules">
<activity
android:name="com.zj.wuaipojie.ui.ChallengeSixth"
android:exported="false"/>
<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
android:label="@string/app_name"
android:name="com.zj.wuaipojie.ui.MainActivity"
android:exported="true">
<intent-filter>
<action
android:name="android.intent.action.MAIN"/>
<category
android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name="com.zj.wuaipojie.ui.ChallengeFirst"/>
</application>
</manifest>

要注意这关键的几行,这几行代表了当前应用的启动页 Activity 是 com.zj.wuaipojie.ui.MainActivity,我们可以将其改成 com.zj.wuaipojie.ui.ChallengeThird,这样就可以直接跳转到第三关 Activity 而不会去加载广告 Activity 了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<activity
android:label="@string/app_name"
android:name="com.zj.wuaipojie.ui.MainActivity"
android:exported="true">
<!-- 这里声明了组件的入口的类名是 com.zj.wuaipojie.ui.MainActivity,并且可以被其他应用程序组件调用 -->
<intent-filter>
<!-- intent-filter 是一个过滤器,用于指定哪些 Intent 可以启动该 Activity -->
<action
android:name="android.intent.action.MAIN"/>
<!-- action 是一个动作,用于指定要执行的操作 -->
<category
android:name="android.intent.category.LAUNCHER"/>
<!-- category 是一个类别,用于指定该 Activity 是一个启动器 -->
</intent-filter>
</activity>

需要注意的是,一般不推荐这样修改 AndroidManifest.xml 文件,因为这样可能会导致应用无法正常启动,许多应用在启动的时候会预加载一些资源,如果强行修改跳转逻辑,可能会导致资源加载失败,从而导致应用崩溃。

方法三:修改广告 Activity 的调用逻辑

尝试一下搜索哪里调用了广告 com.zj.wuaipojie.ui.AdActivity,将这个调用直接修改为调用主 Activity
同样用 MT 管理器搜索 com.zj.wuaipojie.ui.AdActivity,长按搜索结果,选择复制
img
选择第四个 Lcom/zj/wuaipojie/ui/AdActivity; 这是广告 AdActivity 类的 smali 路径代码,通过搜索这个路径,可以找到调用这个类的地方
img
搜索 Lcom/zj/wuaipojie/ui/AdActivity;,搜索类型选择代码,可以看到调用这个类的地方
img
可以看到 com.zj.wuaipojie.ui.Adapter 中调用了 com.zj.wuaipojie.ui.AdActivity,转为 Java 代码

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//
// Decompiled by Jadx (from NP Manager)
//
package com.zj.wuaipojie.ui.Adapter;

import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView.Adapter;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.zj.wuaipojie.ui.AdActivity;
import com.zj.wuaipojie.ui.Adapter.ChallengeAdapter$.ExternalSyntheticLambda0;
import com.zj.wuaipojie.ui.Challenge;
import com.zj.wuaipojie.ui.ChallengeFifth;
import com.zj.wuaipojie.ui.ChallengeFirst;
import com.zj.wuaipojie.ui.ChallengeFourth;
import com.zj.wuaipojie.ui.ChallengeSecond;
import com.zj.wuaipojie.ui.ChallengeSixth;
import java.util.List;
import kotlin.Metadata;

@Metadata(d1 = {"\u00000\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0010\b\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0003\u0018\u00002\f\u0012\b\u0012\u00060\u0002R\u00020\u00000\u0001:\u0001\u0013B\u0013\u0012\f\u0010\u0003\u001a\b\u0012\u0004\u0012\u00020\u00050\u0004 ¢ \u0006\u0002\u0010\u0006J\b\u0010\t\u001a\u00020\nH\u0016J\u001c\u0010\u000b\u001a\u00020\f2\n\u0010\r\u001a\u00060\u0002R\u00020\u00002\u0006\u0010\u000e\u001a\u00020\nH\u0016J\u001c\u0010\u000f\u001a\u00060\u0002R\u00020\u00002\u0006\u0010\u0010\u001a\u00020\u00112\u0006\u0010\u0012\u001a\u00020\nH\u0016R\u0017\u0010\u0003\u001a\b\u0012\u0004\u0012\u00020\u00050\u0004 ¢ \u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\b ¨ \u0006\u0014"}, d2 = {"Lcom/zj/wuaipojie/ui/Adapter/ChallengeAdapter;", "Landroidx/recyclerview/widget/RecyclerView$Adapter;", "Lcom/zj/wuaipojie/ui/Adapter/ChallengeAdapter$ViewHolder;", "mChallenges", "", "Lcom/zj/wuaipojie/ui/Challenge;", "(Ljava/util/List;)V", "getMChallenges", "()Ljava/util/List;", "getItemCount", "", "onBindViewHolder", "", "holder", "position", "onCreateViewHolder", "parent", "Landroid/view/ViewGroup;", "viewType", "ViewHolder", "app_release"}, k = 1, mv = {1, 7, 1}, xi = 48)
/* compiled from: ChallengeAdapter.kt */
public final class ChallengeAdapter extends Adapter<ViewHolder> {
private final List<Challenge> mChallenges;

/* renamed from: onCreateViewHolder$lambda-0 */
private static final void m0onCreateViewHolder$lambda-0(ViewHolder viewHolder, View view) {
int adapterPosition = viewHolder.getAdapterPosition();
Intent intent;
if (adapterPosition == 0) {
intent = new Intent();
intent.setClass(view.getContext(), ChallengeFirst.class);
view.getContext().startActivity(intent);
} else if (adapterPosition == 1) {
intent = new Intent();
intent.setClass(view.getContext(), ChallengeSecond.class);
view.getContext().startActivity(intent);
} else if (adapterPosition == 2) {// 核心就是这里,当 adapterPosition 为 2 时,调用广告 Activity
intent = new Intent();// 创建一个 Intent 对象
intent.setClass(view.getContext(), AdActivity.class);// 设置跳转的 Activity 为 AdActivity
view.getContext().startActivity(intent);// 启动 Activity
} else if (adapterPosition == 3) {
intent = new Intent();
intent.setClass(view.getContext(), ChallengeFourth.class);
view.getContext().startActivity(intent);
} else if (adapterPosition == 4) {
intent = new Intent();
intent.setClass(view.getContext(), ChallengeFifth.class);
view.getContext().startActivity(intent);
} else if (adapterPosition == 5) {
intent = new Intent();
intent.setClass(view.getContext(), ChallengeSixth.class);
view.getContext().startActivity(intent);
}
}

public void onBindViewHolder(ViewHolder viewHolder, int i) {
Challenge challenge = (Challenge) this.mChallenges.get(i);
viewHolder.getChallengeName().setText(challenge.getChallenege_name());
viewHolder.getChallengeImage().setImageResource(challenge.getChallenge_img());
}

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
ViewHolder viewHolder = new ViewHolder(this, LayoutInflater.from(viewGroup.getContext()).inflate(2131427364, viewGroup, false));
viewHolder.getChallengeImage().setOnClickListener(new ExternalSyntheticLambda0(viewHolder));
return viewHolder;
}

public ChallengeAdapter(List<Challenge> list) {
this.mChallenges = list;
}

public int getItemCount() {
return this.mChallenges.size();
}

public final List<Challenge> getMChallenges() {
return this.mChallenges;
}
}

我们可以模仿其他几关的调用,不调用 AdActivity,而是直接调用 challengeThird
回到 smali 代码,将 Lcom/zj/wuaipojie/ui/AdActivity; 改为 Lcom/zj/wuaipojie/ui/ChallengeThird;
img
保存修改后的文件,重新打包安装包安装,启动示例程序,可以看到广告 Activity 被跳过,直接跳转到主 Activity。

弹窗广告&强制更新

首先对于强制更新弹窗,一般都是验证 AndroidMainfest.xml里的android:versionCode和服务器上的版本号是否一致,如果不一致就会弹出强制更新的弹窗,我们可以通过修改 AndroidMainfest.xml里的android:versionCode来跳过强制更新弹窗。

Hook弹窗

我们借助算法助手实现,首先在 Lsposed 中打开算法助手的作用域,
img
在算法助手中启用对应的程序
img
然后点击对应程序,选择启用弹窗定位(返回键可取消)与屏蔽关键词弹窗,关键词中记得加入广告
img
然后点击右上角启动,提示注入成功
img
进入第三关,可以看到弹窗被屏蔽了
img

弹窗代码修改

在算法助手中,查看程序的日志
img
可以看到弹窗的调用堆栈,可以看到调用的方法名为com.zj.wuaipojie.ui.ChallengeThird.onCreate
img
用 NP管理器 在 class.dex 中搜索方法名
img
img
定位到关键代码后,将用于显示两个弹窗的 .line 38.line 53 show 代码注释掉

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
.method protected onCreate(Landroid/os/Bundle;)V
.registers 7

.line 26
invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

const p1, 0x7f0b0021

.line 27
invoke-virtual {p0, p1}, Lcom/zj/wuaipojie/ui/ChallengeThird;->setContentView(I)V

.line 28
new-instance p1, Landroidx/appcompat/app/AlertDialog$Builder;

move-object v0, p0

check-cast v0, Landroid/content/Context;

invoke-direct {p1, v0}, Landroidx/appcompat/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V

const-string v1, "这是二号广告标题"

.line 29
check-cast v1, Ljava/lang/CharSequence;

invoke-virtual {p1, v1}, Landroidx/appcompat/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroidx/appcompat/app/AlertDialog$Builder;

const-string v1, "这是二号广告内容"

.line 30
check-cast v1, Ljava/lang/CharSequence;

invoke-virtual {p1, v1}, Landroidx/appcompat/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroidx/appcompat/app/AlertDialog$Builder;

const/4 v1, 0x0

.line 31
invoke-virtual {p1, v1}, Landroidx/appcompat/app/AlertDialog$Builder;->setCancelable(Z)Landroidx/appcompat/app/AlertDialog$Builder;

const-string v1, "前往论坛"

.line 32
move-object v2, v1

check-cast v2, Ljava/lang/CharSequence;

new-instance v3, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda1;

invoke-direct {v3, p0}, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda1;-><init>(Lcom/zj/wuaipojie/ui/ChallengeThird;)V

invoke-virtual {p1, v2, v3}, Landroidx/appcompat/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroidx/appcompat/app/AlertDialog$Builder;

const-string v2, "退出软件"

.line 37
move-object v3, v2

check-cast v3, Ljava/lang/CharSequence;

sget-object v4, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda2;->INSTANCE:Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda2;

invoke-virtual {p1, v3, v4}, Landroidx/appcompat/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroidx/appcompat/app/AlertDialog$Builder;

.line 38
#invoke-virtual {p1}, Landroidx/appcompat/app/AlertDialog$Builder;->show()Landroidx/appcompat/app/AlertDialog;

.line 40
new-instance p1, Lcom/zj/wuaipojie/util/CommonDialog$Builder;

invoke-direct {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;-><init>(Landroid/content/Context;)V

const-string v0, "一号广告弹窗已就位"

.line 41
invoke-virtual {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setMessage(Ljava/lang/String;)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

move-result-object p1

.line 42
sget-object v0, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda3;->INSTANCE:Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda3;

invoke-virtual {p1, v2, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setNegativeButton(Ljava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

move-result-object p1

const/high16 v0, -0x1000000

.line 45
invoke-virtual {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setMessageColor(I)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

move-result-object p1

.line 46
new-instance v0, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda0;

invoke-direct {v0, p0}, Lcom/zj/wuaipojie/ui/ChallengeThird$$ExternalSyntheticLambda0;-><init>(Lcom/zj/wuaipojie/ui/ChallengeThird;)V

invoke-virtual {p1, v1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setPositiveButton(Ljava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

move-result-object p1

const v0, 0x3f4ccccd # 0.8f

.line 51
invoke-virtual {p1, v0}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->setWith(F)Lcom/zj/wuaipojie/util/CommonDialog$Builder;

move-result-object p1

.line 52
invoke-virtual {p1}, Lcom/zj/wuaipojie/util/CommonDialog$Builder;->create()Lcom/zj/wuaipojie/util/CommonDialog;

move-result-object p1

.line 53
#invoke-virtual {p1}, Lcom/zj/wuaipojie/util/CommonDialog;->show()V

.line 54
invoke-direct {p0}, Lcom/zj/wuaipojie/ui/ChallengeThird;->checkUpdate()V

return-void
.end method

横幅广告

去除横幅广告的关键在于定位到横幅广告的 View id
使用开发助手的布局查看工具,获取到横幅广告的 View id
0x7f0801ca
img
用 MT管理器的 XML搜索功能搜索 View id
img
img
在 xml 中搜索 0x7f0801ca ,可以将广告的宽度和高度修改成0
或则添加 android:visibility="gone" 隐藏广告
img

Refer