获得徽章 18
在掘金工作好几年了,和社区一起经历了很多变化。最开始大家聊学校的事情,然后是找工作的事情,然后是结婚,买房子,买车。最近几年,经济形势,裁员,焦虑迷茫充斥整个行业。。。希望大家都好
10
inlinehook
原理
对于so的内部函数来说调用函数就相当于在符号表中找到对应函数的地址,然后跳转到对应的函数执行。
Hook点
可以hook so的内部函数(通过找到符号表替换函数的前两行指令为跳转到自己的函数中执行然后再挑战到原函数执行)
缺点
不能hook静态函数因为 静态函数没有符号表(也就不能找到函数的指令去替换前两个指令为跳转到我们的函数执行)
展开
评论
语法阶段 文法规则匹配生成ast问题
此处的文法规则不是词法分析阶段的正则文法因为正则文法不能够表示复杂的ast,所以此处用的是上下文无关文法(和正则文法最大的区别是可以递归调用,比如加法乘法嵌套这种复杂语法就需要递归解析匹配)。上下文无关是因为预读取的token数量太少这个阶段只能够产出ast,由于token数量过少因此上下文信息也少所以也叫上下文无关文法。(对应的上下文有关是在语义分析阶段这个阶段会读取大量token信息也就是上下文信息,这个阶段主要是ast的优化因此有了更多的信息才能进行更多优化,ps:很类似虚拟机根据运行的性能信息进行编译为本地机器码的操作)
左递归问题:匹配加法文法时由于第二个文法的第一个条件也是加法文法因此只要第一个文法满足,再次匹配第二条文法节点时又会递归判断是否是加法文法,第二次也如次,由于是第二个文法的第一个条件所以也叫左递归。
解决:原因是第二条文法规则里面第一个条件和主文法重复第一个条件就是递归调用,因此陷入了死循环。破解就是在匹配文法时加上前置条件而不是一开始就是递归。将递归滞后加入前置判断就可以解决。(比如第二条文法结构匹配时只有第一个条件满足才会递归而不是无条件递归)
根源无条件递归,解决加入条件再递归。
由于加入了条件因此文法匹配规则发生变化,对于其他的规则匹配就会造成影响(比如ast顺序错乱等问题)
展开
评论
𝓑𝓮𝓲𝓨𝓪𝓷𝓰的头像
Android开发工程师
冗余代码消除
赋值
JVM在类加载阶段会确保全局,static变量付默认值,如果定义的时候已经进行赋默认值那么这个赋值是冗余的,所以要消除这种赋值
确认目标:
Filed是当前类的变量,Field在init和clinit中赋值,并且之前没有付过非默认值,且此次赋值是默认值,那么这个赋值就是可以优化的
实现:
1.遍历init,clinit的字节码找到putField和putStatic指令
2.过滤不是当前类的变量,指令中可以看到File的全路径名,通过对比当前class。筛选出只对本类Filed赋值的指令
3.将Classname和filedname作为一个key,如果付非默认值则保存到集合中
4.当碰到赋默认值的指令时检测是否在集合中,如果不在集合中进行标记该指令是可以删除的冗余指令
5.遍历完整个字节码之后进行统一删除
展开
评论
协程(coroutines)是一种轻量级的线程管理方式,它允许我们以更简洁、直观的方式编写异步代码。在Kotlin中,协程是通过库 kotlinx.coroutines 实现的。下面是协程内部的一些主要方法和概念的说明:
1. CoroutineScope:协程作用域,用于管理协程的生命周期。通常与作用域相关的类(如Android的ViewModel)会实现CoroutineScope接口。作用域内的所有协程都会在作用域被取消时一起取消。
2. CoroutineContext:协程上下文,包含了协程运行所需的一些信息,如调度器(Dispatcher)和Job。调度器决定协程在哪个线程或线程池上执行,而Job表示协程的一个执行任务。
3. launch:用于启动一个协程。它创建一个新的协程并立即开始执行。launch函数返回一个Job对象,可以用于取消或等待协程完成。
4. async:与launch类似,但它返回一个Deferred对象,表示一个可等待的结果。可以通过调用await方法来获取结果。async用于启动一个带有返回值的协程。
5. suspend:用于标记一个可以暂停执行的函数。这些函数只能在协程或其他suspend函数中调用。当一个suspend函数被调用时,它不会阻塞当前线程,而是将协程挂起,直到结果可用。
6. withContext:用于在指定的CoroutineContext中执行一个suspend函数。这允许我们在不同的上下文(如线程)之间切换协程的执行。
展开
评论
现在招聘是不是都要求是统招全日制本科了[流泪]
6
𝓑𝓮𝓲𝓨𝓪𝓷𝓰的头像
关注了
Android开发工程师
推荐书籍:《Android源码设计模式解析与实战》
本书就是把设计模式和 Android 源码来了个结合,对于每一种设计模式都是以 概念 —> Android 源码中的应用 —> 源码要点解析 —> 设计模式实战 这几方面内容来介绍的,在学习设计模式的同时又学习了 Android 源代码。
但切记一点,永远都不要期望通过别人的分析来理解源码! 真正的源码解析需要你脚踏实地去断点追踪源码。所以本书重点在于带领你去思考设计模式,感悟设计模式,只有多加思考和练习才能真正地做到会用,乃至用好。
展开
评论
该如何学习设计模式?

1. 脱离复杂业务去看设计模式是没有意义的。因为脱离了应用场景,即使理解了模式的内容和结构,也学不会在合适的时候应用。所以我们何不通过优秀的开源项目去领悟呢?
2. 首先你要敢于追求优雅的代码,对一个需求能不断提出问题,不断追求更好的解决方案,在新的解决方案上又挖掘新的问题,其次你要掌握大到应用设计模式的场景、重构烂代码的技巧,小到缩进、命名规范。
展开
评论
下一页
个人成就
优秀创作者
资讯创作者
文章被点赞 2,547
文章被阅读 119,216
掘力值 8,176
收藏集
14
关注标签
0
加入于