Android性能优化(native进程启动优化)

示例代码:

主函数基本就是打印一句log,但是运行时卡了很久(为了演示方便,我只加了一个头文件,实际情况比这个复杂,可能是各种头文件加载)。

#include <sys/file.h>
#include <sys/syscall.h>

#include "mydata.hpp"


int main(int argc,char *argv[])
{
  printf("global value is %d \n",globalValue1.value);
}

分析步骤

1.确认是否是linker的so库太大,io慢导致。objdump -x bin,一般会有下面的打印:

这些是需要link的库,我们可以手动cat一下这些库,确保他们都在文件缓存中,然后再启动,确认是否速度提升,如果提升,推论成立。反之,推论不成立。

2.如果不是IO的问题,那我们需要确认是否是linke函数过多。用dlopen函数逐个open一下这些so库,看一下每个so库耗时。如果有一个so库耗时比较长,那这个推论基本就OK了。

3.最后一种可能是全局变量的构造函数初始化数据耗时,导致整个__init函数非常慢。我们看一下怎么推

objdump -S bin,然后找到__cxx_global_var_init,一个全局变量对应一个__cxx_global_var_init,所以这里有2个

我们看一下

adrp x8 0x1000,就是当前pc指针低12位清空,然后加上0x1000给到x8 =》实际就是相对寻址改为0x1000

add x8,x8,#240,就是x8再机上240,那相对地址就是0x10F0

blr x8,跳转到x8,就是跳转到0x10F0

我们看一下相对地址10F0是多少

是_ZN6MyDataC2Ev的函数开头,用c++filt翻译一下这个函数

就是MyData的构造函数,再用addr2line看一下这个函数在那里

我们这样就找到了需要全局变量初始化函数位置,按照这个方法找到所有函数,然后打印log,这样我们就能知道具体是哪个初始化慢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值