- 博客(49)
- 资源 (49)
- 收藏
- 关注

原创 android性能分析之内存优化
命令android性能分析之常用命令查看系统内存状态cat /proc/meminfoadb shell procrank (pid)adb shell dumpsys meminfo/cpuinfo <package_name>/pid内查看本地层程序top -t -m 5 -n 2 查询Cpu/内存的基本使用adb shell cat /proc/buddyinfoadb shell cat /proc/meminfo // 查看更加详细的内存信息adb shell c
2021-01-25 13:00:30
617

原创 SurfaceFlinger学习笔记(六)之View Layout Draw过程分析
视图的绘制工作大概分为Measure、Layout和Draw三个主要的流程。而启动这些流程的一个入口则是ViewRootImpl类的performTraversals,具体请参考应用启动流程DecorView在PhoneWindow中被创建,在Activity的onResume方法回调的时候继而调用Activity的makeVisible()方法,Activity对应的PhoneWindow对象才被WindowManager添加WindowManager.addView()->WindowMan
2020-05-19 12:47:13
1370

原创 C++11总结
nullptr空指针由新关键字nullptr[④]表示,类似于Java中的null。Raw字符串Raw是为了解决正则表达式里那些烦人的转义字符\而提供的解决方法在C++中,如果使用转义字符串来表达,则变成(’(?:[ˆ\\’]|\\.)∗’|"(?:[ˆ\\"]|\\.)∗")|。使用转义字符后,整个字符串变得很难看懂了。如果使用Raw字符串,改成R"dfp((’(?:[ˆ\’...
2019-09-05 21:03:15
2904

原创 android性能分析之常用命令
性能分析:-Android studio的工具Memory Monitor工具主要是用来监测APP的内存分配情况,判断是否存在内存泄漏Dump Java Heap定位内存泄漏, 生成.hprofEclipse: ddms->update heap->cause gc生成总内存信息,然后会有data object-运行时错误分析/data/tombstones全志平台:/m...
2019-06-16 11:30:51
3247
原创 synergy跨平台键鼠共享
Synergy官方版是一款功能强大的鼠标键盘共享工具。通过Synergy软件用户可以在多台电脑之间共享一个鼠标与键盘,帮助用户同时操纵多部计算机,提高操作效率。支持windows、Linux、mac等操作系统。
2022-10-13 18:49:20
2870
原创 android性能分析之simpleperf
android性能分析之Systraceandroid性能分析之常用命令Android Studio 包含 Simpleperf 的图形前端,记录在使用 CPU 性能剖析器检查 CPU 活动中。大多数用户更喜欢使用该图形前端,而不是直接使用 Simpleperf。Android Profiler分析(一)概述Android Profiler分析(二) Memory ProfilerAndroid Profiler分析(三) CPU Profiler如果您更喜欢使用命令行,可以直接使用 Simpl
2021-03-05 15:59:27
8955
原创 Zygote pre-fork线程池源码分析
前言在Android Q上,google为了加快应用的启动速度。在zygote fork阶段,采用了线程池的方式,来加快fork的过程。首先,如果让我们自己做,肯定会选择java的线程池模型,先创建N个进程,当需要fork的时候,取出来一个来bindapplication,同时进行补充进程池。但是google的做法并不是这样,google的思路是:**同时fork N个进程,监听同一个socket fd,当收到消息的时候,只有一个进程会被唤醒,来处理这个消息。**google利用了这样的一个机制,来进
2021-01-25 13:00:20
1050
原创 Android OomAdj
Android系统的设计理念正是希望应用进程能尽量长时间地存活,以提升用户体验。应用首次打开比较慢,这个过程有进程创建以及Application等信息的初始化,所以应用在启动之后,即便退到后台并非立刻杀死,而是存活一段时间,这样下次再使用则会非常快(cached进程和empty进程)。对于APP同样希望自身尽可能存活更长的时间。物极必反,系统处于低内存的状态下,手机性能会有所下降;系统继续放任所有进程一直存活,系统内存很快就会枯竭而亡,那么需要合理地进程回收机制。谈到优先级,可能有些人会想到Linux进程
2020-12-14 10:27:56
3360
原创 Android OomAdj(二)Cached进程、Empty进程和mem_factor、Trim
空进程(empty)和缓存进程(cached)cached和empty主要是区别是否有Activity(cache有activity)empty进程没有任何东西在内运行的进程(不含任何活动应用组件的进程),作用是提高该程序下次的启动速度或者记录程序的一些历史信息Cached进程cache进程和empty有以下四个进程级别PROCESS_STATE_CACHED_EMPTY这个state级别主要是在computeOomAdjLocked函数中更新,依次排除完是否为PROCESS_STAT
2020-12-14 10:26:33
1834
原创 内存管理(二)Zone和Watermark
概览为了支持NUMA模型,也即CPU对不同内存单元的访问时间可能不同,此时系统的物理内存被划分为几个节点(node), 一个node对应一个内存簇bank,即每个内存簇被认为是一个节点首先, 内存被划分为结点. 每个节点关联到系统中的一个处理器, 内核中表示为pg_data_t的实例. 系统中每个节点被链接到一个以NULL结尾的pgdat_list链表中,而其中的每个节点利用pg_data_tnode_next字段链接到下一节.而对于PC这种UMA结构的机器来说, 只使用了一个成为contig_pa
2020-12-04 15:10:06
1997
1
原创 内存管理(三)伙伴系统
概览Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题Buddy算法最主要的的特点任何时候区域里的空闲内存都能以2的n次方进行拆分或合并。伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求。在最初,只有一个块,也就是整个内存,假如为1M大小,而允许的最小块为64K,那么当我们申请一块200K大小的内存时,就要先将1M的块分裂成两等分,各为512K,这两分之间的关系就称为伙伴,然后再将第
2020-12-04 11:28:19
699
原创 内存管理概览
buddy伙伴系统Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题Buddy算法最主要的的特点任何时候区域里的空闲内存都能以2的n次方进行拆分或合并。伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求。在最初,只有一个块,也就是整个内存,假如为1M大小,而允许的最小块为64K,那么当我们申请一块200K大小的内存时,就要先将1M的块分裂成两等分,各为512K,这两分之间的关系就称为伙
2020-12-04 11:25:49
608
原创 androidQ/R lmkd介绍
一、简介lmkd(Low Memory Killer Daemon)是低内存终止守护进程,用来监控运行中android系统内存的状态,通过终止最不必要的进程来应对内存压力较高的问题,使系统以可接受的水平运行。二、背景之前Android 使用内核中的 lowmemorykiller 驱动程序来监控系统内存压力,该驱动程序是一种依赖于硬编码值的严格机制。从内核 4.12 开始,lowmemorykiller 驱动程序已从上游内核中移除,用户空间 lmkd会执行内存监控以及进程终止任务。用户空间 lmkd
2020-11-28 15:04:55
20582
8
原创 android dumpsys命令源码分析
初始化* frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java* ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_HIGH);ServiceManager.addService("gfx
2020-09-28 15:32:52
1982
原创 android IO Prefetch源码分析
I/O Prefetcher是高通本身提供的一套优化方案,可以用在Android手机App冷启动的时候。本文基于android Q主要分libqti-iopd、vendor.qti.hardware.iop@2.0-impl、libqti-iopd-client_system三个so,编译后在/vendor/lib/目录下,其中libqti-iopd、vendor.qti.hardware.iop@2.0-impl为服务端首先看服务端的实现IO Prefetcher的初始化vendor.qti.h
2020-09-08 21:53:49
7301
原创 android synchronized原理分析(一) java HotSpot
public class SyncLock { public void testBolokCode(){ synchronized (SyncLock.this){ } } public synchronized void testBolokMethod(){ } public static synchronized void testStaticBolokMethod(){ }}执行javac SyncLock.java
2020-08-01 14:12:52
696
原创 android synchronized原理分析(二) Monitor
public class SyncLock { public void testBolokCode(){ Thread thread1 = new Thread(new Runnable() { @Override public void run() { synchronized (SyncLock.this){ try{
2020-07-30 21:24:31
1596
原创 android input(二) InputDispatcher
唤醒InputDispatcher以Motion事件的分发过程来进行举例void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) { //检查Motion事件的参数是否有效,对于motion事件,主要时校验触控点的数量与ID是否在合理范围 if (!validateMotionEvent(args->action, args->actionButton, args->poi
2020-06-16 21:57:42
5964
原创 android性能分析之Systrace
启动-SystraceSystrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况(如surfaceflinger
2020-05-15 10:32:14
6241
原创 AndroidP/Q/R/S编译系统
Android编译环境的初始化过程,在编译环境初始化完成后,我们就可以用m/mm/mmm/make命令编译源代码了。当然,这要求每一个模块都有一个Android.mk文件。Android.mk实际上是一个Makefile脚本,用来描述模块编译信息。Android编译系统通过整合Android.mk文件完成编译过程。mmm命令的编译过程,需要依赖会make命令全部模块编译完成,下面使用编译mmm.........
2020-05-11 18:15:47
37031
13
原创 SurfaceFlinger学习笔记(五)之HWUI
渲染机制的更新,Android提出了硬件加速的机制,其作用就是将2D的绘图操纵,转换为对应的3D的绘图操纵,这个转换的过程,我们把它叫做录制。需要显示的时候,再用OpenGLES通过GPU去渲染。界面创建时,第一次全部录制,后续的过程中,界面如果只有部分区域的widget更新,只需要重新录制更新的widget。录制好的绘图操纵,保存在一个显示列表DisplayList中,需要真正显示到界面的时候,直接显示DisplayList中的绘图 操纵。这样,一方面利用GPU去渲染,比Skia要快;另一方面,采用Dis
2020-04-28 15:33:40
6439
2
原创 SurfaceFlinger学习笔记(一)应用启动流程
用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的入口Activity,ActivityManagerService则会通知Zygote进程孵化出应用进程,然后在这个应用进程里执行ActivityThread的main方法。应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService...
2020-04-21 14:00:19
3871
1
原创 SurfaceFlinger学习笔记(二)之Surface
* frameworks/base/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasSurfaceViewActivity.javapublic class HardwareCanvasSurfaceViewActivity extends Activity implements Callback { p...
2020-04-16 18:45:08
2145
原创 Android Hidl笔记
HAL 类型在 Android 8.0 及更高版本中,较低级别的层已重新编写以采用更加模块化的新架构。搭载 Android 8.0 或更高版本的设备必须支持使用 HIDL 语言编写的 HAL,下面列出了一些例外情况。这些 HAL 可以是绑定式 HAL 也可以是直通式 HAL。Android R 也支持使用 AIDL 编写的 HAL。所有 AIDL HAL 均为绑定式。绑定式 HAL。以 H...
2020-04-16 12:21:35
3359
原创 SurfaceFlinger学习笔记(三)之SurfaceFlinger进程
应用进程ComposerService:定义:frameworks\native\include\private\gui\ComposerService.h实现:frameworks\native\libs\gui\SurfaceComposerClient.cpp作用:通过Singleton,定义单例类,初始化时候调用connectLocked,获取SurfaceFlinger服务代理...
2020-04-15 20:00:50
6731
原创 C/C++面试
Clinux调试工具编译阶段nm:获取二进制文件里面包含的符号。用户跟踪链接错误gdb: debug程序运行gcc –gldd: 显示程序需要使用的动态库和实际使用的动态库运行时:strace: 显示程序调用的系统调用。定位进程异常退出,定位共享内存异常-c计算各个系统调用累计占用的时间-T –tt显示单个系统调用的开始时间、执行时间-e trace=ipc 选项,让st...
2020-03-25 13:28:24
384
原创 Openssl android编译静态库
准备编译脚本到 https://github.com/leenjewel/openssl_for_ios_and_android 下载别人写好的编译环境配置脚本build-openssl4android.sh 中,默认的OpenSSL 版本是 openssl-1.1.0f,改成最新的即可。LIB_NAME=“openssl-1.1.0f”脚本会自动下载 openssl 1.1.1e,需要...
2020-01-17 17:23:29
1046
转载 Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载) 转载 ...
2020-01-15 19:53:27
1432
2
原创 Java笔记-JNI各种签名
生成java方法的JNI签名javap -p -s org.jemen.test.Test签名:类描述符开头的’L’与结尾的’;'必须要有;数组描述符,开头的’['必须有;方法描述符规则: “(各参数描述符)返回值描述符”,其中参数描述符间没有任何分隔符号基本类型签名引用数据类型的转换...
2020-01-02 17:55:37
232
原创 安全策略
app加固1、混淆策略代码混淆、资源混淆2、应用的签名校验在应用application中校验app签名,如果不正确测退出3、反调试异常检测防止so和应用被调试4、应用的加固策略a、dex加固:dex加壳、函数抽取、指令抽取、字符串加密b、so加固:section加密、函数加密FOTA加固对FOTA包做签名运算,然后对签名做加密对FOTA包整体做加密,然后在计算签名(...
2019-12-02 11:01:14
312
原创 APP加固总结
dx工具:转换class未dex,在build-tools/*/dx目录下执行命令 : dx --dex --output=Hello.dex Hello.class
2019-11-29 16:46:00
1984
原创 Selinux Rule
Selinux Code:platform/external/sepolicy查看Selinux状态adb shell getenforceroot@E2303:/ # getenforceEnforcingroot@SGP321:/ # getenforcePermissive关掉Selinux, 查看问题是否和Selinux相关device/qcom/xxx/Bo...
2019-10-27 14:44:56
613
原创 repo使用
Repo使用命令repo init –u <URL> [<OPTIONS>]初始化命令-u: 指定连接到的manifest仓库地址-m: 选择仓库中某个manifest文件,如果没有设置,就使用default.xml-b: 选择一个maniest仓库中的一个特殊的分支或修正版本repo init -u “ssh://zhangzhihao@172.30.3....
2019-10-22 09:51:59
1309
原创 面试-android
- 工具的使用调查内存泄漏工具: LeakCanary如果只关注activity的内存泄漏,那么在Application中onCreate加入RefWatcher ref = LeakCanary.install(this);就OK了,会通过notification通知如果还关注fragment的泄漏情况,那么Application加上RefWatcher,然后在对应fragment页面中o...
2019-10-10 09:35:56
2290
1
原创 android逆向总结
签名signapk.jar是Android源码包中的一个签名工具。 代码位于Android源码目录下的/build/tools/signapk/SignApk.java文件中,源码编译后可以在/out/host/linuxx86/framework目录中找到它。 Android源码中提供的签名文件testkey.pk8与testkey.x509.pem,它们位于Android源码的build/t...
2019-09-22 12:25:46
190
原创 Android编译环境搭建
修改/etc/apt/source.list,添加源deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiversedeb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiversedeb...
2019-08-26 18:32:59
1304
原创 Android LowmemoryKiller机制
为什么引入LowmemoryKiller?进程的启动分冷启动和热启动,当用户退出某一个进程的时候,并不会真正的将进程退出,而是将这个进程放到后台,以便下次启动的时候可以马上启动起来,这个过程名为热启动,这也是Android的设计理念之一。这个机制会带来一个问题,每个进程都有自己独立的内存地址空间,随着应用打开数量的增多,系统已使用的内存越来越大,就很有可能导致系统内存不足。为了解决这个问题...
2019-08-15 15:57:56
1347
原创 热修复和动态加载
热修复目前存在比较好的解决方案是热修复技术,即生成差一补丁包后,直接将更新补丁上传到云端,此时App从云端下拉补丁直接应用生效,即直接在用户已安装的程序中修复bug,准确而言它是一个亡羊补牢的措施。比较有代表性的的App是阿里系的优酷和支付宝,腾讯系的微信,两者使用的都是自行研发的方案。可解决的典型问题:刚发布的应用出现闪退、ANR等bug,及时修复 。及时推送一些小的功能给用户使...
2019-07-01 13:55:43
547
原创 android性能优化之布局优化
概述根据Google官方出品的Android性能优化典范,60帧每秒是目前最合适的图像显示速度,事实上绝大多数的Android设备也是按照每秒60帧来刷新的。为了让屏幕的刷新帧率达到60fps,我们需要确保在时间16ms(1000/60Hz)内完成单次刷新的操作(包括measure、layout以及draw),这也是Android系统每隔16ms就会发出一次VSYNC信号触发对UI进行渲染的原...
2019-06-25 20:07:28
750
quickbuild.tar.gz
2020-05-28
android vold模块详解
2020-04-28
进入 Android Dalvik 虚拟机
2020-04-28
阿里巴巴出品--《深入探索Android热修复技术原理》.pdf
2019-05-31
精通LINUX设备驱动程序开发
2012-03-16
OpenSceneGraph三维渲染引擎编程指南
2011-09-19
OpenSceneGraph三维渲染引擎设计与实践
2011-09-19
Javascript高级教程
2011-08-20
Eclipse开发J2ME插件-EclipseMe1.5.0
2011-08-20
餐饮管理程序的源代码
2011-08-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人