月度归档:2019年12月

Android APP启动速度优化

使用traceview跟踪启动速度

1.在application的onCreate中添加

2.在首个展示的页面中添加

3.从sdk从获取trace文件并使用android studio打开

call chart图,按调用栈分开

call chart图 , 按调用栈和时序来绘制,适合分析一个流程中的耗时

flame chart 图,调用栈从底部到顶部,一般遇到平顶的情况表示可能有性能问题

flame chart 图 相同调用栈合并,适合看频繁callback导致耗时问题

4.分析call chart图或者flame chart

从call chart图可以看到,每个第一列都是一次主线程的消息循环,

第一次循环回调了Application.oncreate,鼠标移动到目标位置可以看到 Application .onCreate耗时500毫秒

第二次消息循环做了hanldeLunchActivity,耗时1.4秒

第三次消息循环是做了performtraversals ,耗时130毫秒

整个启动时间耗时两秒左右,从这里可以看出 hanldeLunchActivity 和 Application.oncrate是非常耗时的

再分析这两次回调, 可以从下一格图,占用上一格的百分比 看出执行耗时比例。 查看更多

动态规划小结

一个入门级见解和总结

动态规划实际上意思就是计算的时候需要根据之前的结果来继续计算, 英文dynamic programming,动态编程的意思,在编程的时候本质上是枚举大量场景下的最优解,例如计算dp[a][b],的所有值,然后二维表,其中每个dp都是特定场景的最优解,但是我们可能最后只采用其中一个场景,计算其他场景的最优解是为了算出目标场景的最优解

解决动态规划问题可以分为四步

第一步 确定定义和状态

确定状态(描述一个场景要几维),然后转化为子问题(n推到n+1或者n-1)

什么是状态:所有会影响所定义的值(dp)计算的因素都是状态,但我们需要只选择最少且独立和必要的,如果两个状态可以互相推导,那么只选其中之一 查看更多

Binder的一次拷贝是哪次

binder的一次拷贝发生在客户端发消息时,从用户空间拷贝消息到内核空间,原因是内核空间与用户空间存在内存隔离,必须内核和驱动开发专用函数 copy_from_user(…),把内存从用户空间拷贝过来才能继续操作

binder请求过程

简述一下通信过程:

1)进程启动时候,打开binder驱动,使用mmp()函数分配一段物理内存,让内核空间和用户空间都指向这段内存,mmp返回共享空间的地址,由进程持有,对应的内核部分由该进程对应的节点持有,驱动维护着所有节点

2)客户端通过驱动查询服务端的节点,不是直接通过驱动,而是先经过了servicemnager,但 servicemnager 实际上是句柄为0的服务端 查看更多