最近app在推廣過(guò)程中發(fā)現(xiàn)有大量的用戶使用小號(hào)來(lái)領(lǐng)取邀請(qǐng)獎(jiǎng)勵(lì),而小號(hào)的操作往往是利用多開(kāi)軟件開(kāi)啟應(yīng)用分身來(lái)登錄。為此,我需要區(qū)分出本體和克隆體。
創(chuàng)新互聯(lián)是一家專業(yè)提供達(dá)拉特企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為達(dá)拉特眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
當(dāng)今市面上流行的分身主要有三類
手機(jī)廠商實(shí)現(xiàn)的分身功能就是用這種方式實(shí)現(xiàn)的
檢測(cè)方案:手上有個(gè)小米測(cè)試機(jī),正好自帶分身,通過(guò)getFileDir()的api試了下,在本體得到的是data/data/com.xxx.xxx/files,克隆體得到的是data/user/10/com.xxx.xxx/files
通過(guò)反編譯apk,修改apk包名、簽名等將apk偽裝成另外一個(gè)app。市面上常見(jiàn)的第三方多開(kāi)app大部分都是使用的這種技術(shù)。其特點(diǎn)是每次制作一個(gè)分身都需要時(shí)間拷貝、并且在應(yīng)用列表中可以看到
檢測(cè)方案:
跟上面一樣,可以用getFileDir()來(lái)檢測(cè),只不過(guò)一個(gè)是data/data/com.xxx.xxx/files,另一個(gè)是data/data/com.xyz.xyz/files
虛擬一個(gè)操作系統(tǒng),克隆體app在這個(gè)虛擬系統(tǒng)中運(yùn)行,在應(yīng)用列表不可見(jiàn),代表產(chǎn)品:360分身大師
檢測(cè)方案:
這個(gè)據(jù)說(shuō)是唯一一種繞過(guò)getFileDir()的分身方式,確實(shí)這種方式讓我耗費(fèi)了很長(zhǎng)時(shí)間,下面以360的分身大師舉例,詳細(xì)說(shuō)下分析過(guò)程
PS:據(jù)說(shuō)“平行空間”原理和“360分身大師”相同,經(jīng)測(cè)試發(fā)現(xiàn)通過(guò)getDirFile()就可以判斷出來(lái),至此,分身檢測(cè)基本完成
1、打開(kāi)安卓手機(jī)的應(yīng)用商店,輸入魯大師,在查詢的結(jié)果中點(diǎn)擊安裝。
2、打開(kāi)手機(jī)桌面上的魯大師軟件。
3、進(jìn)入魯大師軟件以后點(diǎn)擊右下角的工具箱按鈕。
4、在出現(xiàn)的界面中找到屏幕檢測(cè),點(diǎn)擊打開(kāi)。
5、在出現(xiàn)的界面中點(diǎn)擊壞點(diǎn)檢測(cè)。
6、頁(yè)面跳轉(zhuǎn)后點(diǎn)擊開(kāi)始檢測(cè)。
7、點(diǎn)擊開(kāi)始檢測(cè)之后,手機(jī)屏幕會(huì)呈現(xiàn)藍(lán)色,點(diǎn)擊屏幕。
8、屏幕的顏色會(huì)開(kāi)始變換,仔細(xì)查看屏幕上的顏色是否存在壞點(diǎn)。
9、繼續(xù)點(diǎn)擊屏幕依次出現(xiàn)紅色、灰色、白色和黑色按鈕,顏色變換中可以查看屏幕是否有壞點(diǎn)。
10、最終點(diǎn)擊屏幕結(jié)束壞點(diǎn)檢測(cè),即完成了安卓手機(jī)的屏幕壞點(diǎn)檢測(cè)。
鏈接: NewOrin_CSDN .
鏈接: yxb_yingu_CSDN .
鏈接: songzi1228_CSDN .
?對(duì)于Android界面內(nèi)容的更新只能由主線程來(lái)完成,然而主線程做耗時(shí)操作輕則造成界面的卡頓,嚴(yán)重會(huì)導(dǎo)致ANR(字面意思就是應(yīng)用無(wú)響應(yīng),主線程沒(méi)有在規(guī)定的時(shí)間內(nèi)完成相應(yīng)的工作),所以通常我們把耗時(shí)操作放在子線程中去進(jìn)行,當(dāng)我們創(chuàng)建的子線程想要更新界面,就需要子線程和主線程存在某種聯(lián)系,而這個(gè)存在它就是handler。
更新內(nèi)容的傳遞路徑:子線程→消息隊(duì)列→主線程→界面
補(bǔ)充說(shuō)明:
那么Handler是怎么工作的呢?首先我們要認(rèn)識(shí)三個(gè)類,分別是Message、MessageQueue、Looper。
Handler的主要工作包含消息的發(fā)送與接收過(guò)程。消息的發(fā)送通過(guò)post和send的一系列方法來(lái)實(shí)現(xiàn),其實(shí)post的一系列方法最終還是通過(guò)send來(lái)實(shí)現(xiàn)的。當(dāng)Handler發(fā)送了消息之后,MessageQueue里就插入了一條消息,然后MessageQueue就會(huì)返回這條消息給Looper,Looper接收到消息之后就開(kāi)始處理了,最終消息由Looper交給Handler處理,即Handler的dispatchMessage方法會(huì)被調(diào)用,這時(shí)Handler就進(jìn)入了處理消息的階段,最后經(jīng)過(guò)一系列的判斷之后,就會(huì)調(diào)用handleMessage()方法了。
handler在哪里創(chuàng)建是沒(méi)有關(guān)系的,重要的是handler發(fā)送的message到達(dá)了那個(gè)looper的消息隊(duì)列,不管通過(guò)什么方法,只要讓handler發(fā)送的消息到達(dá)UI線程Looper的消息隊(duì)列,就能實(shí)現(xiàn)對(duì)UI線程的修改!
??Handler跟Thread沒(méi)有關(guān)系,它跟looper綁定,具體綁定那個(gè)looper,就要看用的那個(gè)構(gòu)造方法,如果用的是new Handler()這個(gè)構(gòu)造方法,會(huì)默認(rèn)綁定它所在線程的looper和消息隊(duì)列,如果用的是new Handler(Looper looper)的構(gòu)造方法,就會(huì)與傳進(jìn)去的那個(gè)looper綁定。
最根本的目的是解決多線程迸發(fā)問(wèn)題。
假如在一個(gè)Activity當(dāng)中,有多個(gè)線程去更新UI,并且都沒(méi)有加鎖機(jī)制,那么會(huì)產(chǎn)生什么樣子的問(wèn)題?
答案是:更新界面錯(cuò)亂。
如果對(duì)更新UI的操作都進(jìn)行加鎖處理的話又會(huì)產(chǎn)生什么樣子的問(wèn)題?
答案是:性能下降。
出于對(duì)以上問(wèn)題的考慮,android給我們提供了一套更新UI的機(jī)制,我們只需要遵循這樣的機(jī)制就行了,而根本不用去關(guān)心多線程問(wèn)題,所有的更新UI的操作,都是在主線程的消息隊(duì)列當(dāng)中去輪詢處理的。
===== ** 子線程操作UI就一定會(huì)報(bào)錯(cuò)崩潰嗎?** ====
打開(kāi) Google 搜索 “模擬器”,各種模擬器映入眼簾。“逍遙安卓-超強(qiáng)安卓模擬器”、“天天模擬器”、“網(wǎng)易MuMu”、“BlueStacks藍(lán)疊安卓模擬器”、“夜神安卓模擬器”、“海馬玩模擬器”、“51模擬器”當(dāng)然還有功能強(qiáng)大的“Genymotion”……
經(jīng)過(guò)上網(wǎng)查找,發(fā)現(xiàn)類似的帖子并不是太多,其中經(jīng)過(guò)篩選,發(fā)現(xiàn)下面幾個(gè)通用的解決方案。
于是把上面兩種方案結(jié)合起來(lái),就是:
經(jīng)過(guò)在各個(gè)模擬器上測(cè)試,發(fā)現(xiàn)大多數(shù)都是可以檢測(cè)出來(lái)的,只有各別模擬器不可以檢測(cè)出來(lái),其中包括“夜神安卓模擬器”。經(jīng)過(guò)觀察與對(duì)比發(fā)現(xiàn),夜神安卓模擬器有一個(gè)和其他模擬器以及手機(jī)(手頭的)不同的地方,就是“Build.SERIAL”是一個(gè)16位的字符串,而其他模擬器都是“unknow"或者"android",真機(jī)是 8 位的字符串,哈哈小樣被我抓住了吧,于是修改了檢測(cè)方法。
再次檢測(cè),成功識(shí)別??!
由于手頭的手機(jī)有限,擔(dān)心將手機(jī)識(shí)別錯(cuò)誤,于是在 weTest 平臺(tái)抽樣對(duì)各品牌手機(jī)進(jìn)行測(cè)試,果然不出所料,問(wèn)題出現(xiàn)了。當(dāng)測(cè)試到華為暢享5s的時(shí)候,竟然也被識(shí)別為模擬器。這下悲劇了,畢竟手機(jī)用戶還是主要的,可不能錯(cuò)殺好人?。。?!經(jīng)過(guò)觀察,發(fā)現(xiàn)問(wèn)題出現(xiàn)在上面自作聰明加的一個(gè)判斷中 Build.SERIAL.length() 8 ,這個(gè)手機(jī)的 Build.SERIAL 也是 16 位,這可如何是好???
App 中有一個(gè)跳轉(zhuǎn)到撥號(hào)盤的功能,當(dāng)然在模擬器中無(wú)意點(diǎn)到這個(gè)按鈕的時(shí)候,App 居然 Crash 了,這引起了我的注意,加為之前在真機(jī)上從來(lái)沒(méi)有出現(xiàn)過(guò)問(wèn)題,于是再次嘗試點(diǎn)擊這個(gè)按鈕,它再次如我所料的 Crash 掉了。我實(shí)然靈機(jī)一動(dòng),對(duì)啊這是模擬器,不能撥打電話,所以 Crash 了,這不正是解決方案嗎?(一不小心一個(gè) Crash 竟然救了我)于是我在其他幾個(gè)模擬器中也嘗試點(diǎn)擊這個(gè)按鈕,結(jié)果是大部分都不支持這個(gè)操作,而且都是簡(jiǎn)單粗暴的直接 Crash 。雖然不能 100% 的識(shí)別,但大多數(shù)還是可以以此來(lái)做識(shí)別憑證的。
接下來(lái)再修改方法,慢著!大多數(shù)平板也是不支持撥打電話的,由于手頭也是只有一臺(tái)華為的平板,測(cè)試了一下,發(fā)現(xiàn)是跳轉(zhuǎn)到保存聯(lián)系頁(yè)面,這個(gè)至少也不是 Crash,所以算通過(guò)了。
最終將幾種方案整合修改后如下:
其實(shí),我相信還有更好的方法去檢測(cè),比如通過(guò)一些硬件特性,或者模擬器不能模擬的其他特性,但目前還沒(méi)有找到,如果你有好的辦法,歡迎分享?。?!