Android性能优化(bin启动优化)

news2024/11/15 4:52:46

    我们平时会在android里面写个bin程序来干点活,但是有时候我们会发现很奇怪的现象,我明明很早就启动这个bin了,但是过了很久bin程序的main函数才被调用~。这个是为啥呢?主要有2个原因:

一.bin程序依赖的so库太多,或者bin依赖的so库所依赖的so库非常多。典型的例子就是SystemServer中加载libandroid_servers.so的处理,一般都要消耗200ms左右(如果是x1的大核心跑,可能会快很多)。

二.bin程序中有很多全局变量或者静态变量,他们的初始化比较耗时。

我们这里暂时先介绍第二种类型。首先先上一个简单代码:

extern void doSayHello();

int main() {
  printf("main trace1 \n");
  doSayHello();
  return 0;
}

这里你会发现,执行bin以后过一段很久才会打印“main trace1”,从代码来看,打印log前没有耗时处理,我们看一下doSayhello()的代码:

#include <stdio.h>
#include "abc2.hpp"

void doSayHello() {
  printf("sayhello \n");
}

我们留意一下,doSayHello()上面有一个“abc2.hpp”的头文件,我们看一下这个头文件

class MyHeader {
public:
  MyHeader() {
    printf("myheader trace1 \n");
    usleep(1000*100);
    printf("myheader trace2 \n");
  }

  void say() {
    printf("myheader sayhello \n");
  }
};

MyHeader header;

好吧,我们发现这个头文件里面有一个全局变量header,它的构造函数非常耗时(我们用usleep来模拟耗时操作)。所以当你运行bin程序的时候,它在构造header这个全局变量的时候卡住了。我们再来看一下log,和我们的猜想差不多,哈哈。

 那接下来就该想个方法来优化了,怎么才能把这个耗时的全局成员变量初始化放到mian函数执行之后呢(如果能放到main函数之后执行,那就意味着多线程就能加载就能用起来了)?我们这个时候就需要用到dlopen/dlsym,运行时加载~~~,不在使用extern或者头文件方式引用接口函数。代码如下:

int main() {
  printf("main trace1 \n");
  //doSayHello();
  auto dlhandler = dlopen("./abc2.so",RTLD_GLOBAL | RTLD_NOW);
  if(dlhandler == nullptr) {
    printf("handler is nullptr \n");
  } else {
    printf("handler is not nullptr \n");
  }
  char *error = NULL;
  sayfunc func = (sayfunc)dlsym(dlhandler,"doSayHello");
  if(func == nullptr) {
    if ((error = dlerror()) != NULL)  {
         fprintf (stderr, "%s ", error);
         exit(1);
     }
  }
  printf("main trace1_1 \n");
  printf("func is %lx \n",func);
  func();
  printf("main trace2 \n");
  return 0;
}

这样的代码效果如下:

我们可以看到,全局变量的加载已经在main函数调用之后运行了。所以如果这个时候我们再使用一个多线程去做dlopen,是不是就能完美的优化整个bin的启动时间啦?啊哈哈。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

steam搬砖项目,csgo游戏搬砖熟练操作后,可以月入过万~

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 网上创业创造了一批赚钱的人&#xff0c;年收入从几十万到几百万不等&#xff0c;营业额从几…

基于springboot房屋租赁管理系统

开发工具&#xff1a;IDEA&#xff0c;jdk1.8 服务器&#xff1a;tomcat9.0 数据库&#xff1a;mysql5.7 前端&#xff1a;jsp、bootstrap 技术&#xff1a; springbootmybatis-plus 系统主要分前台和后台&#xff0c;分租客、房东、管理员三个角色 系统功能介绍说明&…

nodejs 高级编程-通信

一、通信基本原理 通信必要条件 主机之间需要有传输介质主机上必须有网卡设备主机之间需要协商网络速率 二、网络通讯方式 常见的通讯方式 交换机通讯路由器通讯 如何建立多台主机互连&#xff1f; 如何定位局域网中的其他主机&#xff1f; 通过Mac地址来唯一标识一台主机…

hcip笔记---ospf的LSA限制和不规则区域

有关ACL&#xff1a;例如&#xff1a;1.1.1.0 0.0.0.255这个网段以及后面跟随的通配符&#xff0c;通配符和反掩码长得很像&#xff0c;同时都是用0标识不可变&#xff0c;1标识可变&#xff0c;但反掩码里的1和0必须连续出现&#xff0c;而通配符则不需要遵循这个规则&#xf…

深入思考Sui的独特性如何构建出跨时代的产品

近日&#xff0c;我们与Mysten Labs产品总监Janet Wu面对面探讨了Web3的产品开发过程&#xff0c;了解了她对Sui上最激动人心的产品用例的看法&#xff0c;以及她对该行业未来的展望。 您能简单介绍一下在Mysten Labs担任产品总监意味着什么吗&#xff1f; 对我而言&#xff…

0基础学习VR全景平台篇 第59篇:专业版功能-跨账号复制

功能位置示意 一、本功能将用在哪里&#xff1f; 跨账号复制&#xff0c;是指将本账号中已发布的VR漫游作品一键复制给其他账号使用。 复制成功后&#xff0c;其他账号中也会生成同样的作品以及获得相关的全景、音频、图片、视频等素材。 并且原作品和复制品可以独立编辑&am…

K8s为什么需要calico? calico 原理深入理解.

文章目录 为什么需要calico&#xff1f;-网络插件”千千万”&#xff0c;为何k8s要用calicocalico的架构calico Pod 跨node通信tunl0 的作用&#xff1f;为什么所有pod的默认网关都是169.254.1.1 &#xff1f;什么是ARP 代理&#xff1f;jksj BGP模式的calico工作原理calico BG…

vue3 报错解决:找不到模块‘xxx.vue’或其相应的类型声明。(Vue 3 can not find module)

src下面建立一个xx.d.ts的文件 declare module *.vue {import { ComponentOptions } from vueconst componentOptions: ComponentOptionsexport default componentOptions }

使用3DEXPERIENCE平台有效管理设计变更,随时处理问题

临时处理设计变更&#xff0c;电脑却不在身边怎么办?借助3DEXPERIENCE平台&#xff0c;我们可以轻松的用手机打开模型&#xff0c;还能够随时随地查看其他人的工作进展并进行审批。 在工作过程中&#xff0c;工程师小A发现&#xff0c;装配体的零件强度有点弱&#xff0c;小A…

HTML 第二部分 (前端学习)

由于&#xff0c;HTML的部分实在是太多了&#xff0c;第一部分&#xff0c;还没学一半&#xff0c;就已经抄了1w字。而且可能&#xff0c;真正用上的也比较少&#xff0c;更何况&#xff0c;一直坚持&#xff0c;一个不落的学下去&#xff0c;也存在一点注意力分散的困难&#…

ATM自助取款系统(Java)

文章目录 完整程序1. 课程设计目的2. 课程设计任务与要求3. 课程设计说明书3.1 需求分析3.1.1 功能分析3.1.2 性能要求分析 3.2 概要设计3.2.1 功能模块图&#xff0c;如图1。 3.3 详细设计3.3.1 实体类的设计3.3.2 实现数据库处理 3.4 主要程序功能流程图 4. 课程设计成果4.1 …

Linux——进程信号的发送

目录 一.信号发送的概念 首先来讲几个发送术语&#xff1a; 它有三种情况&#xff1a; 注意&#xff1a; 二.信号在内核中的表示示意图 三.信号捕捉 所以总结一下&#xff1a; 此时&#xff0c;会出现这样一个疑问&#xff1a;操作系统是如何得知现在被执行的进程是用户态…

DuDuTalk:4G录音工牌如何帮企业实现,线下服务的远程实时监督?

数字化时代&#xff0c;企业越来越重视客户体验。而线下服务是企业的员工跟客户直接互动最重要的环节&#xff0c;这直接关乎到客户对品牌、产品、服务的最直观评价和反馈&#xff0c;最终影响客户的购买和成交。 但企业的线下服务场景往往又是企业数字化最薄弱的一环&#xf…

Qt,day4

闹钟 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("闹钟");this->setWindowIcon(QIcon("D:\\HQYJRJ\\QT\\day1\\…

【Python爬虫开发基础⑫】requests库概述(文件上传、cookies处理、状态码处理、异常处理等)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; ⭐️前面比较重要的基础内容&#xff1a; 【Python爬…

数据平台之数仓模型设计

文章目录 前言一、维度建模基本概念1.1 事实表1.2 维度表 二、维度建模三种模式2.1 星型模型2.2 雪花模式2.3 星座模式 三、ChatGPT代替Sql Boy3.1 简单案例3.2 复杂案例 四、总结 前言 看到几篇不错的文章&#xff0c;自己总结合并了分享给小伙伴 金博尔和恩门共同开创的数仓…

vue项目 设置启动时自动运行到电脑默认浏览器中

相信大家很多参与企业开发会发现 别人搭建的vue项目都会自动启动在电脑的默认浏览器上 这个其实React项目自己就会有 但是 vue项目我们需要自己设置一下 在根目录的 vue.config.js 将devServer下 设置 open: true 参考代码如下 module.exports {devServer: {open: true} }这样…

机器学习30:《推荐系统-III》使用 TensorFlow 构建电影推荐系统

本文将介绍基于 MovieLens 数据集创建一个电影推荐系统的方法。具体而言&#xff0c;包括探索电影数据&#xff0c;训练矩阵分解模型&#xff0c;检查嵌入&#xff0c;矩阵分解中的正则化&#xff0c;Softmax 模型训练等内容。 目录 1.准备工作 1.1 导入依赖模块 1.2 加载数…

LeetCode 1107.每日新用户统计

数据准备 Create table If Not Exists Traffic (user_id int, activity ENUM(login, logout, jobs, groups, homepage), activity_date date); Truncate table Traffic; insert into Traffic (user_id, activity, activity_date) values (1, login, 2019-05-01); insert into …

Charles抓包map local后出现“failed: unacceptable content-type: text/plain“

Charles 抓包map local 修改 映射到本地数据 出现如下报错 返回ErrorUrlhttps://xxxx 返回ErrorError Domaincom.alamofire.error.serialization.response Code-1016 "Request failed: unacceptable content-type: text/plain" UserInfo{NSLocalizedDescriptionRequ…