声明:本文章仅做技术研究,请勿用于非法用途。
这个软件还不错但是有广告,我的手机安装了手机毒霸,也没能阻止其广告,遂有了自己手动去掉其广告的想法。
软件版本1.6,大家可在网上下载。
有两个目的:
一、去掉右边的应用推荐
二、去掉底部的广告
一、去掉右边的应用推荐:
1、用apktool反编译该程序,在\res\layout布局文件中搜索关键字:“应用推荐”,有三处地方,如下图:
其中在activity_main_book_list.xml 和activity_online.xml 的两处需要修改,还要一处不是我们要找的应用推荐所在的按钮,因此无需改动。
第一处:
<Button android:textSize="15.0sp" android:textColor="@color/red" android:layout_gravity="right|center" android:id="@id/btn_goods" android:background="@drawable/btn_goods_bg" android:layout_width="30.0dip" android:layout_height="wrap_content" android:text="应用推荐" />
第二处:
<Button android:textSize="15.0sp" android:textColor="@color/red" android:layout_gravity="right|center" android:id="@id/btn_goods" android:background="@drawable/btn_goods_bg" android:layout_width="30.0dip" android:layout_height="wrap_content" android:text="应用推荐" />
第三处:
<TextView android:textSize="18.0sp" android:textColor="#ff595959" android:ellipsize="marquee" android:gravity="center" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="3.0dip" android:layout_marginRight="3.0dip" android:text="免费实用应用推荐" android:singleLine="true" android:layout_weight="1.0" android:layout_centerInParent="true" />
把这两处的android:layout_width和android:layout_height的值都改成0dip,让这个按钮不可见,就OK了,这个很简单。
二、去掉底部的广告
1、在布局文件中容易发现广告的关键字adlayout,可以猜测是放广告的位置,那么在\res\layout布局文件中搜索关键字:“id/adlayout”共有5处,如下图:
<LinearLayout android:gravity="center_horizontal" android:id="@id/adlayout" android:layout_width="fill_parent" android:layout_height="wrap_content" />
同样高度和宽度都改成0dip,那么广告是看不见了,但是不能阻止程序加载广告,实际上广告是运行了,只是我们没让它显示出来,由于广告也很费手机的流量,所以我们要通过改变代码让广告不运行。
2、通过adlayout来找是程序的何处访问了该布局文件,我们可以在smali\com\aitingshu\R$id.smali里发现:
Line 8: .field public static final adlayout:I = 0x7f09000b
再次搜索smali文件中有哪些方法调用了0x7f09000b,发现在smali\com\aitingshu\base\BaseAdActivity.smali当中的.method protected final b()V方法调用了:
.method protected final b()V
.locals 5
const v4, 0x106000c
const v0, 0x7f09000b
invoke-virtual {p0, v0}, Lcom/aitingshu/base/BaseAdActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/LinearLayout;
if-eqz v0, :cond_0
new-instance v2, Landroid/common/d;
sget-object v1, Landroid/common/c;->a:Landroid/common/c;
invoke-direct {v2, p0, v1}, Landroid/common/d;-><init>(Landroid/app/Activity;Landroid/common/c;)V
invoke-virtual {v2, v4}, Landroid/common/d;->setBackgroundColor(I)V
invoke-virtual {v2}, Landroid/common/d;->a()V
const/4 v1, 0x2
invoke-virtual {v2, v1}, Landroid/common/d;->findViewById(I)Landroid/view/View;
move-result-object v1
check-cast v1, Landroid/widget/TextView;
const/4 v3, -0x1
invoke-virtual {v1, v3}, Landroid/widget/TextView;->setTextColor(I)V
const/4 v1, 0x3
invoke-virtual {v2, v1}, Landroid/common/d;->findViewById(I)Landroid/view/View;
move-result-object v1
check-cast v1, Landroid/widget/TextView;
const v3, -0x777778
invoke-virtual {v1, v3}, Landroid/widget/TextView;->setTextColor(I)V
sget-object v1, Lcom/aitingshu/base/BaseAdActivity;->b:Landroid/widget/LinearLayout$LayoutParams;
invoke-virtual {v0, v2, v1}, Landroid/widget/LinearLayout;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
invoke-virtual {v0, v4}, Landroid/widget/LinearLayout;->setBackgroundColor(I)V
const-string v0, ""
const-string v1, "init ad done"
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
:cond_0
return-void
.end method
这段代码较长,实际上我们不需要关注代码具体做了什么,只要注意到尾部 "init ad done",表示广告初始化结束,那么之上的一段代码就是广告初始化的过程,我们要跳过去,不让广告初始化,在此方法的前面几句代码中,有一个条件跳转:
if-eqz v0, :cond_0
直接跳到方法尾部返回,因此,我们把if-eqz v0, :cond_0改成goto :cond_0,无条件跳转,越过广告初始化过程,保存文件,重新编译,签名,测试,成功去掉底部广告。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工
作,每周日13:00-18:00直播授课
上传的附件: