当前位置:网站首页>大厂面试必备技能,2022Android不死我不倒
大厂面试必备技能,2022Android不死我不倒
2022-07-05 19:04:00 【InfoQ】
先上一份面试资料目录
业内情况
无痕埋点
可视化埋点
阶段一:无痕埋点
无痕埋点技术实现
页面ID规则
- Activity,ID 规则为
ActivityClassName|额外参数
- Fragment,ID 规则为
ActivityClassName[FragmentClassName]|额外参数
页面PV、UV
onResume()
onResume()
setUserVisibleHint(boolean isVisibleToUser)
onHiddenChanged(boolean hidden)
- Activity
- Fragment
控件ID规则
FrameLayout[0]/LinearLayout[1]/Button[0]
控件ID的优化
FrameLayout[0]/LinearLayout[2]/Button[0]
- 优化1:将兄弟节点中的位置,变成相同类型控件的位置。优化后的控件路径为:
FrameLayout[0]/LinearLayout[1]/Button[0]
,即使在插入 FrameLayout 后,其路径仍旧不变,相较之前会更加稳定一些。但如果插入的是 LinearLayout,或者整个页面的 UI 进行了重构,控件路径依旧会发生改变。
- 优化2:因为不同的系统版本或手机厂商,会对页面的根 View 做一定的处理,所以我们需要屏蔽掉这种情况,对于我们而言,我们只关心我们自定义的那部分布局,即通过 setContentView 传入的布局。我们可以通过判断控件 ID 是否等于
android.R.id.content
来获取我们自定义的布局的根 View,并将其作为我们控件路径的起点。
- 优化3:在 Android 中,除了
R.id
和控件路径之外,还有一个比较常用的可以作为控件 ID 的特征信息,那就是开发者写在布局文件中,关联控件的 Resource ID。Resource ID 是开发者自己定义的关联 View 的标识,在一个页面当中,理论上是唯一的(为什么说是理论上,因为还是存在有多个相同 Resource ID 的情况,比如动态的 add 多个 layout,且包含了相同的 Resource ID,但这种情况非常少),并且在页面的重构过程中,Resource ID 也一般不会修改,因此用 Resource ID 来作为控件 ID 是非常合适的。但并不是所有的控件都有 Resource ID,我们可以先尝试去获取这个 ID,假如 Resource ID 存在,则使用 Resource ID 来作为控件 ID,假如 Resource ID 不存在,则降级使用控件路径作为控件 ID。核心代码如下:
控件的点击、长按指标
onClick(View v)
onLongClick(View v)
- 点击
- 长按
代码插桩
Javassist
gradle 插件
- 先根据类名得到
CtClass
对象
- 再根据我们想要寻找的切入点,页面就找
onResume()
方法,控件就找onClick(View view)
方法
- 然后根据方法名和参数类型,得到
CtMethod
对象
- 调用
CtMethod
对象的编辑方法体的 API,在原始方法体之前插入就调用insertBefore
,之后就调用insertAfter
,传入需要插入的代码块
- 调用
CtClass
的writeFile()
方法,保存这次编辑
阶段二:可视化管理后台
上报控件信息
- 可被点击或长按
- 在当前界面可见
- 判断 View 本身可见性属性
- View 本身可见性属性比较容易判断,我们只需要判断
View.isShown()
并且View.getVisibility() == View.VISIBLE
即可。
- 判断 View 所处的位置是否在当前屏幕内
- 一个 Activity 加载了多 Fragment 的情况下,可能会出现控件本身可见性属性达标,但实际并不在屏幕内的情况。这种情况我们根据
View.getLocationOnScreen(int[] outLocation)
,然后通过判断outLocation[0]
,是否大于等于 0 且小于等于屏幕宽度,就能判断控件是否在当前屏幕内。
- 判断控件是否被其他控件完全遮挡
- 遍历所有与该控件有关联的控件(同层控件、父控件、父控件的同层控件等),通过
View.getGlobalVisibleRect(Rect viewRect)
来得到控件所对应的 Rect 信息,然后通过Rect.contains(Rect r)
来判断两个控件对应的 Rect 是否完全包含即可。
最后
边栏推荐
- R language Visual scatter plot graph, add labels to some data points in the graph, and always display all labels, even if they have too much overlap. Ggrep package helps
- 为什么 BI 软件都搞不定关联分析?带你分析分析
- 决策树与随机森林
- How to convert word into PDF? Word to PDF simple way to share!
- 14、用户、组和权限(14)
- You can have both fish and bear's paw! Sky wing cloud elastic bare metal is attractive!
- Technology sharing | interface testing value and system
- uniapp获取微信头像和昵称
- Get wechat avatar and nickname with uniapp
- Technology sharing | common interface protocol analysis
猜你喜欢
PHP利用ueditor实现上传图片添加水印
How to realize the Online timer and offline timer in the game
HiEngine:可媲美本地的云原生内存数据库引擎
Oracle故障处理:Ora-10873:file * needs to be either taken out of backup or media recovered
Technology sharing | common interface protocol analysis
面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
cf:B. Almost Ternary Matrix【对称 + 找规律 + 构造 + 我是构造垃圾】
JMeter 常用的几种断言方法,你会了吗?
2022 the most complete Tencent background automation testing and continuous deployment practice in the whole network [10000 words]
图扑软件数字孪生 | 基于 BIM 技术的可视化管理系统
随机推荐
R language Visual scatter plot graph, add labels to some data points in the graph, and always display all labels, even if they have too much overlap. Ggrep package helps
块编辑器如何选择?印象笔记 Verse、Notion、FlowUs
Is the performance evaluation of suppliers in the fastener industry cumbersome? Choose the right tool to easily counter attack!
Tupu software digital twin smart wind power system
Golang through pointer for Range implements the change of the value of the element in the slice
XML basic knowledge concept
Oracle Chinese sorting Oracle Chinese field sorting
UDF implementation of Dameng database
什么是面上项目
1亿单身男女撑起一个IPO,估值130亿
ELK分布式日志分析系统部署(华为云)
决策树与随机森林
The relationship between temperature measurement and imaging accuracy of ifd-x micro infrared imager (module)
Explain in detail the functions and underlying implementation logic of the groups sets statement in SQL
Summer Challenge database Xueba notes, quick review of exams / interviews~
2022最新大厂Android面试真题解析,Android开发必会技术
数学分析_笔记_第9章:曲线积分与曲面积分
The monthly list of Tencent cloud developer community videos was released in May 2022
2022全网最全的腾讯后台自动化测试与持续部署实践【万字长文】
IFD-x 微型红外成像仪(模块)关于温度测量和成像精度的关系