请问:安卓手机测速仪应用哪款可以后台怎么关闭运行的程序在前台可以显示速度悬浮窗?谢谢!

查看: 4464|回复: 10
求助:请问如何去掉DSA在导航画面上的速度显示浮动窗?
综合发帖模板
适用系统(可多选):
中国 & 中国
支持分辨率(可多选):
资源分类(可多选):
如题求助:请问如何去掉DSA在导航画面上的速度显示浮动窗?
在导航画面中悬浮窗有时候会挡住导航软件上的一些选择按钮。故想隐藏不显示DSA显示的车速。
请问是改“resource.ini”中的下面的数据吗:
主_当前车速_百位&&={340,290}
主_当前车速_十位&&={385,290}
主_当前车速_个位&&={425,290}
主_当前车速_0& &=主画面\当前车速数字\0.png
主_当前车速_1& &=主画面\当前车速数字\1.png
主_当前车速_2& &=主画面\当前车速数字\2.png
主_当前车速_3& &=主画面\当前车速数字\3.png
主_当前车速_4& &=主画面\当前车速数字\4.png
主_当前车速_5& &=主画面\当前车速数字\5.png
主_当前车速_6& &=主画面\当前车速数字\6.png
主_当前车速_7& &=主画面\当前车速数字\7.png
主_当前车速_8& &=主画面\当前车速数字\8.png
主_当前车速_9& &=主画面\当前车速数字\9.png
本帖最后由 hjpsu 于
13:35 编辑
主_当前车速_百位&&={1340,290}
主_当前车速_十位&&={1385,290}
主_当前车速_个位&&={1425,290}
主_当前车速_0& &=主画面\当前车速数字\0.png
主_当前车速_1& &=主画面\当前车速数字\1.png
主_当前车速_2& &=主画面\当前车速数字\2.png
主_当前车速_3& &=主画面\当前车速数字\3.png
主_当前车速_4& &=主画面\当前车速数字\4.png
主_当前车速_5& &=主画面\当前车速数字\5.png
主_当前车速_6& &=主画面\当前车速数字\6.png
主_当前车速_7& &=主画面\当前车速数字\7.png
主_当前车速_8& &=主画面\当前车速数字\8.png
主_当前车速_9& &=主画面\当前车速数字\9.png
这种事这样处理最简单,一郎。哈哈!{:happy:}
有个配置参数,改一下就行了,可能叫做always_show_overlay=0,你自己试试看
谢谢热心的大侠们
比较少折腾dsa这些设置。谢谢啦
本帖最后由 sdsxl 于
14:22 编辑
是可以用手指拖动的!
本帖最后由 maya008 于
14:15 编辑
#是否永久显示速度悬浮窗,若设为0不显示,设为1永久显示,设为2则只有dsa在后台时显示
always_show_overlay=0
另外给一些其他配置参数
#是否dsa启动自动加载地图,autoload可设置为1或者2,DSA收星后自动加载导航A或B,若不需自动加载可设为off
auto_loadnavi=off
#加载地图的方式,1:不做检测(使用一机多图建议设为1),2:只允许加载一个地图(并且退出DSA时检测地图是否已退出)
loadnavi_style=1
#语音输出的方式,1为默认方式,2为兼容模式(某些机器上dsa无法正常发音可设置为2)
voice_style=1
#保留内存,默认为保留1m给系统存储,如果调整为off则不调整存储内存,某些机器上无法运行时需要打开此选项。
memreserv=1
#全局最大限速值,当车辆超过这个速度时会提示“超速”
speedlimit=140
#是否自动全屏,ppc智能手机可设置为1,普通导航仪建议设置为0
fullscreen=0
#是否永久显示速度悬浮窗,若设为0不显示,设为1永久显示,设为2则只有dsa在后台时显示
always_show_overlay=0
#速度悬浮窗的位置
overlay_pos=(13,78)
#设置是否显示主界面,设autohide为1则启动后不显示主界面,在后台运行
autohide=0
#是否记录轨迹,若为1则自动记录轨迹,请注意及时清理user目录下的文件
#设置音量,5为最大音量,0为静音,如果设置为off则不调整系统音量
sound_volume=off
#是否播报雷达异常,若设为1,则雷达断开连接时播报异常
reportradarerror=0
#gps速度补偿,调整此数值使得dsa显示和播报的速度与仪表盘车速相符(可为负值),不需要速度补偿请设为0
speed_compensation=4
#海拔高度的显示区域,可自定义显示的区域,文字大小为矩形的高度,
#默认{0,0,0,0}表示不显示,如高清屏设为{225,9,319,34}可显示,普清可设{115,7,189,19}
elevation_rect={0,0,0,0}
#是否自动判断当前时间选择皮肤
#如设为{6,18}表示早上6点-晚上18点使用白天皮肤(***.rsc),其他时间使用夜间皮肤(***n.rsc)
#必须有相应的白天和夜间皮肤文件,如800x480.rsc以及800x480n.rsc,若设置为off则不判断
auto_select_UI=off
楼上正解!
这个在DSA界面的系统设置--其他设置里是可以修改的,选择不显示重新启动一下DSA就可以了。
谢谢各位热心的朋友
其他设置,最下面一项,改一下,不显示。
Powered by加入应用集
云安装到手机
<button type="button" class="btn btn-default ex-btn-glyphicon hidden-xs" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-container="body" data-html="true" title="扫描二维码下载到手机" data-content="">二维码
这个就是在状态栏和下拉通知栏展示网速还有流量统计,付费版比免费版多的功能个人觉得用不上,所以大家直接用免费版就好,小编自己一直在用,要说缺点,小编觉得要是能把下拉通知栏里的隐藏就好了,因为我就想看个网速就行,但开发者没有给设置项
我的评分(未评分)
软件名称:网络测速仪:Internet Speed Meter
APK名称:com.internet.speed.meter
最新版本:1.4.8
支持ROM:2.3及更高版本
界面语言:简体中文
软件大小:2.73 M
更新日期:
开发者:DynamicApps
android.permission.ACCESS_NETWORK_STATE获取网络状态 获取网络信息状态,如当前的网络连接是否有效
android.permission.RECEIVE_BOOT_COMPLETED开机自动允许 允许程序开机自动运行
android.permission.ACCESS_WIFI_STATE获取WiFi状态 获取当前WiFi接入的状态以及WLAN热点的信息
com.android.vending.CHECK_LICENSE
加入应用集
网络测速仪Internet Speed Meter是一款实时显示流量并统计的应用,实时速度将显示在状态栏中,并可设置流量限制和提醒。
需要使用幸运破解:
分类标签:
- Fix for status bar icon sometimes disappears in lollipop
- Added translations for Ukrainian Language
更新版本:1.4.8
更新版本:1.4.7
更新版本:1.4.6
更新版本:1.4.3
更新版本:1.4.2
应该有更新了吧
1.4.8破解版
三星一切正常
7.0下怎么不动
这玩意儿有什么用?
这个好用吗
emui无法显示,只有图标
我直接用wifi万能钥匙开测[doge笑哭][笑哭再见]#(阴险)
统计已用流量也可以。。但是不能修改已用流量,,万一数据清除了,这个月就没法用了啊[w再见]
耗电真不是盖的,安卓5.1.1
有更新了 Android 7可用了
从通知栏多进几次 就会空白
就我一个人这样?
生了7,这货就不能用了
1+3的氢os不能在状态栏显示网速,只会出现在通知栏
给用一加的小伙伴们分享一下,用Internet Speed Meter可以,通知设优先,自启允许,省电排除,然后把阻止运行绿色守护等的都设置一下就没问题了,可以锁屏不显示[doge酷]
付费版装上闪退,免费版没问题。
手机红米3S,啥原因?
一加3,氢os好蛋疼,锁屏显示好丑,设置锁屏不显示没用,优先级不给最高通知栏又不显示,求问何解,:triumph::triumph:
氢os真的无解
求可以分app显示实时速率的程序,一直没找到
他说没有购买怎么回事
不显示4G网络的速度,有人遇到过么?
怎么才能让它不在通知栏里显示呢?5.0锁屏的时候真不好看…
点击清理内存就给关了,怎么办?
这个必须后台么
关键是免费版你又没上架
自己画了一个图标
真心不错,这玩意有个活动能被直接执行,比如用手势或实体键直接调用,相当于点击他通知栏里的通知弹出的即时速度,方便查找当前流量应用。然后把通知隐藏和应用加入绿色守护(无视状态),画面太美了。#(哈哈)
网络测速仪免费版
1.不需要Google服务
2.功能较少,但基础功能存在
3.点击通知栏不再有小窗口
下载链接...
为什么状态栏没有实时网速?
我的不能这样显示
这货不能显示应用耗的流量啊,唯一的不足
#(不高兴)跑了这么多
氢os一直在闪,进不去
我安装后居然在通知栏里显示,不是状态栏吗?咋回事
上免费版吧
不是测速仪吗
怎么变成流量记了
cm13闪退,安装谷歌框架也一样。
网页版有的
v5本来可以看到免费版本的,v6怎么没有了呢…
以前一直用免费版(听小编的了),现在换了下pro的 确实不错了…就是为什么说需要破解?
最新版没人帮忙破解了?
4.2安装不上是怎么回事?
这货耗电真不是盖的
有没有能分开显示各个程序当前网速的软甲啊?
比如我现在总网速200k/s,但不知道各个程序都占用了多少,能查到某个软件的网速
这货耗电有点吊
form>div>textarea" data-dock="left"
data-placement="top">
form').submit();">回复当前位置: >
> 手机测速软件
手机测速软件4G时代无非就比的就是网速,移动、联通、电信如何选择?下面小编为大家献上几款手机测速软件,像是数据会给大家最满意的答案。
14.5M推荐理由:Speedtest测速是一款简单的手机网速测试工具,打开应用后,可直接检测手机自带的移动网络或者手机连接的WiFi网络,简单易用版本:
3.7M推荐理由:网速测试:一款手机测试网络速率的软件。小编测了一下,居然有10M/s!!!感觉不错与电脑测出的差不多,你们也来晒晒速度把版本:
750KB推荐理由:WiFi测速:一款手机wifi测速工具,为您快速识别当前移动设备的网络情况,可以对当前设备使用的网络速度进行检测,轻松的为用户找到目前可用的更快的wifi,让用户的wifi冲浪更加便捷快速版本:
2.3M推荐理由:4G网络测速:一款手机网速测试软件,乃居家旅行必备测速神器版本:
877KB推荐理由:测速大师:一款非常实用的手机测速软件,能够在30秒内准确分析手机各种网络状态.包括网络稳定性、网速平均水平及峰值。让你对你的手机网速了如指掌,不再被运营商忽悠版本:
1.7M推荐理由:网速测试HD:一款实时网速测试工具,支持2G、3G、4G以及wifi测速。随时随地检测您的网速,轻轻一点,轻松搞定。版本:
1.7M推荐理由:网络测速仪:一款手机网速测试软件,信号满格玩不了游戏?轻松一点,测试你当前的手机网速。手机网络速度不满意?一键分享测试结果,将你得不爽大声喊出来,让运营商听到你得声音版本:
1.5M推荐理由:小蜜蜂测速:一款简洁而酷炫的网络测速工具,用来测试2G/3G、WIFI网络的网络速度,还可以查看手机的基本信息,包括IMEI、CELLID、MAC地址、IP地址等版本:
2.9M推荐理由:网速测试器:一款非常实用的测试手机wifi、2G、3G、4G网速的测试器!只要连接上你的网络,就可以测试你的网速了,非常精准哦版本:
10.3M推荐理由:加速宝原理是通过对有的页面压缩处理,比如淘宝的大图,等等处理达到节省流量的效果,编每个月流量用不完,低彩世界现在真的会受不了。不过这东东还是挺不错的,至少在网速加载方面提升了版本:
5.7M推荐理由:手机网速测试大师是一款手机网络测试软件,通过手机网速测试大师你可以直接测试你手机的网络速度,无论是WiFi还是手机移动网络都可以检测,让你更加了解你的手机网络版本:
3.8M推荐理由:手机网速app是一款实用系统应用,是显文工作室设计开发的手机网速测试工具,让大家可轻松的、随时随地检测您的网速版本:
3.0M推荐理由:网络大师app是一个小巧,快速的免费工具,用来分析网络,速度测试和增强网络接收。还可以检测WiFi安全,测试网络速度,检测局域网入侵,优化网络带宽,监控数据的使用和共享便携式热点版本:
645KB推荐理由:网速流量大管家app是科烨盈创科技推出的实用系统应用,是一款能够实时查看网速和流量的工具。网速流量大管家app旨让大家便捷的掌握当前网速情况、流量消耗信息版本:
1.0M推荐理由:网速悬浮窗app是一款手机系统工具应用,网速悬浮窗app为用户提供网速流量监控功能,用户可以在手机上清晰的看到网速情况以及流量使用情况,方便用户掌控流量动态版本:
881KB推荐理由:Wifi测网速app是一款实用系统软件,是深圳市耀德圣科技有限公司推出的网络测试功能。Wifi测网速app是是款让你快速获取当前手机网速情况、并检测使用网络数据的的手机app版本:
3.3M推荐理由:网速测试助手app是一款功能非常强大的网速测试软件。有了网速测试助手app,你可以随时随地掌控你手机网速情况,不管是3G、4G、wifi都可以,避免了有人蹭网的情况,非常实用版本:
6.2M推荐理由:网络测试助手app是一款实用系统应用,是佳胜信息科技旗下产品。网络测试助手app主要为用户提供网络实时监测服务,让你可便捷获取当前网速情况版本:
1.1M推荐理由:实时显示网速app是一款测网速的工具,有了这款应用,就可以随时了解网速的速度了,而且可以变大变小,随时随地移动,还自带DIY功能,快来体验一下吧版本:
6.9M推荐理由:氮气瓶app是专为网络加速打造的应用,能随时改变带宽的限制,有效提升上网速度,提升您上网的体验,更能购买各种加速产品,是您网络加速的好帮手版本:
12.5M推荐理由:电信上网助手app是专为手机上网打造的应用,能手机设定wifi优先级,支持手机测试网速,了解手机流量使用详情,更能二维码扫描查看宽带故障原因,是您手机上网使用WiFi的好帮手版本:
3.4M推荐理由:移动测速app是一款移动端网络测速专家。完美支持2G、3G、4G、Wi-Fi测速,为您提供更准确、更友好、更高性能的网速测试服务。想知道你的移动设备网速有多快,快来安装宽带发展联盟“移动测速”版本:
1.2M推荐理由:实时网速悬浮窗app是一款网速监控应用,用户可以通过软件快速查看当前网速情况,了解流量使用,为用户上网提供方便版本:
6.3M推荐理由:家庭宽带管理app是一款宽带管理应用,家庭宽带管理app为用户提供便捷的家庭宽带管理功能,包含宽带办理,宽带续费等,让用户轻松办理宽带服务版本:
1.4M推荐理由:网速监控大师是一款手机网速监控软件,网速监控大师是专门为网速不稳定、想实时了解网速的用户量身定做的产品,功能专一,精益求精版本:
1.6M推荐理由:网速监控悬浮窗app一款可以实时监控流量网速的测网速工具,网速快慢时刻捕捉。网速监控悬浮窗app是专门为想实时了解网速的用户量身定做的产品,操作简单,嵌入自然,功能专一,精益求精版本:
2.3M推荐理由:通知栏网速app是一款实时测速应用,通知栏网速app将网速显示在通知栏,方便用户随时了解当前网速,方便用户上网生活版本:
11.3M推荐理由:网速通app是一款测网速系统应用,网速通app可以帮助用户快速了解自己的网速,还能帮助站长了解网站页面的性能,帮助站长分析网站页面,让站长随时了解网站情况,改善网站浏览体验。版本:Android无需权限显示悬浮窗, 兼谈逆向分析app - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了44013字,被696人关注,获得了418个喜欢
Android无需权限显示悬浮窗, 兼谈逆向分析app
最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android.permission.SYSTEM_ALERT_WINDOW权限.
如下图, 截图是在使用Chrome时截的, 但是屏幕顶部却有UC的view浮在屏幕上. 我使用的是小米, 我并没有给UC授悬浮窗权限, 所以我看到这个悬浮窗时是很震惊的.
悬浮窗原理
做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要有一个服务运行在后台, 通过getSystemService(Context.WINDOW_SERVICE)拿到WindowManager, 然后向其中addView, addView第二个参数是一个WindowManager.LayoutParams, WindowManager.LayoutParams中有一个成员type, 有各种值, 一般设置成TYPE_PHONE就可以悬浮在很多view的上方了, 但是调用这个方法需要申请android.permission.SYSTEM_ALERT_WINDOW权限, 在很多机型上, 这个权限的名字叫悬浮窗, 比如小米手机上默认是禁用这个权限的, 有些恶意app会用这个权限弹广告, 而且很难追查是哪个应用弹的. 如果这个权限被禁用, 那么结果就是悬浮窗无法展示, 比如有道词典的复制查词功能, 在小米手机上经常没用, 其实是用户没有授权, 而且应用也没有引导用户给它打开授权.
现在UC能突破这个限制, 我很好奇它是怎么做到的.
Android开发有点蛋疼的地方就是太容易被反编译, 但有时这也成为我们研究别人app的一种手段.
使用apktool可以很轻松的反编译UC.
逆向别人的app, 比较关键的地方是怎么找代码, 因为代码基本上都是混淆的, 直接看肯定是看不懂的, 只能去找, 突破口一般在字符资源上, 比如我们看到上图中的快速搜索是UC的字符, 那么我们到res/values/strings.xml去找快速搜索, 就可以找到下面的内容
&string name="dark_search_banner_search"&快速搜索&/string&
这里我们拿到了快速搜索对应的名字dark_search_banner_search, Android在编译时会给每个资源分配一个id, 我们grep一下这个字符资源的名字就能知道id是多少, 一般在R.java, res/values/public.xml中有定义, 我直接到public.xml中找到了它的id
&public type="string" name="dark_search_banner_search" id="0x7f070049" /&
有了字符资源的id 0x7f070049, 我们再在代码里面grep一下这个id, 就能知道哪几个文件使用了这个字符资源.
之所以这么确定是在代码里, 是因为UC在我们复制的内容不同时, 悬浮窗标题会不一样, 一定是在代码里控制的, 结果如下
./com/uc/browser/b/f.smali
结果可能和大家不一样, 但是一定会找到一个被混淆的smali文件
这一部应该是最恶心的. smali代码和java代码的关系, 就像汇编代码和C++代码, 但是smali比汇编代码要容易理解的多, 不然也不会有那么多公司故意将代码写在C++层了.
虽然代码都被混淆了, 而且以我们不熟悉的方式出现, 但我们可以根据一些蛛丝马迹来判断代码的执行, 比如Framework的类和API是不能被混淆的, 这也是我们能看懂smali的原因之一, 我们可以结合这些面包屑来还原整个app代码, 当然这需要我们对smali很熟悉, 如果不熟悉smali, 至少要对Android的API熟悉. 因为有时实在看不懂, 我们要靠猜来还原一段代码的逻辑.
首先在代码里面找到0x7f070049, 发现了如下代码
const v3, 0x7f070049
invoke-virtual {v1, v3}, Landroid/content/res/R-&getString(I)Ljava/lang/S
move-result-object v1
iput-object v1, v0, Lcom/uc/browser/b/a;-&dpC:Ljava/lang/S
invoke-virtual {v0, v1}, Lcom/uc/browser/b/a;-&o(Landroid/graphics/drawable/D)V
:try_end_2
.catch Ljava/lang/E {:try_start_2 .. :try_end_2} :catch_0
goto/16 :goto_0
这是0x7f070049出现之后的一部分代码, 一路看下来, 其实都是在取值赋值, 就拿0x7f070049来说:
#使v3寄存器的值为0x7f070049
const v3, 0x7f070049
#v1是Resources实例, 调用它的getString方法, 方法的参数是v3中的值
invoke-virtual {v1, v3}, Landroid/content/res/R-&getString(I)Ljava/lang/S
#将结果存入v1寄存器
move-result-object v1
其实就是我们常用的getResources().getString其实如果一直这么看下去, 会发现毫无头绪, 剩下的代码一直在干差不多的事情, 所以我只截取了这部分, 注意最后一行
goto/16 :goto_0
也就是说, 有可能代码转到goto_0那儿去了, 那么看看goto_0那里又写了些什么
const-string v1, "window"
invoke-virtual {v0, v1}, Landroid/content/C-&getSystemService(Ljava/lang/S)Ljava/lang/O
move-result-object v0
check-cast v0, Landroid/view/WindowM
invoke-interface {v0}, Landroid/view/WindowM-&getDefaultDisplay()Landroid/view/D
move-result-object v0
invoke-virtual {v0}, Landroid/view/D-&getWidth()I
move-result v0
iget-object v1, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
iput v0, v1, Landroid/view/WindowManager$LayoutP-&width:I
iget-object v0, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
invoke-virtual {v10}, Lcom/uc/browser/b/a;-&getContext()Landroid/content/C
move-result-object v1
invoke-virtual {v1}, Landroid/content/C-&getResources()Landroid/content/res/R
move-result-object v1
const v2, 0x7f0d0022
invoke-virtual {v1, v2}, Landroid/content/res/R-&getDimension(I)F
move-result v1
float-to-int v1, v1
iput v1, v0, Landroid/view/WindowManager$LayoutP-&height:I
iget-object v0, v10, Lcom/uc/browser/b/a;-&mWindowManager:Landroid/view/WindowM
iget-object v1, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
invoke-interface {v0, v10, v1}, Landroid/view/WindowM-&addView(Landroid/view/VLandroid/view/ViewGroup$LayoutP)V
其实看到const-string v1, "window", 我们就应该有所警惕了, 这可能是关键代码了. 为什么这么说? 因为悬浮窗的实现里面, 需要获取WindowManager, 从而需要调用Context.getSystemService(Context.WINDOW_SERVICE), 而官方文档写了Context.WINDOW_SERVICE就是常量window. 而后我们看到代码中构造了WindowManager.LayoutParams, 最终在addView时传入.
看到这里, 我也觉得很奇怪, 我在悬浮窗原理中写的是我知道的实现悬浮窗的方法, UC的实现好像跟我调用的是相同的API, 也没看到反射之类可能展示奇技淫巧的代码, 为什么UC就可以不需要权限直接显示悬浮窗呢?
我认为addView的第二个参数WindowManager.LayoutParams可能是关键, 所以我需要知道UC是如何构造这个WindowManager.LayoutParams的.
由于是系统的类, 无法混淆, 直接搜索LayoutParams就找到了下面的代码
iget-object v1, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
这句话就是把v10的值赋给v1, v10是com/uc/browser/b/a的成员dpx, 那么打开com/uc/browser/b/a.smali看看dpx到底是怎么构造的.
.field dpx:Landroid/view/WindowManager$LayoutP
new-instance v0, Landroid/view/WindowManager$LayoutP
invoke-direct {v0}, Landroid/view/WindowManager$LayoutP-&&init&()V
iput-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
if-eqz p2, :cond_0
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/4 v1, 0x1
iput v1, v0, Landroid/view/WindowManager$LayoutP-&format:I
这里的代码就很简单的, 我最先看的是下面这段
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
这两句代码就是把WindowManager.LayoutParams.type字段设成0x7d5, 官网上写了0x是WindowManager.LayoutParams.TYPE_TOAST的值.
实际测试了一下, 将type设置成TYPE_TOAST果然有奇效, 不需要android.permission.SYSTEM_ALERT_WINDOW权限就能显示一个悬浮窗.
之前我一直以为调用了系统WindowManager.addView需要android.permission.SYSTEM_ALERT_WINDOW权限, 但实际上调用这个方法是不需要权限的, 在Android源码中有这么一段
public int checkAddPermission(WindowManager.LayoutParams attrs) {
int type = attrs.
if (type & WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
|| type & WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {
return WindowManagerImpl.ADD_OKAY;
String permission =
switch (type) {
case TYPE_TOAST:
// XXX right now the app process has complete control over
// this...
should introduce a token to let the system
// monitor/control what they are doing.
case TYPE_INPUT_METHOD:
case TYPE_WALLPAPER:
// The window manager will check these.
case TYPE_PHONE:
case TYPE_PRIORITY_PHONE:
case TYPE_SYSTEM_ALERT:
case TYPE_SYSTEM_ERROR:
case TYPE_SYSTEM_OVERLAY:
permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;
permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
if (permission != null) {
if (mContext.checkCallingOrSelfPermission(permission)
!= PackageManager.PERMISSION_GRANTED) {
return WindowManagerImpl.ADD_PERMISSION_DENIED;
return WindowManagerImpl.ADD_OKAY;
可以猜到这个方法是往系统的WindowManager里addView的时候做权限检查用的, 那个type就是我们在构造WindowManager.LayoutParams时赋值的type, 可以看到, 除了TYPE_TOAST, 其他都是要权限的, 而且非常喜感的是, 代码中的注释还说他们现在对这种type毫无限制, 应该引入标记来限制开发者.
处理兼容性
在这篇文章刚刚公布的时候, 就有同学反馈悬浮窗无法接收事件, 刚开始我并没有特别在意, 在廖祜秋大神做了一个demo之后, 这篇文章阅读量又涨了不少, 随即收到更多反馈事件的问题, 我今天晚上借了台MIUI V5 4.2.2实测了一下, 这台机器上UC的快速搜索功能也无法正常使用.
在这个ROM上表现为:使用TYPE_PHONE这类需要权限的type时, 只有在app处于前台时能显示悬浮窗, 且能正常接受触摸事件. 如果在应用详情里面授悬浮窗权限, 则工作完全正常.(这里是MIUI V5对悬浮窗的特殊处理, 现在的ROM, 包括MIUI V6上, 如果不授权, 无法显示任何悬浮窗)使用TYPE_TOAST这个不需要权限的type时, 悬浮窗正常显示, 但不能接受触摸事件.
我重新检查了一下smali代码, 发现UC是有分版本处理的, 不过因为smali代码的规则问题, 很难直接看出来, 我把分析过程写出来, 顺便解释一下smali的语法, 供大家以后逆向时拿来参考.
这次我是在OS X上反编译的, 所以变量名可能略有区别.
接着上面com/uc/browser/b/a.smali中查看dpx的构造过程, 代码如下:
.field dpx:Landroid/view/WindowManager$LayoutP
# direct methods
.method public constructor &init&(Landroid/content/CZ)V
new-instance v0, Landroid/view/WindowManager$LayoutP
invoke-direct {v0}, Landroid/view/WindowManager$LayoutP-&&init&()V
iput-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
if-eqz p2, :cond_0
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
为了方便说明, 我遵循smali的规则, 它用.line XX, 我们就说这是第XX行的代码.
上面是我之前分析得到UC使用的是TYPE_TOAST的地方, 证据就是第70行的const/16 v1, 0x7d5, 但是要知道, smali代码没有跳转的话, 就是从上往下执行, 我们看第69行的代码如下:
if-eqz p2, :cond_0
这句话的意思是如果p2等于0, 控制流跳转到cond_0, 否则就是继续顺序往下执行. 也就是说UC只有在p2 != 0条件满足的时候才会使用TYPE_TOAST, 我们看看cond_0对应的代码.
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/16 v1, 0x7d2
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
这里很简单, 就是将0x7d2赋给了type, 官网写了0x是TYPE_PHONE, 也就是说UC在某种情况下还是会用需要权限的老方法展示悬浮窗.
现在问题是条件是什么, 关键在p2, 在smali里面, 有两种寄存器命名规则, 一种叫v命名规则, 另一种是p命名规则, 当然只是命名规则而已, 在使用apktool时是可以选的. 这里是p命名规则.
我刚才分析的赋值过程, 所在的方法是下面这个, 我在刚才的代码片段中也保留了这个部分.
# direct methods
.method public constructor &init&(Landroid/content/CZ)V
这就是com/uc/browser/b/a的构造方法, dpx就是在构造方法里初始化的, .locals 7告诉我们这个方法中将出现7个局部寄存器(local register), 名字是v0, v1...v6, 而这个方法的参数有3个, 隐式告诉我们这个方法中将出现3个参数寄存器(parameter register), 名字分别是p0, p1, p2.
我是怎么知道这个方法有3个参数的呢. smali中非静态方法, 都隐含一个参数p0, 指向自身, 和Java中的this是一个意思, 而方法的参数写在括号里, 也就是Landroid/content/CZ, 其中Landroid/content/C很明显就是Android中的Context, 值存储在p1里, 而Z对应的是Android中的boolean, p2就是他了.
也就是说, type是用TYPE_TOAST还是用TYPE_PHONE, 取决于这个构造方法的第二个参数, 那到底谁构造了com/uc/browser/b/a呢? 可以去代码里面搜形如new-instance ***, Lcom/uc/browser/b/a;的代码. 更保险的做法是搜Lcom/uc/browser/b/a然后一个一个的看.
我在com/uc/browser/b/f.smali里面找到了下面的代码:
const/4 v0, 0x0
const/4 v1, 0x1
new-instance v3, Lcom/uc/browser/b/a;
iget-object v4, v9, Lcom/uc/browser/b/e;-&mContext:Landroid/content/C
sget v5, Landroid/os/Build$VERSION;-&SDK_INT:I
const/16 v6, 0x13
if-lt v5, v6, :cond_0
move v0, v1
invoke-direct {v3, v4, v0}, Lcom/uc/browser/b/a;-&&init&(Landroid/content/CZ)V
这段代码首先是创建了com/uc/browser/b/a的实例, 存储在v3中, 从另一处拿到了一个Context存储在v4中, 然后拿到了当前系统的android.os.Build.VERSION.SDK_INT存储在v5中, 此时将v6的值设为0x13, 千万别粗心看成13了, 我好几次都觉得这是13, 其实是十进制的19, 接下来是一个条件分支, 如果v5的值小于v6, 也就是说android.os.Build.VERSION.SDK_INT & 19, 直接跳转到cond_0, 否则先将v1的值赋给v0, 再顺序执行.
invoke-direct {v3, v4, v0}, Lcom/uc/browser/b/a;-&&init&(Landroid/content/CZ)V
就是调用v3的构造方法, 参数是v4和v0, 分析一下上面这段代码的逻辑就是:如果当前系统API level小于19, 那么第二个参数就是0, 否则就是1.
而这第二个参数的值就是之前我们分析的p2的值, UC只有在p2 != 0条件满足的时候才会使用TYPE_TOAST, 把整个逻辑串起来就是:
UC在API level &= 19的时候, 使用TYPE_TOAST, 其他情况使用TYPE_PHONE(需要权限).
可能是为了规避在低版本TYPE_TOAST不能接受事件的问题.
关于针对源代码的分析, 请看
我之前写的一个app有悬浮窗播放功能, 支持拖动窗口和点击暂停, 关闭窗口等等, 在4.4.4上实测功能正常.
无权限悬浮窗演示gif
感谢微博上关注的大神, 他做了个, 虽然交互和UC不同, 可以参考一下实现.
廖祜秋大神的demo
关于这个, 他也写了一篇
评论区的浮海大虾同学有更多补充如下:
TYPE_TOAST一直都可以显示, 但是用TYPE_TOAST显示出来的在2.3上无法接收点击事件, 因此还是无法随意使用.下面是我之前研究后台线程显示对话框的时候记得笔记, 大家可以看看我们项目中有需求需要在后台任务中显示Dialog, 项目最初的做法是用Activity模拟Dialog, 一个Activity已经承载了近20种Dialog, 代码混乱至极. 后来我发现Dialog可以通过改变Window Type实现不依赖Activity显示, 然后就很兴奋的要在使用这种方式来作为新的实现方式.最初WindowType是WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 可是这是悬浮窗了, MIUI会默认禁止(真他妈操蛋,也没有任何提示)最终放弃. 后来试着换成了WindowManager.LayoutParams.TYPE_TOAST, 起初效果很好,MIUI也不禁止了, 哪里都能显示, 这下开心了. 可是后来又发现在2.3上不能接收点击事件, 也就是说Dialog上的按钮不能点击, 这他妈就很操蛋了, 又放弃了. 又试了试其他的Type都不能满足需求, 结果如下:TYPE_SEARCH_BAR: 未知TYPE_ACCESSIBILITY_OVERLAY: 拒绝使用TYPE_APPLICATION: 只能配合Activity在当前APP使用TYPE_APPLICATION_ATTACHED_DIALOG: 只能配合Activity在当前APP使用TYPE_APPLICATION_MEDIA: 无法使用(什么也不显示)TYPE_APPLICATION_PANEL: 只能配合Activity在当前APP使用(PopupWindow默认就是这个Type)TYPE_APPLICATION_STARTING: 无法使用(什么也不显示)TYPE_APPLICATION_SUB_PANEL: 只能配合Activity在当前APP使用TYPE_BASE_APPLICATION: 无法使用(什么也不显示)TYPE_CHANGED: 只能配合Activity在当前APP使用TYPE_INPUT_METHOD: 无法使用(直接崩溃)TYPE_INPUT_METHOD_DIALOG: 无法使用(直接崩溃)TYPE_KEYGUARD_DIALOG: 拒绝使用TYPE_PHONE: 属于悬浮窗(并且给一个Activity的话按下HOME键会出现看不到桌面上的图标异常情况)TYPE_TOAST: 不属于悬浮窗, 但有悬浮窗的功能, 缺点是在Android2.3上无法接收点击事件TYPE_SYSTEM_ALERT: 属于悬浮窗, 但是会被禁止
现在我们都知道了如何在不申请权限的情况下显示悬浮窗, 我相信以中国Android开发者的脑洞, 一定会有很多有趣或恶心的功能被开发出来, 一方面我自己觉得这个东西很有用, 可以实现一些很神奇的功能, 另一方面又担心这个API被滥用, 最终不得不限制权限.
还有就是, 逆向分析仅用于学习, 不要干违法的事情.
本人技术有限, 如果文中有错误的欢迎指正, 以免误导他人
利益声明: 虽然我目前在UC实习, 但我并没有UC浏览器中文版的代码权限, 也不会将公司的代码分享给外人. 本文完全是靠我自己开发经验+逆向分析经验+Google完成, 在此之前没有看过UC浏览器的任何代码.
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 208221人关注
@IT 专题 由 IT大分类,转定位于IT·互联网行业观察与思考,数码产品极客体验。
主编:向右奔跑 http://www.ji...
· 182732人关注
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 137990人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 怎么关闭运行的程序 的文章

 

随机推荐