微博 Android 啟動廣告,使用Xposed去除微博國際版的啟動廣告

本文同步更新于旺仔的個人博客,訪問可能有點慢,多刷新幾次。

前面有篇文章已經介紹了如何創建Xposed模塊的文章了,這篇就讓我們來實現一個簡單的去除啟動廣告的功能吧。

起因

為什么要是要去掉微博國際版的開屏廣告呢,因為廣告煩人啊,而且我打開微博的時間也是偶爾才會打開的,每次一打開就能看到廣告,所以就想把這個開屏廣告給刪掉,奇怪的是,打開一次后,再關掉再打開是沒有廣告的,要隔一段時候才會出現廣告,這個原因會在下面解釋。

實踐

查找啟動Activity

首先我們先拿到微博國際版的apk,apk的版本是2.5.7-5。

1162d5c783f4

然后拉到Android Studio里面,然后點擊AndroidManifest.xml文件,然后搜索android.intent.category.LAUNCHER,找到啟動的Activity,在這里我們找到Activity是com.weico.international.activity.LogoActivity

1162d5c783f4

反編譯classes.dex

在這里所用到的反編譯工具都是可以在網上找到,工具為dex2jar和jd-gui,大家自行搜索下載。

找到了啟動的Activity后呢,我們就要將apk給反編譯,把里面的classes.dex文件提取出來,首先將微博國際版的apk后綴改為.zip,然后打開

1162d5c783f4

然后將里面的兩個dex文件,拷貝出來,放到dex2jar目錄里面,然后拖兩個文件到dex2jar.bat上面,讓其轉換成jar文件

1162d5c783f4

轉換過程

1162d5c783f4

轉換完成之后會出現classes_dex2jar.jar和classes2_dex2jar.jar兩個文件

1162d5c783f4

然后我們用jd-gui打開這兩個jar文件,然后找到LogoActivity

1162d5c783f4

查找廣告

使用jd-gui打開LogoActivity之后,我們就要在里面查找廣告相關的內容了,我們搜索ad,最后找到loginOrGlance方法和openGDTAD方法。

通過下面代碼可以看出,真正顯示廣告的是openGDTAD方法,而loginOrGlance方法則是判斷當前啟動是否需要顯示廣告,這下找到源頭就好辦了。

private void loginOrGlance()

{

if (!Setting.getInstance().loadBoolean("first_open_guide"))

{

Setting.getInstance().saveBoolean("first_open_guide", true);

startActivityForResult(new Intent(this.me, GuideActivity.class), 1025);

return;

}

if (AccountsStore.getCurAccount() != null)

{

if (Setting.getInstance().loadInt("display_ad") == 1)

{

if (System.currentTimeMillis() - Setting.getInstance().loadLong("ad_display_time") > ProcessMonitor.repeatedTime)

{

openGDTAD();

return;

}

initMainTabActivity();

return;

}

initMainTabActivity();

return;

}

initGuestActivity();

}

// 加載廣告

private void openGDTAD()

{

getWindow().getDecorView().postDelayed(new Runnable()

{

public void run()

{

WIActions.startActivityWithAction(new Intent(LogoActivity.this.me, NewSplashActivity.class), Constant.Transaction.GROW_FADE);

LogoActivity.this.finish();

}

}

, 600L);

}

廣告間隔出現原因

前面我們說過啟動一次出現廣告后,要隔一段時候才會重新出現廣告,上面的代碼System.currentTimeMillis() - Setting.getInstance().loadLong("ad_display_time") > ProcessMonitor.repeatedTime,這里就是原因,當前時間跟上一次顯示廣告的時間相差超過ProcessMonitor.repeatedTime的值的時候,就會出現廣告。

我們來看一下repeatedTime的值是多少,進到ProcessMonitor類里面,值為1800000毫秒,也就是30分鐘才出現一次廣告,比起那些每次打開都會出現廣告的好多了,但是也阻擋不了我干掉廣告。

1162d5c783f4

顯示廣告條件

我們來看loginOrGlance方法里面的廣告相關代碼

if (Setting.getInstance().loadInt("display_ad") == 1)

{

if (System.currentTimeMillis() - Setting.getInstance().loadLong("ad_display_time") > ProcessMonitor.repeatedTime)

{

openGDTAD();

return;

}

initMainTabActivity();

return;

}

initMainTabActivity();

return;

可以看出,首先先判斷display_ad的值是否為1,如果不為1,就直接調用啟動主界面的initMainTabActivity()方法。

如果為1,在繼續判斷上一次顯示廣告的時間ad_display_time是否超過30分鐘,如果超過就顯示,沒有超過就啟動主界面。

所以,顯示廣告有兩個條件

display_ad的值為1

上一次顯示廣告的時間和現在的時間相差30分鐘

Hook方法

這里我們來介紹一下Hook所用到的一下Xposed里面的方法

findAndHookMethod方法,其參數對應為加載的類(Class>) + 方法名 + 參數類型(根據所Hook方法的參數的類型,即有多少個寫多少個,加上.class) + XC_MethodHook回調接口。

XC_MethodHook中定義了回調方法:

beforeHookedMethod(MethodHookParam param):被hook方法調用前執行,調用param.setResult可以跳過被Hook的方法。

afterHookedMethod(MethodHookParam param) : 被Hook方法調用后執行,調用param.setResult更改被hook方法的執行結果。

1162d5c783f4

通過上面分析,我們知道了所需要的Hook的兩個方法,這兩個值居然是存到本地SharedPreferences里面,那么我們修改就更容易了。

一個是Setting.getInstance().loadInt("display_ad"),既是Setting類里面的loadInt方法。

public int loadInt(String paramString)

{

return this.mSharedPreferences.getInt(paramString, -1);

}

一個是Setting.getInstance().loadLong("ad_display_time"),既是Setting類里面的loadLong方法。

public long loadLong(String paramString)

{

return this.mSharedPreferences.getLong(paramString, -1L);

}

驗證

首先我們來驗證一下我們上面的兩個條件是否正確,打開我們的Tutorial類,在handleLoadPackage方法里面實現我們的Hook。

我們先驗證30分鐘出現的條件,既然是要超過30分鐘,那么我們只需要將loadLong("ad_display_time")返回的值改為-1L,也就是afterHookedMethod(MethodHookParam param)方法里面修改,就可以實現每次啟動都能出現廣告界面了

public class Tutorial implements IXposedHookLoadPackage {

@Override

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

// 只對微博國際版進行操作

if (lpparam.packageName.equals("com.weico.international")) {

try {

// 獲取Setting類

Class> aClass = XposedHelpers.findClassIfExists("com.weico.international.activity.v4.Setting", lpparam.classLoader);

if (aClass == null) {

return;

}

// Hook方法

XposedHelpers.findAndHookMethod(aClass, "loadLong", String.class, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

String param1 = (String) param.args[0];

// 如果參數為ad_display_time的時候將返回值改為-1L

if (!TextUtils.isEmpty(param1) && param1.equals("ad_display_time")) {

Log.e("info", "com.weico.international---loadLong---ad_display_time");

param.setResult(-1L);

}

}

});

} catch (Throwable t) {

XposedBridge.log("Hook出錯" + t);

}

}

}

}

接著運行重啟手機,開機后,打開微博國際版。

1162d5c783f4

可以看出,現在每次打開都會有廣告,證明我們的猜測是正確的。

去除廣告

我們只需要將Setting.getInstance().loadInt("display_ad")的返回值改為-1就能實現去除廣告的效果了,下面看代碼

public class Tutorial implements IXposedHookLoadPackage {

@Override

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

// 只對微博國際版進行操作

if (lpparam.packageName.equals("com.weico.international")) {

try {

Class> aClass = XposedHelpers.findClassIfExists("com.weico.international.activity.v4.Setting", lpparam.classLoader);

if (aClass == null) {

return;

}

// Hook loadInt方法

XposedHelpers.findAndHookMethod(aClass, "loadInt", String.class, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

String param1 = (String) param.args[0];

// 如果參數為display_ad的時候將返回值改為-1

if (!TextUtils.isEmpty(param1) && param1.equals("display_ad")) {

Log.e("info", "com.weico.international---loadInt---display_ad");

param.setResult(-1);

}

}

});

// Hook loadLong方法

XposedHelpers.findAndHookMethod(aClass, "loadLong", String.class, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

String param1 = (String) param.args[0];

// 如果參數為ad_display_time的時候將返回值改為當前時間

if (!TextUtils.isEmpty(param1) && param1.equals("ad_display_time")) {

Log.e("info", "com.weico.international---loadLong---ad_display_time");

param.setResult(System.currentTimeMillis());

}

}

});

} catch (Throwable t) {

XposedBridge.log("Hook出錯" + t);

}

}

}

}

接著運行重啟手機,開機后,打開微博國際版。

1162d5c783f4

可以看出,再也沒有廣告了。

總結

這次使用Xposed實踐,來去除微博國際版的啟動廣告,可以說是收獲挺大的,Hook到所調用的方法,然后里面進行我們自己的操作,關鍵就是在于beforeHookedMethod和afterHookedMethod這兩個方法里面實現的操作。

Github

Github地址在此奉上:XposedRemoveAd,歡迎star

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375885.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴿巢原理

鴿巢原理: n1個鴿子放入n個窩中,至少有一個窩含有兩只鴿子 Find a multipleTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5590 Accepted: 2434 Special JudgeDescription The input contains N natural (i.e. positive integer) numbers…

linux命令:vim文件操作命令、新建用戶,查看用戶列表,chown命令

命令 簡單說明 :w 保存編輯后的文件內容,但不退出vim編輯器。這個命令的作用是把內存緩沖區中的數據寫到啟動vim時指定的文件中。 :w! 強制寫文件,即強制覆蓋原有文件。如果原有文件的訪問權限不允許寫入文件,例如,原有的文件…

cocos2d-x android 環境搭配,cocos2d-x?Android環境配置問題和解決方法

1.前提:下載安裝Cygwin,并已經在cygwin\home\admin(計算機用戶名)下的.bash_profile中完成如下配置:NDK_ROOT /cygdrive/d/cocos2dxdev/andrid-ndk-r8e//NDK安裝位置export NDK_ROOT問題:運行cygwin.exe.錄入如下的第一行數據后,沒…

jQuery 1.9 移除了 $.browser 的替代方法

授權方式:署名,非商業用途,保持一致,轉載時請務必以超鏈接(http://www.fwolf.com/blog/post/35)的形式標明文章原始出處和作者信息及本聲明。 jQuery 從 1.9 版開始,移除了 $.browser 和 $.browser.version &#xff0…

基于QTcpSocket和QTcpServer的Tcp通訊以及QDataStream序列化數據

最近要在QT下開發Tcp通訊,發送序列化數據以便于接收。 這里涉及到幾個問題: 1.QTcpSocket、QTcpServer的通訊 2.QDataStream序列化數據 多的不說,直接上干貨!!! 客戶端: tcpclient.h 1 #ifndef …

android mina分析,Android與Mina整合

最近想在自己做的安卓手機應用中加入即時聊天功能,于是想到了用Mina來實現,也是由于自己想著偷懶,借用了官方的example中chat的相關代碼,經過一番改造,很快就能在java環境中正常運行了。確認沒問題后,將cli…

棧的應用--括號匹配的檢驗

算法中設置一個棧,每次讀入一個括號,若是右括號,則或者與置于棧頂的括號匹配,或者是不合法的情況,若是左括號,則入棧。若算法結束,棧是空的,則括號合法。 括號匹配函數 Status bra…

node.js 初體驗

node.js 初體驗 2011-10-31 22:56 by 聶微東, 174545 閱讀, 118 評論, 收藏, 編輯 PS: ~ 此篇文章的進階內容在為《Nodejs初階之express》 ~ 2014/09/24 更新《Express 4.X 啟航指南》 歡迎閱讀和評論:) 最近寫的文章收到許多朋友的反饋,感謝大家的支持和建議&#…

Qt之模型/視圖(實時更新數據)

上兩節簡單介紹了Qt中對于模型/視圖的編程,大部分助手里說的很清楚了,現在就開始實戰部分吧! 在實際應用中,視圖展示的數據往往并非一成不變的,那么如何實時更新成了一個很重要的問題!功能:&am…

android 動態生成fragment,Android動態加載fragment(fragment復用)

【實例簡介】Android動態加載fragment(fragment復用)【實例截圖】【核心代碼】fm_reuse└── fm_reuse├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ └── example│ │ └── fm_reuse│ …

Linux內核3.0移植并基于Initramfs根文件系統啟動

Linux內核移植與啟動 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉編譯器:buildroot-2012.08 1.linux內核基礎知識 首先,磨刀不誤砍柴工。在動手進行linux內核移植之前,我們有必要對linux內核進行一定的了解。…

操作系統上機作業--實現shell(2)(多進程)

sh2.c: 實現shell程序,要求在第1版的基礎上,添加如下功能 ? 實現文件重定向 ? $ echo hello >log ? $ cat log ? Hello 實現思路: 和sh1.c相比,主要是修改了cmd函數的實現過程。通過循環找出重定向符號"&g…

當泛型方法推斷,擴展方法遇到泛型類型in/out時。。。

說到泛型方法&#xff0c;這個是.net 2.0的時候引入的一個重要功能&#xff0c;c#2.0也對此作了非常好的支持&#xff0c;可以不需要顯試的聲明泛型類型&#xff0c;讓編譯器自動推斷&#xff0c;例如&#xff1a; 1 void F<T>(T value){} 2 //... 3 int i 0; 4 F(i); 此…

AOP相關

實現AOP的技術&#xff0c;主要分為兩大類&#xff1a;一是采用動態代理技術&#xff0c;利用截取消息的方式&#xff0c;對該消息進行裝飾&#xff0c;以取代原有對象行為的執行&#xff1b;二是采用靜態織入的方式&#xff0c;引入特定的語法創建“方面”&#xff0c;從而使得…

操作系統上機作業--根據萊布尼茲級數計算PI(1)(多線程)

pi1.c: 使用2個線程根據萊布尼茲級數計算PI ? 萊布尼茲級數公式: 1 - 1/3 1/5 - 1/7 1/9 - ... PI/4 ? 主線程創建1個輔助線程 ? 主線程計算級數的前半部分 ? 輔助線程計算級數的后半部分 ? 主線程等待輔助線程運行結束后,將前半部分和后半部分相加實現思路&#xff1…

四種途徑將HTML5 web應用變成android應用

作為下一代的網頁語言&#xff0c;HTML5擁有很多讓人期待已久的新特性。HTML5的優勢之一在于能夠實現跨平臺游戲編碼移植&#xff0c;現在已經有很多公司在移動設備上使用HTML5技術。隨著HTML5跨平臺支持的不斷增強和智能手機的迅速普&#xff0c;HTML5技術有著非常好的發展前景…

操作系統上機作業--根據萊布尼茲級數計算PI(2)(多線程)

pi2.c: 使用N個線程根據萊布尼茲級數計算PI ? 與上一題類似&#xff0c;但本題更加通用化&#xff0c;能適應N個核心&#xff0c;需要使用線程參數來實現 ? 主線程創建N個輔助線程 ? 每個輔助線程計算一部分任務&#xff0c;并將結果返回 ? 主線程等待N個輔助線程…

html 16進制 轉換成字符串,js 字符串和16進制的互相轉換

字符串轉16進制function strToHexCharCode(str) {if(str "")return "";var hexCharCode [];hexCharCode.push("0x");for(var i 0; i < str.length; i) {hexCharCode.push((str.charCodeAt(i)).toString(16));}return hexCharCode.join(&qu…

數組以及冒泡排序

數組 1、概念&#xff1a;可以幫我一次聲明多個同類型的變量&#xff0c;這些變量再內存中是連續存儲的。 2、聲明語法&#xff1a;數據類型[] 數組名 new 數據類型[數組長度] 數組長度&#xff1a;一次要聲明的同類型的變量個數。是在定義這個數組的時候就確定了&#xf…

jQuery觸發a標簽的點擊事件無效

1 <a id"workFrame" href"pages/work.html" target"FrameBox">首頁</a> 2 3 $("#workFrame").tigger("click"); 上述的代碼&#xff0c;其實挺正常的&#xff0c;但是怎么也觸發不了a標簽的cli…