編輯:關於Android編程
簡要說明下,目前市面上已經有幾款軟件可以實現掃描出手機裡那款軟件包含了廣告,甚至連廣告平台以及插件數量都可以知道。
肯定的是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();
}
好了,得到了想要的,接下來就是和收集到的廣告平台做對比然後反饋給用戶了。
最後多說一下關於廣告的看法,首先我在另一個論壇說了要找應對反廣告策略,就不再繼續了,時間實在有限。有興趣的同學可自行研究。因為一些反廣告軟件也逐漸的收斂了,我自己而言對那些常駐通知欄的流氓廣告也極其討厭。
這又說明了一點,選擇一個有良心的廣告平台也是一個關鍵,近期央視曝光的一些垃圾平台偷用戶隱私也該死,也害苦各位程序猿。
運用上面的知識你可以更好的選擇廣告,當然你也可以制作一個反廣告軟件,只要不讓本就苦逼的程序猿更苦逼就好。
項目地址:https://github.com/JeasonWong/SlackLoadingView老規矩,先上效果。圖好大。。說下第一眼看到這個動畫後的思路:+兩根平
當我們寫商城類的項目的時候,一般都會有加入購物車的功能,加入購物車的時候會有一些拋物線動畫,具體代碼如下:實現效果如圖:思路: 確定動畫的起終點 在起終點之間使用二次
最近公司要把百度地圖集成的項目中,於是我就研究了一天百度地圖的SDK,當前的版本:Android SDK v3.0.0 。 雖然百度地圖網上相關代碼比較多,
前言:本篇文章主要學習UI性能優化。1. 應用UI卡頓的原理1.1 原理用戶感覺到卡頓的原理就是在渲染時出現了掉幀。Android系統要求 1s內渲染60幀,即渲染1幀必