标签: Android

android的窗口机制分析——UI管理系统

android的窗口机制分析——UI管理系统

    Activity可以看做是整个Android系统的人机接口,它提供了一个窗口来绘制UI,每个Activity在启动时,我们都需要给它设置一个Content view,作为Activity所呈现的UI内容,这个过程是通过setContentView()方法来实现的。

众所周知,android系统中强化了view的概念,主要是体现在对view的管理上,Android中的view以2种形态存在,单一的View和多个View组成的ViewGroup。Content view是以ViewGroup的形式存在的,也就是说在一个Activity窗口中可以添加多个View,这样就实现了Android窗口系统的UI多样化。activity启动时给activity窗口设置的Content view 是从xml文件中解析出来的,那么android是怎么样对这个ContentView进行管理的呢,它的内部实现逻辑又是怎样的呢?

在进行分析之前,首先给出一个Activity的window和view系统的层级关系,这个层级关系就是在Activity设置完ContentView之后的状况。

如下图。

%title插图%num

下面来一一介绍各个层级的含义与作用

1.1  PhoneWindow

PhoneWindow是Android中的*基本的窗口系统,每个Activity 均会创建一个PhoneWindow对象,是Activity和整个View系统交互的接口。

1.2  DecorView

DecorView是当前Activity所有View的祖先,它并不会向用户呈现任何东西,它主要有如下几个功能,可能不全:

A.  Dispatch ViewRoot分发来的key、touch、trackball等外部事件;

B.  DecorView有一个直接的子View,我们称之为System Layout,这个View是从系统的Layout.xml中解析出的,它包含当前UI的风格,如是否带title、是否带process bar等。可以称这些属性为Window decorations。

C.  作为PhoneWindow与ViewRoot之间的桥梁,ViewRoot通过DecorView设置窗口属性。

1.3  System Layout

目前android根据用户需求预设了几种UI 风格,通过PhoneWindow通过解析预置的layout.xml来获得包含有不同Window decorations的layout,我们称之为System Layout,我们将这个System Layout添加到DecorView中,目前android提供了8种System Layout,如下图。

预设风格可以通过PhoneWindow方法requestFeature()来设置,需要注意的是这个方法需要在setContentView()方法调用之前调用。

1.4  Content Parent

Content Parent这个ViewGroup对象才是真真正正的ContentView的parent,我们的ContentView终于找到了寄主,它其实对应的是System Layout中的id为”content”的一个FrameLayout。这个FrameLayout对象包括的才是我们的Activity的layout(每个System Layout都会有这么一个id为”content”的一个FrameLayout)。

%title插图%num

1.5  Activity Layout

这个ActivityLayout便是我们需要向窗口设置的ContentView,现在我们发现其实它的地位很低,同时这一部分才是和user交互的UI部分,其上的几层并不能响应并完成user输入所期望达到的目的。

有了解逆向或者 Android 逆向的吗?

本人 android 开发三年多,*近技术主管问我愿不愿意做逆向方面的工作,目前公司需要做 pc 端的逆向,后期做 Android 端的逆向。我是转专业做的开发,编程语言学过 Java,kotlin,大学学过汇编和 C (已遗忘),我具体有两个问题想请教各位大佬:

1 、做逆向的前途怎么样? 2 、我目前的技术栈,转逆向好转吗?

27 条回复    2021-10-18 11:18:20 +08:00

bunnyblueair
    1

bunnyblueair   1 天前

PC 不了解 android 逆向挺窄的,曾经的业务从业者

2 把 看你兴趣 兴趣大就行,smali 语法还是很 easy 的 ,汇编*好好好掌握下,不然很受限

lxxiil
    2

lxxiil   1 天前 via iPhone

1 逆向只有灰产赚钱,写挂找数据破解软件。2 逆向要从 0 开始
XD2333
    3

XD2333   1 天前

正向做久了应该会接触一点逆向了。Android 的话是 smali,反编译软件生成出来的就是 Java,二进制就是汇编了,生成出来就是 C 代码。
逆向岗位不是很多。相对开发岗少很多很多。你 android 逆向可以了解一些,应该问题不大。
顺便找个工作,求捞。
BrettD
    4

BrettD   1 天前 via iPhone

安卓逆向应该需要学 ARM 汇编
mlsnatalie
    5

mlsnatalie   1 天前

@bunnyblueair 我对逆向不是太感兴趣,之前想的是能多学点东西也好,如果学逆向花费的时间,用来学点数据结构,算法,设计模式之类的对技术提高更好的话,我更愿意学点算法之类的知识。
mlsnatalie
    6

mlsnatalie   1 天前

@XD2333 主要是公司目前做的逆向,只要是 pc 端的,说后期会做 android,不知道以后会不会做。不知道你是做什么技术的?我公司招聘 java,大数据,算法,web,不过我公司不是什么大厂,技术人员两百人左右。
mlsnatalie
    7

mlsnatalie   1 天前

@lxxiil 听起来风险很大,如果从 0 开始的话,感觉没有学习的必要。
mlsnatalie
    8

mlsnatalie   1 天前

@BrettD 我看主要是学习 arm,c++,然后就看经验了。
bunnyblueair
    9

bunnyblueair   1 天前

@mlsnatalie 作为一个 developer 我之前经常被抓去给做逆向 因为我是之前部门里面做逆向*好的。短则一周,长则数月。很多产出是别人的,业务实际上跟我们没毛关系。通常产出 sdk,算法,文档。比较苦恼的是答辩的时候没法说,东西你虽然搞了,但是你不知道那个东西的业务产出是啥,ppt 自然也没法说 一季度三个月,一个月被抓去临时做逆向,绩效想象就不咋地。仅作参考,我比较失败
closedevice
    10

closedevice   1 天前

Android 你想没必要做,性价比太低,来自从经玩逆向玩到吐的娃~
mlsnatalie
    11

mlsnatalie   1 天前

@closedevice 看来都是真知灼见啊,谢谢
XD2333
    12

XD2333   1 天前

@mlsnatalie 逆向,还有安全开发。有坑的话我好发个简历看看。
mlsnatalie
    13

mlsnatalie   1 天前

@bunnyblueair 可能这个方向的确投入大产出小,我想我应该拒*这个建议。
mlsnatalie
    14

mlsnatalie   1 天前

@XD2333 我帮你留意,如果他们还招人,我就 @你。
playniuniu
    15

playniuniu   1 天前

安卓逆向分两部分,Java 部分代码的逆向,一般看看 Smali 的代码就行,比较简单。SO 部分代码的逆向,需要反汇编。现在主流 APP 的所有加密都是写在 SO 里面的,而且加壳的技术也越来越好,所以对于初学者来说,入门曲线非常陡峭,需要处理的东西很多,脱壳,反调试,Ollvm 反混淆等等,还必须熟练一些常用的工具,比如 IDA Pro, frida,unidbg,androidemu 等等。

总结一句话,就是需要熟悉计算机操作系统底层原理,尽量吃透安卓底层代码,熟悉各种脱壳技术,还要有非常多的耐心进行反调试和反混淆,收益不高,风险性大,如果不是特别爱好,不建议入坑。

ch2
    16

ch2   1 天前

我看刑
mlsnatalie
    17

mlsnatalie   1 天前

@playniuniu 我对逆向并没有什么爱好,看这么多大佬的发言,已经打消了我的想法了。
mlsnatalie
    18

mlsnatalie   1 天前

@ch2 看来不行啊,好可怕。
ch2
    19

ch2   1 天前

2 、我目前的技术栈,转逆向好转吗?
先问问你大学汇编学的如何?编译原理觉得难不难?
密码学成绩怎么样? C++熟不熟?计算机网络会的怎么样?
逆向对计算机基础知识要求是很高的,你基础如果真的很扎实完全可以找到薪酬前途更好的职位
mlsnatalie
    20

mlsnatalie   1 天前

@ch2 好心虚,这些学的都不咋样,并且现在也都基本忘光了。
muzuiget
    21

muzuiget   1 天前

我看刑,日子有判头。
ysc3839
    22

ysc3839   1 天前

个人只是业余爱好逆向,觉得前途不好,因为不太合法,其次感觉难度也挺大的,建议还是当业余爱好吧,如果连作为业余爱好都不喜欢的话建议放弃。
IsaacYoung
    23

IsaacYoung   1 天前 via iPhone

会掉头发 不搞
LinShiG0ng
    24

LinShiG0ng   3 小时 50 分钟前

不是热爱逆向的话不建议搞
XCG0000
    25

XCG0000   3 小时 12 分钟前

如果未来想走安全的路,可以搞逆向;纯业务开发类的公司,逆向通常是锦上添花,而且逆向前还有个很重要的动作叫脱壳,这个就难倒了 99.9%的人了;而且,逆向本身是被法律禁止的!
component
    26

component   2 小时 59 分钟前

牢里估计不少?
aino
    27

aino   1 小时 46 分钟前

是一条走向财富自由的路,少年你要不要选?

android 电视上有什么浏览器推荐?

android 电视上有什么浏览器推荐?

 

youyoumarco · 22 小时 6 分钟前 · 1202 次点击

各位,暂时不想投屏解决,还是想看看浏览器有什么推荐吗?

15 条回复    2021-10-14 21:04:22 +08:00

NEVERCODE
    1

NEVERCODE   21 小时 59 分钟前

我用的 via,加一个无线鼠标……
NGUTHONG
    2

NGUTHONG   21 小时 58 分钟前

都不好用,建议电视直接接 PC
alittlecat
    3

alittlecat   21 小时 56 分钟前

有办法在电视上看 b 站直播加弹幕吗
有一个古老的 b 站客户端 有弹幕 不支持直播
官方*新的云视听支持直播不支持弹幕
alittlecat
    4

alittlecat   21 小时 55 分钟前

手机版的安卓客户端 横屏支持的太差
chrome 直接播放 电视 cpu 撑不住 特别卡
好*望
lucher
    5

lucher   21 小时 45 分钟前

@alittlecat 接个迷你主机,比如 intel NUC
yinzhili
    6

yinzhili   20 小时 39 分钟前

VIA 可以试试
Leez088
    7

Leez088   19 小时 57 分钟前

@alittlecat b 站前段时间出了安卓 pad 版本,你可以用这个,我之前安装过,手机大会员可用,不过*好买个带飞鼠的蓝牙遥控器,我电视盒子上爱优腾装的都是安卓 pad 版,可以和手机共用 vip,就是有些操作得用鼠标
jowan
    8

jowan   19 小时 49 分钟前

飞视浏览器
MLawliet
    9

MLawliet   17 小时 40 分钟前 via Android

Firefox TV 版
alittlecat
    10

alittlecat   17 小时 27 分钟前

@Leez088 感谢 晚上试一下
suixn
    11

suixn   15 小时 48 分钟前

百度贴吧 bilibilitv
电视版本,有弹幕
suyuyu
    12

suyuyu   15 小时 27 分钟前

chrome 怎么了吗?
burby
    13

burby   15 小时 12 分钟前 via iPhone

apple tv 就没有这个烦恼,因为根本没有浏览器
ccloudk
    14

ccloudk   14 小时 50 分钟前

fire TV 自带的 silk browser 挺好用,不过局限于 Amazong 产品了。
试试 Firefox,有鼠标就用 EDGE
Cielsky
    15

Cielsky   12 小时 41 分钟前 via Android

鉴于有播放视频需求,alook 吧,横屏也凑合。
纯浏览 via 就够了

等 windows 11 开始正式支持 android app

等 windows 11 开始正式支持 android app 了,是不是可以把国内各种毒瘤转移到这个官方的安卓环境了

 

AndyLuo · 16 小时 52 分钟前 · 1903 次点击

现在把各种国内程序全部放在 vmware 的虚拟机里面,电脑倒是没有性能负担,但要说不臃肿那是骗人的,而且如果 windows 虚拟机开着我这边还会导致看视频音视频不同步。 等正式支持 android 了,像什么 qq 、微信这种是不是就不用单独再开个虚拟机了,资源占用也会少许多

23 条回复    2021-10-14 09:42:08 +08:00

sprite82
    1

sprite82   16 小时 44 分钟前

没理解,qq 微信不是有电脑版的吗?为什么要用 win11 搞安卓版,你在安卓子系统上登陆了,手机上就无法在线了。就算为了防止窃取隐私,等你手机重新登录 不还是会继续窃取?
raysonx
    2

raysonx   16 小时 44 分钟前   ❤️ 6

先预测一波:毒瘤会检测虚拟机,禁止在非手机上运行。
whenov
    3

whenov   16 小时 41 分钟前

感觉可能性不大。初期会遇到各种兼容性问题,中后期则会被针对性屏蔽。希望被打脸
itechnology
    4

itechnology   16 小时 37 分钟前

估计会被针对性屏蔽,我记得某些 APP 在安卓模拟器上是服务正常运行的。
alexkkaa
    5

alexkkaa   16 小时 35 分钟前 via Android

这玩意就一个虚拟机而已 你拿个模拟器试试有几个不是屏蔽了
yunyuyuan
    6

yunyuyuan   16 小时 34 分钟前

产品是根据需求来的,你首先要保证大部分人都觉得毒瘤是“毒瘤”,就和手机摄像头一样,我不喜欢那么多摄像头,但是我毕竟不是多数
ruixue
    7

ruixue   16 小时 30 分钟前   ❤️ 1

可以联动一下刚发的新鲜的帖子:
“微信因为『使用微信外挂、非官方客户端或模拟器』被限制登录” /t/807568
所以还是不要太乐观了
coderluan
    8

coderluan   16 小时 29 分钟前

比起模拟器, 这个其实可以参考 m1 电脑运行手机 app 的情况.
blueboyggh
    9

blueboyggh   16 小时 24 分钟前 via Android

国产软件对你电脑造成的性能负担,比开虚拟机还大吗?
YUX
    10

YUX   16 小时 23 分钟前   ❤️ 1

用安卓手机的 work profile 是目前*完美的方案
https://play.google.com/store/apps/details?id=com.oasisfeng.island
goodhellonice
    11

goodhellonice   16 小时 21 分钟前

@coderluan #8 想问一下 m1 运行 app 现在效果如何?
GiftedJarvis
    12

GiftedJarvis   16 小时 17 分钟前

@sprite82 Win 平台的 QQ 前几天被爆出会扫描用户所有浏览器的历史记录和部分与 QQ 无关的用户个人文件
AndyLuo
    13

AndyLuo   15 小时 55 分钟前   ❤️ 1

@yunyuyuan 事实是大部分人也并不觉得这些大厂国产程序是毒瘤,认为毒瘤可能仅限于搞程序或技术还不太嫌麻烦的人。(例如 v2 或其他科技 /技术网站
sprite82
    14

sprite82   15 小时 3 分钟前

@GiftedJarvis 这个比较久了吧,我记得改了的,不过我现在主要是用火绒限制他们访问无关目录
j421037
    15

j421037   14 小时 56 分钟前

我怎么觉得楼主有点脑残 WIN11 跑你说的这些安卓版应用有什么意义
aLazarus
    16

aLazarus   14 小时 6 分钟前

@goodhellonice app store 商店的部分应用,比如饿了么会闪退,如果用触控板的话,体验良好
FrankAdler
    17

FrankAdler   10 小时 15 分钟前

你装个 Sandboxie 吧,把毒瘤软件跑在沙盒里就行了,我目前在里面跑 QQ,迅雷都没啥问题
dingwen07
    18

dingwen07   6 小时 19 分钟前

我倒是更期待它们处 Linux 版,然后把它们关进 WSLg 里面去
dingwen07
    19

dingwen07   6 小时 18 分钟前

@goodhellonice #11 *大多数国产流氓软件都从 MAS 移除了,无法安装。
cathedrel
    20

cathedrel   5 小时 40 分钟前

@YUX 这玩意*好的地方就在于可以完全冻结这个 work profile,里面所有的 APP 都不再运行了,等于一个官方大冰箱,适合不能 root 的手机,但是,work profile 并不能阻止毒瘤们获取手机的关键信息,比如 IMEI 等等
fucku
    21

fucku   1 小时 42 分钟前

@FrankAdler #17 QQprotect 用 sandboxie 怎么搞?
goodhellonice
    22

goodhellonice   20 分钟前

@dingwen07 #19 好的 谢谢。。。
Vegetables
    23

Vegetables   几秒前 via Android

等正式出来并且修复 AMD 负优化再更新 Win¹¹

Android 如何共享 cookie.

请问下各位大佬 Android 如何共享 cookie.
就是手机浏览器的 cookie 我自己写个 app 也能读取到.浏览器与 App cookie 共享
或者 app 能读取到浏览器的 cookie
不要说不行,目前有个别已经实现了.

20 条回复    2021-09-27 23:42:42 +08:00

xieqiqiang00
    1

xieqiqiang00   2 天前

你倒是说说哪个软件实现了
Jione
    2

Jione   2 天前

@xieqiqiang00 一个 uni-app 做的 这个 app 搜不到,但是确实实现了
TomVista
    3

TomVista   2 天前   ❤️ 2

你说的 uniapp 应该是这样实现的

uniapp 使用系统内置 webview,访问 baidu.com

手机浏览器,使用系统内置 webview,访问 baidu.com

FATEQiang
    4

FATEQiang   2 天前

app 能读取到浏览器的 cookie — Android 搞太不现实了,除非浏览器是自己写的
hs0000t
    5

hs0000t   2 天前 via Android

用 App 打开按钮,把 Cookies 写到 URL Scheme 里
winterbells
    6

winterbells   2 天前 via Android

阿里腾讯狂喜
AoEiuV020
    7

AoEiuV020   2 天前

webView 是可以的,CookieManager 就好,
外部浏览器应该是没办法的,安全这关过不去,
zoharSoul
    8

zoharSoul   1 天前

@Jione #2 发出来看看
peterswan
    9

peterswan   1 天前   ❤️ 7

请问下各位大佬在自己家里如何才能穿墙.
就是有个邻居的屋子 我自己在自己家里就能穿墙过去 我们两家只隔了一个墙
或者 能隐身从大门进去
不要说不行,目前有个别已经实现了.
=========================
一个 UC 上 报道了能实现这个的新闻 目前搜不到,但是确实实现了
nicevar
    10

nicevar   1 天前

不行,想想都不可能,要是这能实现,Android 还有什么安全可言?
uni-app 就是自己嵌了个 webview,跟你自己的 app 嵌入个 webview 来处理有什么区别?
wenruoliushui
    11

wenruoliushui   1 天前

@peterswan 哈哈哈
littlewing
    12

littlewing   1 天前

android 其他 APP 可以读取 浏览器的 cookies ?这还不乱套了,谁还敢用 android
Jione
    13

Jione   1 天前

@littlewing 也不是说乱读吧,共享就行.
ios 就能共享 cookie
Jione
    14

Jione   1 天前

@TomVista 这样操作能读到 cookie 吗
Jione
    15

Jione   1 天前

@TomVista 不知道呢,我没集成
他们的标题是“获取浏览器 cookie”

然后别人的回复是:“可以 能拿到浏览器 cookie”

zoharSoul
    16

zoharSoul   1 天前

@Jione #15 那你倒是发出来啊
aikilan
    17

aikilan   1 天前

首先你要明白,手机浏览器本质也是一个“application”…你为什么觉得你的 application 应该能够去读取另外一个 application 的东西呢?如果对方给你提供了接口也就算了。
youxiachai
    18

youxiachai   1 天前

@Jione 看来你对安全毫无感知..居然能说这样的话…ios 是通过 schema 骚出来的…
dingwen07
    19

dingwen07   1 天前 via iPhone

op 想要的大概是这种吧

https://i.loli.net/2021/09/26/WfpZ9Tgjn4S5QVN.jpg

tenwx
    20

tenwx   13 小时 30 分钟前

好像 google 的软件只要登陆过一次,其他的 app 都可以直接选择该账号登陆了,很好奇怎么实现的

闲置的 Android 机可以用来做什么?

闲置的 Android 机可以用来做什么?

maladroit · 4 天前 · 4920 次点击

*近把吃灰的树莓派拿出来做了 HomeBridge 和软路由;

想起来之前买了一个 Android 机用来偶尔做测试,一般情况下也都在吃灰,很少需要拿出来测试。想问问大家闲置的 Android 机可以拿来做些什么服务呢?

53 条回复    2021-09-23 09:06:33 +08:00

monkey110
    1

monkey110   4 天前

甜糖
ostrichb
    2

ostrichb   4 天前 via Android

刷机
kirafreedom
    3

kirafreedom   4 天前

我闲置的 ip7p 配了个雷蛇折叠手柄当串流游戏机
wu67
    4

wu67   4 天前

我的是…网络热点…游戏机

以及当作万一哪天主力机坏掉时的备用机

gzlock
    5

gzlock   4 天前   ❤️ 1

用来当开发机吧?
cctrv
    6

cctrv   4 天前 via iPhone

寫 android / flutter 可以做鏡像開發機。體驗超越模擬器 n 條街
coolmenu
    7

coolmenu   4 天前

挖矿
Moeyua
    8

Moeyua   4 天前 via iPhone   ❤️ 1

挂 clash 做局域网代理
vocaloidchina
    9

vocaloidchina   4 天前

装国产流氓软件 /测试一些可能有毒的 app
chengxiao
    10

chengxiao   4 天前   ❤️ 1

%title插图%num
写了个小 App 当监控副屏,桌面小摆件
HolaPz
    11

HolaPz   3 天前

国产垃圾桶
leafre
    12

leafre   3 天前

换不锈钢脸盆
nsynet57
    13

nsynet57   3 天前

闲鱼上卖掉
daimubai
    14

daimubai   3 天前

可以用来闲置
Wanerlove
    15

Wanerlove   3 天前

挂了个 mc 服务器家里玩
acton393
    16

acton393   3 天前

测试机
Windn0
    17

Windn0   3 天前 via iPhone

@Moeyua 只能代理 http 吧,不能加速 switch 感觉意义不大
muzihuaner
    18

muzihuaner   3 天前 via Android

ip 摄像头,服务器,电脑性能监看器,电脑副屏….
zerofancy
    19

zerofancy   3 天前 via Android

桌面时钟
Cheons
    20

Cheons   3 天前 via Android   ❤️ 2

卖给有需要的人,钱拿来买需求的专业设备。
twoyuan
    21

twoyuan   3 天前

改装成人造卫星发上天
janus77
    22

janus77   3 天前

50 包邮
zhengfan2016
    23

zhengfan2016   3 天前

可以没事拿出来盘,我收藏了不少小众系统手机,像 webos,windows phone,黑莓 bb10,firefoxos 等等,没事就拿出来充个电盘一盘
konchu
    24

konchu   3 天前

SSH 跳板 /堡垒机,内网穿透伺服器,WakeOnLan 伺服器
m4d3bug
    25

m4d3bug   3 天前 via Android

楼上各位大佬,有监控的 app 推荐吗,多个服务器,安卓机
jiayong2793
    26

jiayong2793   3 天前

开发板?
NAS ?
Usaki
    27

Usaki   3 天前 via Android

放公司,远程打卡
SJ2050cn
    28

SJ2050cn   3 天前

挂一些签到脚本
ngx4ss
    29

ngx4ss   3 天前

拿来当路由器 https://codewindy.github.io/2021/08/15/All-Platform-Proxy/
ziseyinzi
    30

ziseyinzi   3 天前

换剪子菜刀不锈钢脸盆
fox0001
    31

fox0001   3 天前 via Android

改装成无电池运行,让它 24 小时闲不下来
/t/787737
Lemeng
    32

Lemeng   3 天前

刷机 root,把不要的干掉,包括通话什么的,打打游戏不错
shm7
    33

shm7   3 天前   ❤️ 1

打卡。
RichardY
    34

RichardY   3 天前

@chengxiao 不怕烧屏?
LokiSun
    35

LokiSun   3 天前 via Android

@zhengfan2016 同好
aliveyang
    36

aliveyang   3 天前

放公司定时打卡
kerro1990
    37

kerro1990   3 天前

吹灰还是吃灰
aureole999
    38

aureole999   3 天前 via iPhone

再装 home assistant 接入 home bridge,然后手机装 home assistant 客户端,智能家居控制中心
hideokuze
    39

hideokuze   3 天前

50 包邮解君愁。
raysonx
    40

raysonx   3 天前

换菜刀、换脸盆、换打气筒。
ezrameow
    41

ezrameow   3 天前

chroot 个 Linux 当树莓派玩
ThinkMan
    42

ThinkMan   2 天前 via iPhone

https://20190429.xyz/androidchroot-linux
chengxiao
    43

chengxiao   2 天前

@RichardY 都闲置手机了…卖都卖不了几个钱 还怕烧什么屏啊
zxcslove
    44

zxcslove   2 天前

怎么能做到去除电池,持久供电呢?
OwO233
    45

OwO233   2 天前

可以用来当服务器玩。挂着脚本薅羊毛什么的。
wdongxv
    46

wdongxv   2 天前 via Android   ❤️ 1

如果你掌握内网穿透技术的话,可以当个高清摄像头用,即使是很差的手机也比网上卖的网络摄像头好 https://play.google.com/store/apps/details?id=com.pas.webcam
ychost
    47

ychost   1 天前

吃灰,想好玩还是买树莓派,资源多扩展性好
imtianx
    48

imtianx   1 天前

华为的机子,Android 10,已升级到鸿蒙 os2.0,有没有办法解锁,root 呀
loveuer
    49

loveuer   1 天前 via Android

@Wanerlove 啥 cpu 啊,这。。。性能 OK 吗?
jerryjhou
    50

jerryjhou   1 天前 via Android

@imtianx 980 的可以,但也不免费。970 之前的解锁码比较容易获得
Wanerlove
    51

Wanerlove   1 天前

@loveuer 骁龙 820 刚启动会卡 15 秒左右,等加载完稳定了非常流畅,mspt30 左右波动
hewiefsociety
    52

hewiefsociety   18 小时 14 分钟前

可以用来 送给我…
plusor
    53

plusor   1 小时 14 分钟前

定时炸弹

Android中Parcel的分析以及使用

Android中Parcel的分析以及使用

简单点来说:Parcel就是一个存放读取数据的容器, Android系统中的binder进程间通信(IPC)就使用了Parcel类来进行客户端与服务端数据的交互,而且AIDL的数据也是通过Parcel来交互的。在Java空间和C++都实现了Parcel,由于它在C/C++中,直接使用了内存来读取数据,因此,它更有效率。

分析Binder机制中的客户端与服务器端进行实际操作ontransact()函数 :

  1. //参数说明:   
  2. // code :是请求的ID号    
  3. // data :客户端请求发送的参数   
  4. // reply:服务器端返回的结果   
  5. // flags:一些额外的标识,如FLAG_ONEWAY等,通常为0.   
  6. virtual status_t    onTransact( uint32_t code,
  7.                                 const Parcel& data,  
  8.                                 Parcel* reply,
  9.                                 uint32_t flags = 0);  

从中我们可以看到Parcel的重要性以及窥探它的使用情况,接下来,我主要分析它的存储机制。

    常用方法介绍:

            obtain()                          获得一个新的parcel ,相当于new一个对象

            dataSize()                      得到当前parcel对象的实际存储空间

            dataCapacity()               得到当前parcel对象的已分配的存储空间, >=dataSize()值  (以空间换时间)

            dataPostion()                 获得当前parcel对象的偏移量(类似于文件流指针的偏移量)

            setDataPosition()           设置偏移量

            recyle()                           清空、回收parcel对象的内存

            writeInt(int)                     写入一个整数

            writeFloat(float)              写入一个浮点数

            writeDouble(double)       写入一个双精度数

            writeString(string)           写入一个字符串

         当然,还有更多的writeXXX()方法,与之对应的就是readXXX(),具体方法请参阅SDK。

          其中几个值得注意的方法为:

             writeException()        在Parcel队头写入一个异常

             writeException()        Parcel队头写入“无异常“

             readException()        在Parcel队头读取,若读取值为异常,则抛出该异常;否则,程序正常运行。

一、Parcel的分析

       相信看了前面的值,对Parcel的使用该有了初步印象。那么,Parcel的内部存储机制是怎么样的?偏移量又是

  什么情况?让我们回忆一下基本数据类型的取值范围:

                   boolean     1bit          1字节

                   char          16bit         2字节

                   int             32bit        4字节

                   long          64bit        8字节

                   float          32bit        4字节

                  double       64bit         8字节

        如果大家对C语言熟悉的话,C语言中结构体的内存对齐和Parcel采用的内存存放机制一样,即读取*小字节

为32bit,也即4个字节。高于4个字节的,以实际数据类型进行存放,但得为4byte的倍数。基本公式如下:

             实际存放字节:

                       判别一:  32bit      (<=32bit)             例如:boolean,char,int

                       判别二:  实际占用字节(>32bit)     例如:long,float,String,数组等

        当我们使用readXXX()方法时,读取方法也如上述:

              实际读取字节:

                        判别一:  32bit      (<=32bit)            例如:boolean,char,int

                        判别二:  实际字节大小(>32bit)     例如:long,float,String,数值等

 

由上可以知道,当我们写入/读取一个数据时,偏移量至少为4byte(32bit),于是,偏移量的公式如下:

f(x)= 4x  (x=0,1,…n)

 

事实上,我们可以显示的通过setDataPostion(int postion) 来直接操作我们欲读取数据时的偏移量。毫无疑问,

你可以设置任何偏移量,但所读取的值是类型可能有误。因此显示设置偏移量读取值的时候,需要小心。

 

另外一个注意点就是我们在writeXXX()和readXXX()时,导致的偏移量是共用的,例如,我们在writeInt(23)后,

此时的datapostion=4,如果我们想读取5,简单的通过readInt()是不行的,只能得到0。这时我们只能通过

setDataPosition(0)设置为起始偏移量,从起始位置读取四个字节,即23。因此,在读取某个值时,可能需要使用

setDataPostion(int postion)使偏移量装换到我们的值处。

 

巧用setDataPosition()方法,当我们的parcel对象中只存在某一类型时,我们就可以通过这个方法来快速的读取

所有值。具体方法如下:

 

  1. /**
  2.      * 前提条件,Parcel存在多个类型相同的对象,本例子以10个float对象说明:
  3.      */
  4.     public void readSameType() {
  5.         Parcel parcel =Parcel.obtain() ;  
  6.         for (int i = 0; i < 10; i++) {  
  7.             parcel.writeDouble(i);
  8.             Log.i(TAG, “write double —-> ” + getParcelInfo());  
  9.         }
  10.         //方法一 ,显示设置偏移量
  11.         int i = 0;  
  12.         int datasize = parcel.dataSize();  
  13.         while (i < datasize) {  
  14.             parcel.setDataPosition(i);
  15.             double fvalue = parcel.readDouble();  
  16.             Log.i(TAG, ” read double is=” + fvalue + “, —>” + getParcelInfo());  
  17.             i += 8; // double占用字节为 8byte
  18.         }
  19. //      方法二,由于对象的类型一致,我们可以直接利用readXXX()读取值会产生偏移量
  20. //      parcel.setDataPosition(0)  ;  //
  21. //      while(parcel.dataPosition()<parcel.dataSize()){
  22. //          double fvalue = parcel.readDouble();  
  23. //          Log.i(TAG, ” read double is=” + fvalue + “, —>” + getParcelInfo());  
  24. //      }
  25.     }

 

由于可能存在读取值的偏差,一个默认的取值规范为:

1、  读取复杂对象时: 对象匹配时,返回当前偏移位置的该对象;

对象不匹配时,返回null对象 ;

2、  读取简单对象时: 对象匹配时,返回当前偏移位置的该对象 ;

对象不匹配时,返回0;

下面,给出一张浅显的Parcel的存放空间图,希望大家在理解的同时,更能体味其中滋味。有点简单,求谅解。

%title插图%num

相信通过前面的介绍,你一定很了解了了Parcel的存储机制,下面给定一应用程序来实践。

     1、布局文件如下:

  1. <?xml version=“1.0” encoding=”utf-8″?>  
  2. <LinearLayout xmlns:Android=“http://schemas.android.com/apk/res/android”  
  3.     android:orientation=“vertical” android:layout_width=”fill_parent”  
  4.     android:layout_height=“fill_parent”>  
  5.     <TextView android:layout_width=“fill_parent”  
  6.         android:layout_height=“wrap_content” android:text=”@string/hello” />  
  7.     <LinearLayout android:orientation=“horizontal”  
  8.         android:layout_width=“fill_parent” android:layout_height=”wrap_content”>  
  9.         <Button android:id=“@+id/btWriteByte” android:layout_width=”wrap_content”  
  10.             android:layout_height=“wrap_content” android:text=”写入一个byte值”></Button>  
  11.         <Button android:id=“@+id/btWriteInt” android:layout_width=”wrap_content”  
  12.             android:layout_height=“wrap_content” android:text=”写入一个int值”></Button>  
  13.     </LinearLayout>
  14.     <LinearLayout android:orientation=“horizontal”  
  15.         android:layout_width=“fill_parent” android:layout_height=”wrap_content”>  
  16.         <Button android:id=“@+id/btWriteDouble” android:layout_width=”wrap_content”  
  17.             android:layout_height=“wrap_content” android:text=”写入一个double值”></Button>  
  18.         <Button android:id=“@+id/btWriteString” android:layout_width=”wrap_content”  
  19.             android:layout_height=“wrap_content” android:text=”写入一个String值”></Button>  
  20.     </LinearLayout>
  21.     <View android:layout_width=“fill_parent” android:layout_height=”2dip”  
  22.         android:background=“#FF1493”></View>  
  23.     <LinearLayout android:orientation=“horizontal”  
  24.         android:layout_marginTop=“5dip” android:layout_width=”fill_parent”  
  25.         android:layout_height=“wrap_content”>  
  26.         <Button android:id=“@+id/btReadByte” android:layout_width=”wrap_content”  
  27.             android:layout_height=“wrap_content” android:text=”读取一个byte值”></Button>  
  28.         <Button android:id=“@+id/btReadInt” android:layout_width=”wrap_content”  
  29.             android:layout_height=“wrap_content” android:text=”读取一个int值”></Button>  
  30.     </LinearLayout>
  31.     <LinearLayout android:orientation=“horizontal”  
  32.         android:layout_width=“fill_parent” android:layout_height=”wrap_content”>  
  33.         <Button android:id=“@+id/btReadDouble” android:layout_width=”wrap_content”  
  34.             android:layout_height=“wrap_content” android:text=”读取一个double值”></Button>  
  35.         <Button android:id=“@+id/btReadString” android:layout_width=”wrap_content”  
  36.             android:layout_height=“wrap_content” android:text=”读取一个String值”></Button>  
  37.     </LinearLayout>
  38.     <View android:layout_width=“fill_parent” android:layout_height=”2dip”  
  39.         android:background=“#FF1493”></View>  
  40.     <Button android:id=“@+id/btSameType” android:layout_width=”wrap_content”  
  41.         android:layout_height=“wrap_content” android:text=”利用setDataPosition读取多个值”></Button>  
  42. </LinearLayout>   

 2、配置文件如下:

[html]

  1. <?xml version=“1.0” encoding=”utf-8″?>  
  2. <manifest xmlns:android=“http://schemas.android.com/apk/res/android”  
  3.       package=“com.qinjuning.parcel”  
  4.       android:versionCode=“1”  
  5.       android:versionName=“1.0”>  
  6.     <application android:icon=“@drawable/icon” android:label=”@string/app_name”>  
  7.         <activity android:name=“.MainActivity”  android:label=”@string/app_name”>  
  8.             <intent-filter>
  9.                 <action android:name=“android.intent.action.MAIN” />  
  10.                 <category android:name=“android.intent.category.LAUNCHER” />  
  11.             </intent-filter>
  12.         </activity>
  13.     </application>
  14. </manifest>

     3、程序主文件如下:

  1. public class MainActivity extends Activity implements OnClickListener {
  2.     private static String TAG = “PARCELTEST”;  
  3.     // Button ID
  4.     private static int[] btIds = new int[] { R.id.btWriteByte, R.id.btWriteInt,  
  5.             R.id.btReadDouble, R.id.btWriteString, R.id.btReadByte,
  6.             R.id.btReadInt, R.id.btReadDouble, R.id.btReadString,
  7.             R.id.btSameType };
  8.     // 每种类型的当前值
  9.     private byte cur_byte = 1; // 每次总写入 false  
  10.     private int cur_int = 10; // 写入值 cur_int ++ ;  
  11.     private double cur_float = 100.0d; // 写入值 cur_float++ ;  
  12.     private String cur_str = “QinJun –>” + cur_int; // 写入值 “QinJun —>“+cur_int  
  13.     private Parcel parcel = null;  
  14.     @Override
  15.     public void onCreate(Bundle savedInstanceState) {
  16.         super.onCreate(savedInstanceState);
  17.         setContentView(R.layout.main);
  18.         for (int i = 0; i < btIds.length; i++) {  
  19.             Button bt = (Button) findViewById(btIds[i]);  
  20.             bt.setOnClickListener(this);
  21.         }
  22.         parcel = Parcel.obtain(); // 获得一个Parcel对象 ,相当于new一个,初始大小为0  
  23.         Log.i(TAG, “The original parcel info” + getParcelInfo());
  24.     }
  25.     @Override
  26.     public void onClick(View view) {
  27.         // TODO Auto-generated method stub
  28.         int viewviewId = view.getId();  
  29.         switch (viewId) {
  30.         case R.id.btWriteByte:
  31.             parcel.setDataPosition(0);
  32.             parcel.writeByte(cur_byte);
  33.             Log.i(TAG, ” after write byte, —>” + getParcelInfo());  
  34.             break;
  35.         case R.id.btWriteInt:
  36.             parcel.writeInt(cur_int);
  37.             Log.i(TAG, ” after write int, —>” + getParcelInfo());  
  38.             break;
  39.         case R.id.btWriteDouble:
  40.             parcel.writeDouble(cur_float);
  41.             Log.i(TAG, ” after write float, —>” + getParcelInfo());  
  42.             break;
  43.         case R.id.btWriteString:
  44.             parcel.writeString(cur_str);
  45.             Log.i(TAG, ” after write String, —>” + getParcelInfo());  
  46.             break;
  47.         case R.id.btReadByte:
  48.             byte b = parcel.readByte();  
  49.             Log.i(TAG, ” read byte is=” + b + “, —>” + getParcelInfo()  
  50.                     + “String”);
  51.             break;
  52.         case R.id.btReadInt:
  53.             int i = parcel.readInt();  
  54.             Log.i(TAG, ” read int is=” + i + “, —>” + getParcelInfo());  
  55.             break;
  56.         case R.id.btReadDouble:
  57.             float f = parcel.readFloat();  
  58.             readSameType();
  59.             Log.i(TAG, ” read float is=” + f + “, —>” + getParcelInfo());  
  60.             break;
  61.         case R.id.btReadString:
  62.             parcel.setDataPosition(0);
  63.             String str = parcel.readString();  
  64.             Log.i(TAG, ” read float is=” + str + “, —>” + getParcelInfo());  
  65.             break;
  66.         case R.id.btSameType:
  67.             readSameType();
  68.             break;
  69.         default:
  70.             break;
  71.         }
  72.     }
  73.     private String getParcelInfo() {// 得到parcel的信息
  74.         return “dataSize = ” + parcel.dataSize() + “, dataCapacity=”  
  75.                 + parcel.dataCapacity() + “, dataPositon = ”  
  76.                 + parcel.dataPosition();
  77.     }
  78.     /**
  79.      * 前提条件,Parcel存在多个类型相同的对象,本例子以10个float对象说明:
  80.      */
  81.     public void readSameType() {
  82.         for (int i = 0; i < 10; i++) {  
  83.             parcel.writeDouble(i);
  84.             Log.i(TAG, “write double —-> ” + getParcelInfo());  
  85.         }
  86.         //方法一 ,显示设置偏移量
  87.         int i = 0;  
  88.         int datasize = parcel.dataSize();  
  89.         while (i < datasize) {  
  90.             parcel.setDataPosition(i);
  91.             double fvalue = parcel.readDouble();  
  92.             Log.i(TAG, ” read double is=” + fvalue + “, —>” + getParcelInfo());  
  93.             i += 8; // double占用字节为 8byte
  94.         }
  95. //      方法二,由于对象的类型一致,我们可以直接利用readXXX()读取值会产生偏移量
  96. //      parcel.setDataPosition(0)  ;  //
  97. //      while(parcel.dataPosition()<parcel.dataSize()){
  98. //          double fvalue = parcel.readDouble();  
  99. //          Log.i(TAG, ” read double is=” + fvalue + “, —>” + getParcelInfo());  
  100. //      }
  101.     }
  102. }

由于取值时,可能存在类型的转换,因此点击按钮时,可能不会产生预期结果。因此,得保证偏移量对应数值的正确性。

Android 支持 DHCP 获取 IPv6 了吗?

我的 Android 设备 WIFI 下均只能 通过 无状态 SLAAC 模式获取 IPv6, 现在新版本的 Android 支持 有状态 DHCP 模式 获取 IPv6 了吗?
第 1 条附言  ·  8 天前

如果 Android 不支持 DHCPv6 那么,SLAAC 模式,WiFi 一直在线的情况下,是多久更新一个 v6 地址呢?

26 条回复    2021-09-05 19:20:41 +08:00

AoEiuV020
    1

AoEiuV020   8 天前

好多年前就支持的吧,
acbot
    2

acbot   8 天前

@AoEiuV020 IPv6 支持肯定没问题,但是 IPv6 的获取方式以前仅仅支持无状态模式!
lcdtyph
    3

lcdtyph   8 天前 via iPhone

@AoEiuV020 安卓一支不支持 dhcpv6
acbot
    4

acbot   8 天前

@lcdtyph 现在新版本,比如 8 -11 也是这样吗?我的设备只有 7 所以不找到后续的版本是否改进了
winterbells
    5

winterbells   8 天前

11 不支持,之前说永远不会支持 dhcpv6
acbot
    6

acbot   8 天前

@winterbells ?
linshiyouxiang
    7

linshiyouxiang   8 天前

android 11 也不支持.

[DHCPv6-Client-Android]( https://github.com/realmar/DHCPv6-Client-Android) 可以在 Android 7 以上开启 dhcp v6 支持,但是需要 root

Yadomin
    8

Yadomin   8 天前 via Android

Wont fix
littlewing
    9

littlewing   8 天前

支持 slaac,DHCPv6 不知道
showgood163
    10

showgood163   8 天前 via Android

不支持,Google play 里的两个 dhcpv6 client 都已经停止维护,有相关需求的话会很难受
jim9606
    11

jim9606   8 天前

Android 明确**不支持**有状态 DHCPv6,只支持 SLAAC 。
所以如果现在的 IPv6 网络不支持 SLAAC,你可以当它不是 IPv6 ready 。
geekvcn
    12

geekvcn   8 天前 via iPhone

谷歌 play 搜索 DHCPv6
geekvcn
    13

geekvcn   8 天前 via iPhone

https://github.com/Mygod/DHCPv6-Client-Android
acbot
    14

acbot   8 天前

@linshiyouxiang 这个 APP 需要 root 才能运行吗?
acbot
    15

acbot   8 天前

@jim9606 如果 Android 不支持 DHCPv6 那么,SLAAC 模式,WiFi 一直在线的情况下,是多久更新一个 v6 地址呢?
LiangBryan
    16

LiangBryan   8 天前

@acbot 安卓手机会有个临时 IPv6 地址,这个地址是用来对外访问的。只要断开 WiFi 重连,临时地址就会更新。
acbot
    17

acbot   8 天前

@LiangBryan WiFi 一直在线的情况下,是多久更新一个 v6 地址呢?
LiangBryan
    18

LiangBryan   7 天前

@acbot 一直在线的话应该不会更新,只有断线重连才会。
nbweb
    19

nbweb   7 天前

有状态不支持,支持无状态。
CrazyBoyFeng
    20

CrazyBoyFeng   7 天前

没听说支持。手里的 lineageos 18 (android 11) 获取到的 ipv6 还是只能用 ipv4 的 dns,没有 dnsv6 。说明是 slaac 。
CrazyBoyFeng
    21

CrazyBoyFeng   7 天前

slaac 地址的有效期依当前设备的 validtime 而定。此外还有个 preferdtime,过了这个时间就会生成新的地址并向上级路由宣告。
在 slaac 网络中,重启路由器,路由器下的终端可以保持之前的 ipv6 地址不变。不过,要是路由器 ipv6 改变,那么终端之前地址对应的路由就不通了。操作系统一般会利用跃点计数把过时无效的路由清除掉。然后要么是尝试用新路由宣告,要么是直接生成新地址。
acbot
    22

acbot   7 天前

@CrazyBoyFeng validtime / preferdtime 这两个值可以查看到吗?
jiabing520a
    23

jiabing520a   7 天前

怪不得我手机都没获取到 IPv6 地址。。。原理是有状态的锅
CrazyBoyFeng
    24

CrazyBoyFeng   6 天前

@acbot aosp 的代码里显示,有效期是 2592000,首选期是 604800
acbot
    25

acbot   6 天前

@CrazyBoyFeng 明白了!
jim9606
    26

jim9606   4 天前

@acbot RA 通告的是前缀有效期,主机 ID (也就是后 64 位)用多久由客户端自行决定,也可以不更换。Android 不清楚,Windows 默认首选寿命 1d,有效寿命 7d 。

Android 获取虚拟按键的高度

Android 获取虚拟按键的高度

	//获取虚拟按键的高度
    public static int getNavigationBarHeight(Context context) {
        int result = 0;
        if (hasNavBar(context)) {
            Resources res = context.getResources();
            int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = res.getDimensionPixelSize(resourceId);
            }
        }
        return result;
    }

    /**
     * 检查是否存在虚拟按键栏
*
     * @param context
* @return
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public static boolean hasNavBar(Context context) {
        Resources res = context.getResources();
        int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
        if (resourceId != 0) {
            boolean hasNav = res.getBoolean(resourceId);
            // check override flag
String sNavBarOverride = getNavBarOverride();
            if ("1".equals(sNavBarOverride)) {
                hasNav = false;
            } else if ("0".equals(sNavBarOverride)) {
                hasNav = true;
            }
            return hasNav;
        } else { // fallback
return !ViewConfiguration.get(context).hasPermanentMenuKey();
        }
    }

    /**
     * 判断虚拟按键栏是否重写
*
     * @return
*/
private static String getNavBarOverride() {
        String sNavBarOverride = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            try {
                Class c = Class.forName("android.os.SystemProperties");
                Method m = c.getDeclaredMethod("get", String.class);
                m.setAccessible(true);
                sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
            } catch (Throwable e) {
            }
        }
        return sNavBarOverride;
    }
}

Android 中状态栏、标题栏、View的大小及区分

Android 中状态栏、标题栏、View的大小及区分

1、获得状态栏的高度(状态栏相对Window的位置):

Rect frame = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

int statusBarHeight = frame.top;

2、获得mView中显示内容的Top (不包括标题栏,指的是相对Window的位置,即:没有标题栏的时候,指的是状态栏的bottom在Window中的坐标;有标题栏的时候指的是标题栏的bottom在Window中的坐标)

getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();

3、获得view中显示内容,与window无关,只和父控件有关

如果布局文件中mView match_parent 那么top=0,bottom=mView.getHeight();

4、获得屏幕的宽高:

(1)

getResources().getDisplayMetrics().heightPixels;

getResources().getDisplayMetrics().widthPixels;

(2)

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();//屏幕宽度

int height = wm.getDefaultDisplay().getHeight();//屏幕高度

(3)

DisplayMetrics mDisplayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
int W = mDisplayMetrics.widthPixels;
int H = mDisplayMetrics.heightPixels;

(4)过时方法

Display mDisplay = getWindowManager().getDefaultDisplay();
int W = mDisplay.getWidth();
int H = mDisplay.getHeight();

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速