簡要說明下,目前市面上已經有幾款軟體可以實現掃描出手機裡那款軟體包含了廣告,甚至連廣告平台以及外掛程式數量都可以知道。
肯定的是android沒有提供一個API來告訴你是否有廣告,那怎麼實現的呢?
在這裡我拒絕直接上來就是代碼,代碼很簡單,我希望大家學會一種思維模式,而不是單純的copy。
以下是我在考慮這個問題的時候一些想法。
假設一:掃描APK內包含的3方廣告外掛程式jar,通過與收集到的jar做對比。
假設二:掃描manifest,對比一些廣告平台聲明的activity之類。
假設三:2點之前搞不定就睡覺。
好了,我首先想到的是假設一,我覺得他的可能性最大,因為我們知道,我們可以獲得一個APK的icon、packagename、permission等等等等的東西,沒錯,首先想到的就是packageinfo和ApplicationInfo兩個類,如果這裡面可以得到程式所有jar包的某些特徵,是不是就可以達到掃描廣告應用的效果了呢?
經過驗證,儘管裡面有如sharedLibraryFiles等方法,依然沒有得到想要的效果。轉戰假設二。
在假設二中,我嘗試得到某個程式的所有activity,這種方法雖然可行,可是明顯過於粗糙,顯然達不到市面上反廣告軟體的99%掃描率一說。再次失敗。
轉戰假設三。
繼續實驗:
1、把manifest的關於廣告需要的聲明全去掉,結果被查出廣告。
2、把jar包不add進工程,只放在libs下面,結果被查出廣告。
3、把jar包徹底刪掉,終於沒有被查了。
這樣又回到了假設一,他到底是怎麼把我的jar包搞到的,並且可以和他庫內的特徵對比。
直到12點,感覺搞不定了,準備睡覺。
睡覺前又想了一遍,為什麼,為什麼反廣告軟體不僅能知道你的廣告平台,更神的是載入了同一廣告平台的不同程式,他可掃描出你用了哪種形式的廣告。
突然有了假設四:掃描所有類檔案。
仔細想想,如果想得到上面效果,就必須知道你引用了那種廣告的類,才肯能判斷你加了什麼廣告。
進一步驗證,由於假設三中有一種情況是不add廣告的jar包也會被查,果斷的反編譯自己的APK,查看後瞭然,儘管項目中沒有add,可以在libs下的jar包毅然也被打進了工程,見。
注意對比,看到沒,waps的包還是被打進工程了,看到包裡的類眾猿應該明白了把,成功就在眼前,因為大多廣告平台由於要把SDK給開發人員用,都會把不同的廣告做成不同的類,再看類的命名就一切都明白了。
以防萬一自己類比了一個廣告SDK的包名、類名,果然被查出廣告。
至此得出結論:反廣告軟體通過掃描程式內所有類檔案,根據其包名、類名確定廣告平台以及廣告種類。
最後拋出一個問題,他是如何擷取到程式所有類名。由於packageinfo和ApplicationInfo都沒有關於所有類的描述,最後找到了方法,不廢話了,直接代碼給大家
<SPAN style="FONT-SIZE: 18px"> String path = "";
try {
path = getPackageManager().getApplicationInfo(
"com.xxx.xxx", 0).sourceDir;//獲得某個程式的APK路徑
} catch (NameNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
DexFile df = new DexFile(path);//傳如APK執行個體一個dexfile
Enumeration<String> s = df.entries();
while (s.hasMoreElements()) {//遍曆出所有類
String string = (String) s.nextElement();
Log.i("test", string);
}
Log.i("test", df.getName() + "");
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.i("test", "error" + e1.getMessage());
e1.printStackTrace();
}</SPAN>
String path = "";
try {
path = getPackageManager().getApplicationInfo(
"com.xxx.xxx", 0).sourceDir;//獲得某個程式的APK路徑
} catch (NameNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
DexFile df = new DexFile(path);//傳如APK執行個體一個dexfile
Enumeration<String> s = df.entries();
while (s.hasMoreElements()) {//遍曆出所有類
String string = (String) s.nextElement();
Log.i("test", string);
}
Log.i("test", df.getName() + "");
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.i("test", "error" + e1.getMessage());
e1.printStackTrace();
}
好了,得到了想要的,接下來就是和收集到的廣告平台做對比然後反饋給使用者了。
最後多說一下關於廣告的看法,首先我在另一個論壇說了要找應對反廣告策略,就不再繼續了,時間實在有限。有興趣的同學可自行研究。因為一些反廣告軟體也逐漸的收斂了,我自己而言對那些常駐通知欄的流氓廣告也極其討厭。
這又說明了一點,選擇一個有良心的廣告平台也是一個關鍵,近期央視曝光的一些垃圾平台偷使用者隱私也該死,也害苦各位程式猿。
運用上面的知識你可以更好的選擇廣告,當然你也可以製作一個反廣告軟體,只要不讓本就苦逼的程式猿更苦逼就好。