Android系统编译优化: 使用Ninja加快编译
10:34 amMonday, 8 August 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
背景
环境
关键编译阶段和耗时分析
阶段一:Soong bootstrap
阶段二:Kati遍历、mk搜集与ninja生成
阶段三:Ninja编译
编译优化
对比汇总
背景Android系统模块代码的编译实在是太耗时了,即使寥寥几行代码的修改,也能让一台具有足够性能的编译服务器工作十几分钟以上(模块单编),只为编出一些几兆大小的jar和dex。
这里探究的是系统完成过一次整编后进行的模块单编,即m、mm、mmm等命令。
除此之外,一些不会更新源码、编译配置等文件的内容的操作,如touch、git操作等,会被Android系统编译工具识别为有差异,从而在编译时重新生成编译配置,重新编译并没有更新的源码、重新生成没有差异的中间文件等一系列严重耗时操作。
本文介绍关于编译过程中的几个阶段,以及这些阶段的耗时点/耗时原因,并最后给出一个覆盖一定应用场景的基于ninja的加快编译的方法(实际上是裁剪掉冗余的编 ...
Android动态日志ProtoLog原理与架构: How ProtoLogTool works
11:33 amThursday, 7 July 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
概述
原理
编译
ProtoLogTool
总结
参考
概述本文基于Android 11介绍动态日志ProtoLog的实现原理。
ProtoLog在编译期插入代码,用于实现动态启停的判断逻辑,在编译期实现字符串哈希管理,用于实现日志数据量的压缩。执行这些工作的主要工具是ProtoLogTool。
原理本节介绍ProtoLog在编译期的工作、以及动态启停的实现。
编译在Framework Services编译过程中,会执行动态日志相关的编译。关键的编译配置在framework/services/core/Android.bp中,如下。可以看到,services在编译过程中会调用protologtool。
1234567891011121314151617genrule { name: "services.core.protologsrc", srcs: [ & ...
Android动态日志ProtoLog简介和使用
11:12 amThursday, 7 July 2022 (GMT+8)Time in Guangdong Province, China
概述
使用
定义(TAG/Group)
命令/工具
数据量压缩原理
动态启停
查看Config
查看日志
总结
参考
概述本文是对ProtoLog的基本说明,包括对ProtoLog的使用、Group的定制,以及ProtoLog框架的结构。
ProtoLog是Android R(Android 11)开始引入的全新的日志框架,它在性能、开销和灵活程度上有明显的提升,是一套全新流程的日志框架,它主要在WindowManager体系中使用,并有可能推广到Android系统层的其他部分。
它的一大特点是能够根据Group分类来动态启停指定类别的日志打印,这使系统层初步具备了动态日志的能力(动态日志的另一大能力是打印没有预埋的日志、动态执行没有预置的调试代码)。另外还有精妙绝伦的日志数据量压缩机制(虽然并不是什么新技术)。利用对日志字符串的哈希引用减少了App内字符串数量和大小,给应用和Framework大小、内存占用带 ...
Android Studio导入AOSP系统源码
[toc]
1. 编译Android源码123source build/envsetup.sh lunch sdk_phone_x86_64 make -j56
sdk_phone_x86_64是Android Emulator(AVD模拟器)的编译目标。
2. 搭建源码环境idegen: 生成 IDE 相关文件AOSP原生提供了idegen工具用于生成IDE环境(IDEA以及基于其的Android Studio)下的工程:
123soruce build/envsetup.sh mmm development/tools/idegen/ ./development/tools/idegen/idegen.sh
以上 3 个步骤的含义依次如下:
123Step 1: 用于初始化环境变量Step 2: 生成文件out/host/linux-x86/framework/idegen.jarStep 3: 源码根目录生成文件android.ipr(工程相关设置), android.iml(模块相关配置)
导入到Android StudioAndroid ...
Android编译AOSP源码并生成模拟器镜像并运行
4:00 pmTuesday, 21 June 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
[TOC]
前置条件
AOSP源码
对应的编译环境(官方文档)
必须使能了kvm
步骤准备1source ./build/envsetup.sh
12# 编译64位AVDlunch sdk_phone_x86_64
编译1make -j56
运行1emulator
直接执行emulator,会自动使用最新编译的镜像。
参考
Setup AVD
git rebase时显示作者信息
常常碰见需要借助git rebase -i <COMMIT_ID>来处理分支和提交的情况。默认的git rebase -i展示的历史提交是简洁的、不带有作者信息的。
使用下面这个命令,将当前仓库的git配置为在git rebase -i时展示作者信息。执行该命令后在此使用git rebase -i即可看到作者信息。
1git config --global --add rebase.instructionFormat "(%an <%ae>) %s"
#!的正确读法:Shebang
#!是Linux和Unix以及各种脚本中出现在文件最开头的序列,它由由井号和叹号构成。当它出现在文本文件的第一行时,类Unix操作系统的程序加载器会分析#!后的内容,将这些内容作为解释器指令,并调用对应的解释器来执行脚本。
许多人不知道它该念什么,不知道它的学名或概念名称,通常称之为“井号感叹号”。实际上**它的标准名称是shebang或hashbang**。
Shebang的名字来自于SHArp和bang,或haSH bang的缩写,指代Shebang中#!两个符号的典型Unix名称。
Unix术语中,井号通常称为sharp(如C#称为C Sharp),hash或mesh(网、洞);而叹号则常常称为bang。也有看法认为,shebang名字中的sh来自于默认shell————Bourne shell的名称,sh,因为常常使用shebang调用之。
概括来说,#!的名称是Sharp Bang,并简称为shebang。其中,可以使用Sharp、Hash、Mesh等来称呼#。
归去来兮辞
魏晋陶渊明
余家贫,耕植不足以自给。幼稚盈室,瓶无储粟,生生所资,未见其术。亲故多劝余为长吏,脱然有怀,求之靡途。会有四方之事,诸侯以惠爱为德,家叔以余贫苦,遂见用于小邑。于时风波未静,心惮远役,彭泽去家百里,公田之利,足以为酒。故便求之。及少日,眷然有归欤之情。何则?质性自然,非矫厉所得。饥冻虽切,违己交病。尝从人事,皆口腹自役。于是怅然慷慨,深愧平生之志。犹望一稔,当敛裳宵逝。寻程氏妹丧于武昌,情在骏奔,自免去职。仲秋至冬,在官八十余日。因事顺心,命篇曰《归去来兮》。乙巳岁十一月也。
归去来兮,田园将芜胡不归?既自以心为形役,奚惆怅而独悲?悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。舟遥遥以轻飏,风飘飘而吹衣。问征夫以前路,恨晨光之熹微。
乃瞻衡宇,载欣载奔。僮仆欢迎,稚子候门。三径就荒,松菊犹存。携幼入室,有酒盈樽。引壶觞以自酌,眄庭柯以怡颜。倚南窗以寄傲,审容膝之易安。园日涉以成趣,门虽设而常关。策扶老以流憩,时矫首而遐观。云无心以出岫,鸟倦飞而知还。景翳翳以将入,抚孤松而盘桓。
归去来兮,请息交以绝游。世与我而相违,复驾言兮焉求?悦亲戚之情话,乐琴 ...
Android常用内存分析命令
一、概述记录一些分析Android/Linux进程的内存占用、内存布局、内存空间结构的一些分析工具和方法。
1.1 内存指标概念Item全称含义等价USSUnique Set Size物理内存进程独占的内存PSSProportional Set Size物理内存PSS= USS+ 按比例包含共享库RSSResident Set Size物理内存RSS= USS+ 包含共享库VSSVirtual Set Size虚拟内存VSS= RSS+ 未分配实际物理内存
VSS >= RSS >= PSS >= USS
1.2 内存分析命令常用的内存调优分析命令:
工具
描述
top/htop
最简单也是最粗略的工具,初步展示内存占用情况
vmstat
除了展示内存外,还展示io、CPU等
cat /proc/meminfo
查看系统全局内存统计
free
/proc/meminfo的精简版,粗略查看内存总体情况
procrank
可以查看所有进程的VSS P ...
UML基础速查手册
UML类图示例
UML类图关系