十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
最近app在推广过程中发现有大量的用户使用小号来领取邀请奖励,而小号的操作往往是利用多开软件开启应用分身来登录。为此,我需要区分出本体和克隆体。
创新互联是一家专业提供达拉特企业网站建设,专注与成都网站设计、成都网站建设、H5响应式网站、小程序制作等业务。10年已为达拉特众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
当今市面上流行的分身主要有三类
手机厂商实现的分身功能就是用这种方式实现的
检测方案:手上有个小米测试机,正好自带分身,通过getFileDir()的api试了下,在本体得到的是data/data/com.xxx.xxx/files,克隆体得到的是data/user/10/com.xxx.xxx/files
通过反编译apk,修改apk包名、签名等将apk伪装成另外一个app。市面上常见的第三方多开app大部分都是使用的这种技术。其特点是每次制作一个分身都需要时间拷贝、并且在应用列表中可以看到
检测方案:
跟上面一样,可以用getFileDir()来检测,只不过一个是data/data/com.xxx.xxx/files,另一个是data/data/com.xyz.xyz/files
虚拟一个操作系统,克隆体app在这个虚拟系统中运行,在应用列表不可见,代表产品:360分身大师
检测方案:
这个据说是唯一一种绕过getFileDir()的分身方式,确实这种方式让我耗费了很长时间,下面以360的分身大师举例,详细说下分析过程
PS:据说“平行空间”原理和“360分身大师”相同,经测试发现通过getDirFile()就可以判断出来,至此,分身检测基本完成
1、打开安卓手机的应用商店,输入鲁大师,在查询的结果中点击安装。
2、打开手机桌面上的鲁大师软件。
3、进入鲁大师软件以后点击右下角的工具箱按钮。
4、在出现的界面中找到屏幕检测,点击打开。
5、在出现的界面中点击坏点检测。
6、页面跳转后点击开始检测。
7、点击开始检测之后,手机屏幕会呈现蓝色,点击屏幕。
8、屏幕的颜色会开始变换,仔细查看屏幕上的颜色是否存在坏点。
9、继续点击屏幕依次出现红色、灰色、白色和黑色按钮,颜色变换中可以查看屏幕是否有坏点。
10、最终点击屏幕结束坏点检测,即完成了安卓手机的屏幕坏点检测。
链接: NewOrin_CSDN .
链接: yxb_yingu_CSDN .
链接: songzi1228_CSDN .
对于Android界面内容的更新只能由主线程来完成,然而主线程做耗时操作轻则造成界面的卡顿,严重会导致ANR(字面意思就是应用无响应,主线程没有在规定的时间内完成相应的工作),所以通常我们把耗时操作放在子线程中去进行,当我们创建的子线程想要更新界面,就需要子线程和主线程存在某种联系,而这个存在它就是handler。
更新内容的传递路径:子线程→消息队列→主线程→界面
补充说明:
那么Handler是怎么工作的呢?首先我们要认识三个类,分别是Message、MessageQueue、Looper。
Handler的主要工作包含消息的发送与接收过程。消息的发送通过post和send的一系列方法来实现,其实post的一系列方法最终还是通过send来实现的。当Handler发送了消息之后,MessageQueue里就插入了一条消息,然后MessageQueue就会返回这条消息给Looper,Looper接收到消息之后就开始处理了,最终消息由Looper交给Handler处理,即Handler的dispatchMessage方法会被调用,这时Handler就进入了处理消息的阶段,最后经过一系列的判断之后,就会调用handleMessage()方法了。
handler在哪里创建是没有关系的,重要的是handler发送的message到达了那个looper的消息队列,不管通过什么方法,只要让handler发送的消息到达UI线程Looper的消息队列,就能实现对UI线程的修改!
Handler跟Thread没有关系,它跟looper绑定,具体绑定那个looper,就要看用的那个构造方法,如果用的是new Handler()这个构造方法,会默认绑定它所在线程的looper和消息队列,如果用的是new Handler(Looper looper)的构造方法,就会与传进去的那个looper绑定。
最根本的目的是解决多线程迸发问题。
假如在一个Activity当中,有多个线程去更新UI,并且都没有加锁机制,那么会产生什么样子的问题?
答案是:更新界面错乱。
如果对更新UI的操作都进行加锁处理的话又会产生什么样子的问题?
答案是:性能下降。
出于对以上问题的考虑,android给我们提供了一套更新UI的机制,我们只需要遵循这样的机制就行了,而根本不用去关心多线程问题,所有的更新UI的操作,都是在主线程的消息队列当中去轮询处理的。
===== ** 子线程操作UI就一定会报错崩溃吗?** ====
打开 Google 搜索 “模拟器”,各种模拟器映入眼帘。“逍遥安卓-超强安卓模拟器”、“天天模拟器”、“网易MuMu”、“BlueStacks蓝叠安卓模拟器”、“夜神安卓模拟器”、“海马玩模拟器”、“51模拟器”当然还有功能强大的“Genymotion”……
经过上网查找,发现类似的帖子并不是太多,其中经过筛选,发现下面几个通用的解决方案。
于是把上面两种方案结合起来,就是:
经过在各个模拟器上测试,发现大多数都是可以检测出来的,只有各别模拟器不可以检测出来,其中包括“夜神安卓模拟器”。经过观察与对比发现,夜神安卓模拟器有一个和其他模拟器以及手机(手头的)不同的地方,就是“Build.SERIAL”是一个16位的字符串,而其他模拟器都是“unknow"或者"android",真机是 8 位的字符串,哈哈小样被我抓住了吧,于是修改了检测方法。
再次检测,成功识别!!
由于手头的手机有限,担心将手机识别错误,于是在 weTest 平台抽样对各品牌手机进行测试,果然不出所料,问题出现了。当测试到华为畅享5s的时候,竟然也被识别为模拟器。这下悲剧了,毕竟手机用户还是主要的,可不能错杀好人啊!!!经过观察,发现问题出现在上面自作聪明加的一个判断中 Build.SERIAL.length() 8 ,这个手机的 Build.SERIAL 也是 16 位,这可如何是好???
App 中有一个跳转到拨号盘的功能,当然在模拟器中无意点到这个按钮的时候,App 居然 Crash 了,这引起了我的注意,加为之前在真机上从来没有出现过问题,于是再次尝试点击这个按钮,它再次如我所料的 Crash 掉了。我实然灵机一动,对啊这是模拟器,不能拨打电话,所以 Crash 了,这不正是解决方案吗?(一不小心一个 Crash 竟然救了我)于是我在其他几个模拟器中也尝试点击这个按钮,结果是大部分都不支持这个操作,而且都是简单粗暴的直接 Crash 。虽然不能 100% 的识别,但大多数还是可以以此来做识别凭证的。
接下来再修改方法,慢着!大多数平板也是不支持拨打电话的,由于手头也是只有一台华为的平板,测试了一下,发现是跳转到保存联系页面,这个至少也不是 Crash,所以算通过了。
最终将几种方案整合修改后如下:
其实,我相信还有更好的方法去检测,比如通过一些硬件特性,或者模拟器不能模拟的其他特性,但目前还没有找到,如果你有好的办法,欢迎分享!!!