标 题:
【原创】Android软件去广告方法总结[2012.3.6更新工具]
作 者: 我是土匪
时 间: 2012-03-04,10:02:13
链 接: http://bbs.pediy.com/showthread.php?t=147339
目前很多免费的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功能]
作 者: 我是土匪
时 间: 2012-03-04,10:02:13
链 接: http://bbs.pediy.com/showthread.php?t=147339
目前很多免费的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 网络的状态,因为此程序是完全的单机应用,所以,我们可以删掉下面得内容,
注意:" <……> </……>" 一定要配对
![微笑](http://bbs.pediy.com/images/smilies/smile.gif)
三、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 ,这样 效果也是一样的。
![酷](http://bbs.pediy.com/images/smilies/cool.gif)
样本三下载: 样本3.rar .
经常在看 源码的时候发现这样的 字符串,const-string v2, "\u4e0b\u8f7d\u7ebf\u7a0b\u51fa\u9519\uff0c\u9519\u8bef\u539f\u56e0\uff1a",很难读懂是什么意思,就写了个小工具,
喜欢的朋友就猛击此处: AndroidUnicodeString.rar . [2012年3月6日修改,添加字符串转unicode功能]