首页
社区
课程
招聘
[原创]Android软件去广告方法总结[2012.3.6更新工具]
发表于: 2012-3-4 10:02 84866

[原创]Android软件去广告方法总结[2012.3.6更新工具]

2012-3-4 10:02
84866

目前很多免费的android程序都带有小广告,这些广告对于开发者而言,是维持开发运营的收益的一种体现,不过对于用户来说,一些过分的广告,却适得其反,增大了用户的反感,减少了用户体验,这种应用其实也不在少数,废话不多说了,开始进入正题,怎么样才能快速的去除那些顽固的广告呢?接下来看看就知道。注意:此文仅作为技术交流讨论所用,请勿用于其他用途!

用到的工具:ApkTool_GUI_1.3.5内测.exe  下载地址:http://115.com/file/be6ll6tm#ApkTool_GUI_1.3.5内测.rar

开始正式的例子之前,先普及一些知识。目前较为常见的是Admob和Google Ads,虽然前者已被后者收购,但是目前其SDK仍旧独立。

  Admob广告需要导入AdMob Android SDK,并在AndroidManifest.xml内注册,在相应layout内创建元素。
Google AdMob Ads SDK:相关介绍和使用发现
https://developers.google.com/mobile-ads-sdk/docs/android/advanced
https://developers.google.com/mobile-ads-sdk/docs/android/fundamentals
https://developers.google.com/mobile-ads-sdk/docs/android/intermediate

通过阅读上面3个链接的文章,我们知道,只要loadAd这个方法失败,那么就不会加载广告了,所以我们修改这个方法为
----------------原始的----------------------
.method public loadAd()V
    .locals 2

    .prologue
    .line 50
    iget v0, p0, Lcom/devuni/compass/ads/AdsManager;->currentProviderId:I

    const/4 v1, -0x1

    if-ne v0, v1, :cond_1

    .line 52
    invoke-direct {p0}, Lcom/devuni/compass/ads/AdsManager;->nextProvider()V

    .line 58
    :cond_0
    :goto_0
    return-void

    .line 54
    :cond_1
    iget-object v0, p0, Lcom/devuni/compass/ads/AdsManager;->currentProvider:Lcom/devuni/compass/ads/providers/BaseProvider;

    if-eqz v0, :cond_0

    .line 56
    iget-object v0, p0, Lcom/devuni/compass/ads/AdsManager;->currentProvider:Lcom/devuni/compass/ads/providers/BaseProvider;

    invoke-virtual {v0}, Lcom/devuni/compass/ads/providers/BaseProvider;->reload()V

    goto :goto_0
.end method

----------------修改后的----------------------
.method public loadAd()V
    .line 58
    return-void
----------------修改后的----------------------
为什么修改这里呢,因为这个文件还是比较好定位的,有专门的文件夹,一般都叫 “ads”,如果你可以在主程序中找到时那里调用了这个方法,把那句话删掉即可。但是如果是2M以上的大程序,那么要找到在哪里调用了它还是 比较困难的。

一般都是在这个文件  “Main.smali” 里面的 onCreate 方法,实现过程大致如下:

--------------------------------------------------
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
    # 省略了部分代码  
    new-instance v1, Lcom/devuni/compass/ads/AdsManager; #创建一个对象
   
    # …………………………………
    invoke-direct {v1, p0}, Lcom/devuni/compass/ads/AdsManager;-><init>(Landroid/content/Context;)V  # 初始化

    # …………………………………
    invoke-virtual {v1, v0}, Lcom/devuni/compass/ads/AdsManager;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V # 设置输出
   
    # …………………………………
    invoke-virtual {v1}, Lcom/devuni/compass/ads/AdsManager;->loadAd()V # 加载广告
--------------------------------------------------

样本1下载: 样本1.rar

[样本1使用样本2的方法不能去广告]

  Google Ads的SDK已经包含在Android SDK内,也同样需要在AndroidManifest.xml内注册,在相应layout内创建元素。

  *Google的广告下载源为:http://pagead2.googlesyndication.com/pagead/afma_load_ads.js

  既然广告的SDK需要在AndroidManifest.xml中注册,那就看看这个文件。纵观文件,在文件尾部的节点中看到了<activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation">,或 <activity android:name="com.mt.airad.MultiAD" android:configChanges="keyboard|keyboardHidden|orientation" />只有这个部分和广告内容相关,那么把这个节点删掉,应该可以屏蔽广告的注册,也就可以屏蔽广告的加载与显示。

样本2下载: 样本2.rar

由于样本2比较特殊,我就在多介绍一下:

apk程序是否连网,你首先要确定一下,如果你的程序就是一个单机的小游戏或其他应用,不需要网络操作,那么就不要给它网络访问的权限
   <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


把上面这两句话删掉。
通过阅读 AndroidManifest.xml  这个文件,我们发现下面内容,英文大致意思就是:推送酷狗的广告,判断你 wifi 网络的状态,因为此程序是完全的单机应用,所以,我们可以删掉下面得内容,
注意:" <……>     </……>"  一定要配对,如果你不确定每次修改是否会影响程序运行,那就改动一下,打包,签名,测试 ,没问题,就在继续改,随着经验的积累,你就可以免去繁琐的测试了。



三、DomobSDK (多盟sdk,下载地址:http://www.domob.cn/site/view/page/SDK.htm)

注意,由于DomobSDK 有多处校验,所以上面的修改方法对这个sdk是无效的,如果修改会提示没有权限,效果如图:

通过阅读sdk源码,发现它有个方法 叫: setPublisherId 它的作用是相当与设置你的银行卡号,每个用户的手机通过这个ID 访问了 广告网址,就会使这个ID的钱增加。如果这里要是反悔错误,那么就不会加载广告了。

.method public static setPublisherId(Ljava/lang/String;)V
    .locals 2

    if-eqz p0, :cond_0  # 这里修改为   goto :cond_0

    if-eqz p0, :cond_1

    invoke-virtual {p0}, Ljava/lang/String;->length()I

    move-result v0

    if-nez v0, :cond_1

    :cond_0
    const-string v0, "DomobSDK"

    const-string v1, "Incorrect Domob publisher ID."

    invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

    :goto_0
    return-void

    :cond_1
    sput-object p0, Lcn/domob/android/ads/DomobAdManager;->c:Ljava/lang/String;

    goto :goto_0
.end method

当然,有兴趣的朋友可以研究一下 DomobAdManager.smali  这个文件,可以在初始化sdk的时候就返回 void ,这样 效果也是一样的。

样本三下载: 样本3.rar

经常在看 源码的时候发现这样的 字符串,const-string v2, "\u4e0b\u8f7d\u7ebf\u7a0b\u51fa\u9519\uff0c\u9519\u8bef\u539f\u56e0\uff1a",很难读懂是什么意思,就写了个小工具,

喜欢的朋友就猛击此处: AndroidUnicodeString.rar [2012年3月6日修改,添加字符串转unicode功能]


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (47)
雪    币: 35
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大牛啊。虽然不懂,先顶一下以后再学吧。
2012-3-4 10:53
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我都用hosts來防了= =。這樣比較乾脆,也不用每個apk都改XD
2012-3-4 11:03
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
收藏下,确实是好贴!
2012-3-8 14:06
0
雪    币: 1577
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5

unicode在JDK中有工具。。
2012-3-9 18:01
0
雪    币: 546
活跃值: (1672)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
这个,还真不知道
2012-3-9 18:16
0
雪    币: 177
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
都开始研究android了。。。看来趋势很明显了哈
2012-3-15 15:07
0
雪    币: 333
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wan
8
支持去广告安卓,广告看着非常不爽
2012-3-18 15:41
0
雪    币: 64
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持去广告安卓,广告看着非常不爽
2012-4-19 01:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
恩,感谢分享,去广告方法很多,有的想要去的完美确实比较麻烦,我现在去广告只要求画面无显示就OK了
感谢最后分享的工具,很实用
2012-5-4 16:55
0
雪    币: 216
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个好像不支持4.0以上版本的安卓程序吧。修改后4.0版本运行不了apk文件。
2012-5-5 15:57
0
雪    币: 504
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
贊一個,,,安卓,,呵呵
2012-5-6 07:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
.class public Lcn/domob/android/ads/DomobAdManager;
.super Ljava/lang/Object;
.source "SourceFile"

# static fields
.field public static final ACTION_AUDIO:Ljava/lang/String; = "audio"

.field public static final ACTION_CALL:Ljava/lang/String; = "call"

.field public static final ACTION_IN_APP:Ljava/lang/String; = "inapp"

.field public static final ACTION_LAUNCH_APP:Ljava/lang/String; = "la"

.field public static final ACTION_MAIL:Ljava/lang/String; = "mail"

.field public static final ACTION_MAP:Ljava/lang/String; = "map"

.field public static final ACTION_MARKET:Ljava/lang/String; = "market"

.field public static final ACTION_SMS:Ljava/lang/String; = "sms"

.field public static final ACTION_URL:Ljava/lang/String; = "url"

.field public static final ACTION_VIDEO:Ljava/lang/String; = "video"

.field public static final GENDER_FEMALE:Ljava/lang/String; = "f"

.field public static final GENDER_MALE:Ljava/lang/String; = "m"

.field public static final SDK_VER:Ljava/lang/String; = "20120604"

.field public static final TEST_EMULATOR:Ljava/lang/String; = "emulator"

# direct methods
.method public constructor <init>()V
    .locals 0

    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static getBirthday()Ljava/util/GregorianCalendar;
    .locals 1
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    const/4 v0, 0x0

    return-object v0
.end method

.method public static getEndpoint()Ljava/lang/String;
    .locals 1

    invoke-static {}, Lcn/domob/android/ads/g;->a()Lcn/domob/android/ads/g;

    move-result-object v0

    invoke-virtual {v0}, Lcn/domob/android/ads/g;->b()Ljava/lang/String;

    move-result-object v0

    return-object v0
.end method

.method public static getGender()Ljava/lang/String;
    .locals 1
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    const-string v0, ""

    return-object v0
.end method

.method public static getPostalCode()Ljava/lang/String;
    .locals 1
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    const-string v0, ""

    return-object v0
.end method

.method public static getPublisherId(Landroid/content/Context;)Ljava/lang/String;
    .locals 1

    invoke-static {}, Lcn/domob/android/ads/g;->a()Lcn/domob/android/ads/g;

    move-result-object v0

    invoke-virtual {v0, p0}, Lcn/domob/android/ads/g;->a(Landroid/content/Context;)Ljava/lang/String;

    move-result-object v0

    return-object v0
.end method

.method public static setAllowUseOfLocation(Z)V
    .locals 0
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    return-void
.end method

.method public static setBirthday(III)V
    .locals 2
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    new-instance v0, Ljava/util/GregorianCalendar;

    invoke-direct {v0}, Ljava/util/GregorianCalendar;-><init>()V

    add-int/lit8 v1, p1, -0x1

    invoke-virtual {v0, p0, v1, p2}, Ljava/util/GregorianCalendar;->set(III)V

    invoke-static {v0}, Lcn/domob/android/ads/DomobAdManager;->setBirthday(Ljava/util/GregorianCalendar;)V

    return-void
.end method

.method public static setBirthday(Ljava/util/GregorianCalendar;)V
    .locals 0
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    return-void
.end method

.method public static setEndpoint(Ljava/lang/String;)V
    .locals 1

    invoke-static {}, Lcn/domob/android/ads/g;->a()Lcn/domob/android/ads/g;

    move-result-object v0

    invoke-virtual {v0, p0}, Lcn/domob/android/ads/g;->a(Ljava/lang/String;)V

    return-void
.end method

.method public static setGender(Ljava/lang/String;)V
    .locals 0
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    return-void
.end method

.method public static setIsTestMode(Z)V
    .locals 0
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    return-void
.end method

.method public static setPostalCode(Ljava/lang/String;)V
    .locals 0
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    return-void
.end method

.method public static setPublisherId(Ljava/lang/String;)V
    .locals 1
    .annotation runtime Ljava/lang/Deprecated;
    .end annotation

    invoke-static {}, Lcn/domob/android/ads/g;->a()Lcn/domob/android/ads/g;

    move-result-object v0

    invoke-virtual {v0, p0}, Lcn/domob/android/ads/g;->b(Ljava/lang/String;)V

    return-void
.end method

这样的应该怎么破
2012-7-31 15:34
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了~~~~谢谢分享
2012-8-1 22:31
0
雪    币: 226
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
需要认真的学习。。。
2012-8-20 14:57
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
也是这种情况.怎么破?
2012-11-26 21:51
0
雪    币: 139
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
研究这类的文章开始我的android学习之旅,喜欢!
2012-11-27 15:20
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
楼主的思路和方法都很不错,赞一个~

不过对于楼主第一个方法,去除google的广告包,我有一种思路,就是首先在android.Manifest文件中删除所引用的google,activity,然后进入游戏,一般会提示 You must hava activity declare in android.Manifest文件,这时候,我们进入smali.com.google.ads.adView这个smali文件,进行搜索“You must hava”我们删除这句代码,已经它下面的一行代码,一个静态调用方法即可,这时候google的banne条就不会在游戏中显示~
2012-12-9 07:22
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
19
跟不上形势啊,android还没走进过
2012-12-9 20:37
0
雪    币: 274
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看到的第一篇不一样的去广告教程
2013-1-3 21:20
0
雪    币: 745
活跃值: (3823)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
安卓确实是以后的方向,收藏了
2013-1-4 22:07
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
mark一下 值得研究
2013-1-5 00:00
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这个法好!刚才碰到个youmi的广告,去掉了权限和activity,提示“请为您的应用程序添加Activity”,结果没找到这个字符串……
2013-1-7 14:29
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
其实,我真的是灌水的。其实若是把注册的receiver去掉的话应该不会触发程序,就是不会加载广告的那块。
2013-1-9 00:39
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
曾经下载过消除广告的软件,她自己也带广告!
2013-1-27 23:29
0
游客
登录 | 注册 方可回帖
返回
//