自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Z丶北城大叔

既然选择了远方,便只顾风雨兼程。。。

  • 博客(40)
  • 收藏
  • 关注

原创 [笔记] 应用安装过程梳理

一、概述1、四种应用安装场景(1)系统自安装:每次开机启动时,都会预安装系统自带的APK,没有安装界面;(2)应用市场安装:从小米应用商店(com.xiaomi.market)、Google Play(com.android.vending)等,下载 APK 后,自动安装;(3)adb命令安装:使用 adb 工具,安装 APK:$ adb install xxxxx.apk,没有安装界面;(4)第三方安装:使用文件管理器(com.miui.packageinstaller 或 com.google

2020-12-18 17:30:53 1137 1

原创 [笔记] 01 Android 系统架构

2007年11月 Google成立了“Android 开源项目”(AOSP:Android Open Source Project) :标志着 Android 系统首次公开面向全世界的开发者和使用者。

2020-08-28 16:47:43 253

原创 [笔记] 02 Android 几个重要进程

一、init 进程init 进程,是 Andorid 系统中用户空间的第一个进程(pid=1),它是用户进程的鼻祖,负责孵化各种属性服务、守护进程、Zygote 进程等。Init 进程是由多个源文件共同组成的,这些源文件位于源码目录:system/core/init 。1、init 进程分析当内核完成系统设置,它首先在系统文件中寻找 “init” 文件,最后会调用 /system/core/init/init.cpp 的 mian() 方法(它是 init 的入口函数)。主要完成如下两件事情:(

2020-08-28 16:42:02 255

原创 Android 的事件处理机制

Android 提供了两种方式的事件处理机制:<1> 基于监听的事件处理; <2> 基于回调的事件处理。(说明:事件处理就是为用户动作提供响应的机制)一、基于监听的事件处理1、两种方式(1)为 Android 界面组件绑定特定的事件监听器;(2)在界面布局文件中,为 UI 组件的 android:onClick 属性指定事件监听方法。(注:该方式需要在 Activity 中定义该事件监听方法)2、事件监听处理模型(1)涉及三类对象:Event Source(事件源)

2021-06-01 11:48:59 989

原创 Activity生命周期

一、Activity的四种状态1、Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并,可与用户交互的激活装态;2、Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,他仍然可见,但是它已经失去焦点,故不可与用户交互。3、Stopped状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,

2021-04-28 11:13:56 132

原创 链表

一、单向链表1、链表的结点类public class Node { int val; // 表示数据域的值 Node next; // 表示指针域,指向下一个结点 // 构造方法,为数据域赋值 public Node(int val) { this.val = val; } // 链表结点的构造函数:使用数组arr作为参数,创建一个链表,当前的Node为链表的头结点 public Node(int[] arr) { if(arr == null ||

2021-04-25 21:04:10 110

原创 动态规划问题

一、求资产包中资产最大总价值1、问题描述输入:资产总条数,资产种类,资产A条数 资产B条数 资产C条数,资产A价值 资产B价值 资产C价值输出:资产包中资产最大总价值2、示例输入:12,3,4 5 7,500 600 800输出:14003、代码import java.util.Scanner;public class DynamicProgramming { public static void main(String[] args) { Scanner sc

2021-04-15 22:03:45 85

原创 背包问题

一、问题描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?下面讲述的例子均用具体的数字代入(例如:number=4,capacity=8):二、总体思路根据动态规划(dynamic programming)解题步骤:(1)问题抽象化(2)建立模型(3)寻找约束条件(4)判断是否满足最优性原理(5)找大问题与小问题的递推关系式(6)填表(7)寻找解组成最终找出最优解以及最优解的组成。三、动态规划原理“动态规划” 与 “分治法”

2021-04-14 22:06:04 143

原创 二分查找算法

二分查找算法又称折半查找,它是一种效率较高的查找方法。【要求】(1)必须采用顺序存储结构(2)必须按关键字大小有序排列【原理】将数组分为三部分,依次是中值( 即:数组中间位置的值 ),中值前,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。【实现】可以采用 递归、循环 两种方式一、【代码】/**二分查找算法【要求】对于已排好序的数组arr,需要查找的数

2021-04-14 18:17:26 113

原创 字符串的处理

一、长整数的和1、实现求两个超长非负数之和要求:(1)不损失精度(2)首位均不出现无意义得0(3)不出现无意义的小数点(如:1.00应该为1)(4)不得使用除字符操作外的函数public class LongIntegerSum{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String num1 = sc.nextLine(); String num2 = sc.nex

2021-04-13 14:20:27 84

原创 JNI总结

一、概述1、JNI(Java Native Interface)是一种允许运行于JVM的Java程序,去调用本地代码(通常JNI面向的本地代码是用C、C++以及汇编语言编写)的编程框架(反之亦然)。本地代码通常与硬件或操作系统有关联,因而会在一定程度上破坏Java本身的可移植性,但是有时这种方法是必须的,例如:在Android系统中就采用了大量JNI手段去调用本地层的实现库。2、通常有以下3种情况需要用到JNI方法:(1)应用程序需要一些平台相关的 feature 的支持,而 Java 无法满足。

2021-04-01 20:49:35 165

原创 grep 命令大全

Linux 中的 grep 命令作用:用于查找文件里符合条件的字符串。一、概述grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。语法:$ grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作&

2021-03-29 20:29:08 985 1

原创 Python常用函数总结

下面整理一写,python脚本中常用的一些方法,后面会持续积累更新。一、sys 类1、sys.argv 函数该函数是用于获取运行 python 文件时的命令行参数。就是一个从程序外部获取参数的桥梁,这个“外部”很关键,因为从外部取得的参数可以是多个,所以获得的是一个列表(list),其第一个元素是程序本身,即:该文件名,随后才依次是外部给予的参数。示例:执行命令:$ python test.py zxy#encoding=utf-8import sysa=sys.argv[0]b=sys.a

2021-03-29 16:39:25 179

原创 性能问题分析02-应用启动

一、概述1、应用冷热启动的区别(1)冷启动:当启动一个应用时,后台没有该应用的进程,这时系统会创建一个新的进程分配给该应用,这个启动方式就是冷启动。由于系统会创建一个新的进程分配给它,所以会先创建和初始化 Application 类,再创建和初始化 MainActivity 类,包括:测量(measure)、布局(layout)、绘制(traversal),最后显示在界面上。(2)热启动:当启动一个应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保

2021-03-19 15:51:55 191

原创 [笔记] 应用启动过程梳理

一、冷启动过程1、整个过程包括:(1)应用程序启动(2)首帧的绘制与渲染(3)首帧的合成与送显从 Systrace 中,可以看到 Frames 这一行,每一帧主要分为:红色、黄色、绿色的 “圆饼”:<1> 红色:定义为 terrible frame,代表从 performTraversals 到 renderThread 绘制完成的总时间超过 2VSync(详见:VSync信号处理);<2> 黄色:定义为 bad frame,代表总时间在1vsync~2vsync之间

2021-03-05 10:17:31 379 1

原创 性能问题分析01-应用安装

1、性能优化 patch(1)核心组件优化 Patch List:https://wiki.n.miui.com/pages/viewpage.action?pageId=185634254(2)系统性能优化 Patch List:按照类型,可分为:内存优化、CPU优化、IO优化、ART优化、其它优化...

2021-01-13 15:14:17 268

原创 Binder 机制

Binder 是 Android 系统进程间通信(IPC:Internet Process Connection)方式之一。Linux 已经拥有的 IPC 手段包括: 管道(Pipe)、信号(Signal)、跟踪(Trace)、插口(Socket)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)等。本文详细分析 Binder 作为 Android 主要 IPC 方式的优势。一、概述基于 Client-Server 的通信方式,广泛应用于从互联网和数据库访问

2021-01-06 11:18:11 622

原创 Java中反射机制总结

一、概述在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括:私有的方法和属性),这种动态获取信息以及动态调用对象方法的功能,就称为 Java语言的反射机制。(通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。)想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(包括:方法、属性、类名、父类名、实现的所有接口等),每一个类对

2020-11-23 16:10:48 174

原创 AndroidStudio常用快捷键

1、Ctrl + B:跳入/跳出方法或者资源文件。将鼠标光标定位到某个方法或者资源id的调用处,按Ctrl + B,将会跳入该方法或者资源文件内部,功能等同于Ctrl + 鼠标左键。如果将鼠标光标定位到方法定义处或者资源文件内部,按Ctrl + B将会返回调用处。2、Ctrl + O:查看父类中的方法, 并可以选择父类方法进行覆盖。将鼠标光标定位到类中代码的任意位置,按Ctrl + O,将会在打开的面板中查看到所有父类中的所有非私有方法,选择某个方法按Enter即可覆盖父类方法。3、Ctrl + K

2020-10-10 10:21:47 539

原创 Ubuntu 下 安装微信、QQ

Ubuntu 下 安装微信、QQ(使用 deepin wine)1、打开终端输入:$ wget -O- https://deepin-wine.i-m.dev/setup.sh | sh2、然后按照上图提示的命令,分别安装:微信、QQ、TIM(1)安装/更新微信:$ sudo apt-get install deepin.com.wechat(2)安装/更新 QQ:$ sudo apt-get install deepin.com.qq.im(3)安装/更新 TIM:$ sudo apt-get

2020-09-23 14:35:23 776

原创 Linux 上修改文件权限

在 Linux 中,要修改一个文件夹或文件的权限,需要用到 chmod 命令。一、基本语法chmod [who] [ + / - / = ] [mode] [文件名] 其中,各选项的含义如下:**1、第一项:**权限所有者(1)u:表示”用户(user)”,即:文件或目录的所有者。(2)g:表示“同组(group)用户”,即:与文件有相同组ID的所有用户。(3)o:表示“其他(others)用户”。(4)a:表示“所有(all)用户”,它是系统默认值。**2、第二项:**操作符号(1)

2020-09-04 20:00:17 546

原创 dumpsys 概述

dumpsys 是 Android 系统里面的一个可执行文件,其主要作用:将当前 Android 系统的一些信息 dump 出来(例如:Activity、package等)。dumpsys 是一个分析 Android 设备问题、查看运行状态、使用情况等十分有效的工具。...

2020-08-20 17:46:26 1695

原创 Context 详谈

Activity 能否使用如下写法:Activity mActivity = new Activity()?Android 的应用程序开发采用 Java 语言,Activity 本质上也是一个对象,但是,Android 程序不像 Java 程序一样,随便创建一个类,写个main() 方法就能运行。Android 应用模型是基于组件的应用设计模式,组件的运行要有一个完整的 Android 工程环境,在这个环境下,Activity、Service 等系统组件才能够正常工作,而这些组件并不能采用普通的 Java

2020-08-10 18:19:09 224

原创 OpenGL ES 概述

OpenGL(Open Graphics Library,开放图形库)是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。它的体系简单,而且具有跨平台的特性,不仅适用于大型图形工作站,也适用于 PC。但是在一些手机之类的小型设备上,OpenGL 使用就比较困难了,因为三维图形计算需要处理大量数据。于是,Khronos 协会针对手机、PDA、游戏主机等嵌入式设备,提供了 OpenGL 的一个子集:OpenGL ES(OpenGL for Embedded System)。一、概述

2020-08-07 17:54:41 277

原创 BugReport 概述

Android BugReport 中包含文本 (.txt) 格式的 dumpsys、dumpstate、logcat 数据,便于轻松搜索特定内容。以下各部分详细说明了BugReport 的组成部分及常见问题,并提供了关于查找与这些错误相关的日志的实用提示和 grep 命令。一、如何阅读 BugReport1、LogcatLogcat 日志是所有 Logcat 信息采用字符串形式的转储。其中,包括:System Log、Event Log。(1)System Log 部分专门用于记录框架方面的信息,

2020-08-03 11:37:03 4407 1

原创 Android 性能优化概述

附录:(1)Android 性能优化典范

2020-07-30 10:12:02 111

原创 性能问题分析03-整机卡顿

一、Systrace分析卡顿问题案例1、使用Systrace脚本抓取trace在 Android/Sdk/platform-tools/systrace 目录下,打开终端,执行:$ python systrace.py手机进行操作,完成后,按回车键即可自动抓取操作阶段的trace,并生成 trace.html,在浏览器中打开即可。2、分析思路(1)从Systrace中找到导致卡顿的帧。(2)一般情况下,分析该帧绘制过程涉及的三个关键线程:UI thread、Render thread、surfa

2020-07-29 20:38:18 229 1

原创 VSync 信号处理

一、基本概念1、帧率(Frame Rate)指 GPU 生成帧的速率,单位:fps,如:33fps、60fps,越高越好。2、屏幕刷新率(Scanning Frequency)指设备刷新屏幕的频率,单位:赫兹/Hz,该值对于特定的设备来说是个常量,如:60Hz。(注:对于一个特定的设备,帧率和刷新频率没有必然的大小关系。)屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),然后从上到下(屏幕刷新,垂直刷新,Vertical Scanning)。当整个屏幕刷

2020-07-29 15:05:15 2275

原创 Android.mk 文件解析

Android.mk 文件其实是把 Makefile 包装起来,做成了一个对使用者来说很简单的东西。使用它来编译程序时,不管是动态库、可执行的二进制文件,还是Jar库、APK包,只要沿着一个简单的思路来做三大步就可以了:清除旧变量;设置新变量;调用编译函数。对于初学者来说,需要明白的是,Android 如何让使用脚本的人从 Makefile 语法中解放出来,简单地按照上面的三大步就可以编译出任何模块。一、Android.mk 文件1、举例## 拿 AlarmClock 举例说明// 1.清除旧变量

2020-07-28 20:39:46 272

原创 Perfdump 工具

一、如何使用 Perfdump点击安装好的perfdump应用,是否configure点击ok,点击右上角save,打开Manual mode[Games],回到桌面即可(一键清理或者重启手机需要重新打开)如下图所示,出现一个小框:左边点击为圆形表示正在抓取帧率,为倒三角表示停止抓取,左边数字表示当前帧率,右边数字值是屏幕刷新率与当前帧率之差。...

2020-07-28 14:35:47 13055

原创 Simpleperf 工具介绍

Simpleperf 是Google随NDK一起发布的一款profile工具(注:从NDK r13开始),它是针对Android平台的一个本地层性能分析工具。它的命令行界面支持与linux-tools perf大致相同的选项,但是它还支持许多Android特有的改进。一、常用命令1、Simpleperf 的三个主要功能:(1)Stat 命令:给出了在一个时间段内被分析的进程中发生了多少事件的摘要。(2)Record 命令:在一段时间内记录剖析进程的样本,生成 perf.data 文件。(3)Rep

2020-07-24 11:44:18 3074

原创 feature_manager 工具

一、device_features 使用方法1、获取 device_features 中的配置 ( 路径:miui/cust/device_features )其目录结构如下:├── feature_manager -> …/…/build/tools/feature_tools.py├── readme.txt├── released│ └── device_features└── unreleased[说明](1)feature_mana

2020-07-23 09:27:57 929

原创 Simpleperf ---- 使用示例

常用的Android性能剖析工具:Systrace、Simpleperf。其中,Systrace的优点在于它可以给出整个系统的一些关键模块的性能信息,但是它支持的分析自定义模块,使用起来稍显复杂。另外,在AOSP中的性能剖析工具有:Simpleperf。一、Systrace二、Simpleperf1、原理简单来说,现代CPU一般都带有一个叫做性能监视单元(PMU)的组件,这个硬件能够记录诸如:CPU周期数、执行的指令数、缓存失效次数等关键信息;Linux内核对这个硬件做了一层封装,通过perf_ev

2020-07-22 21:04:39 1320

原创 IPC-进程间通信

一、进程间通信(IPC:Inter Process Communication)1、操作系统中的各个进程,通常存在于独立的内存空间,并且有着严格的机制来防止进程间的非法访问。但是,这并不代表进程与进程间不允许互相通信,相反,进程间通信是操作系统中一个重要的概念,应用非常广泛。广义上,进程间通信是指运行在不同进程之间(不论是否在同一台机器)的若干线程间的数据交换。如下图所示:原则上,任何跨进程的数据交换都可以称为进程间通信。IPC 中参与通信的进程,既可以运行在同一台机器上,也允许他们存在于各自的设备

2020-06-30 20:31:21 311

原创 C++ 02-核心编程

(注意:本阶段,主要针对 C++ 面向对象编程技术。)一、内存分区模型1、C++ 程序在执行时,将内存大致划分为4个区域:(1)代码区:存放函数体的二进制代码,由操作系统进行管理的。(2)全局区:存放全局变量和静态变量以及常量。(3)栈区:由编译器自动分配和释放,存放函数的参数值、局部变量等。(4)堆区:由程序员分配和释放,若程序员不释放,那么程序结束时,由操作系统回收。2、内存分四区的意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。3、程序运行前:在程序编译后,生成

2020-06-11 16:31:34 225

原创 C++ 01-基础知识

一、变量和常量1、变量(给一段指定的内存空间起名,方便操作这段内存)语法:数据类型 变量名 = 初始值;(如:int a = 10;)2、常量(用于记录程序中不可更改的数据)C++中定义常量的两种方式:(1)#define 宏常量:#define 常量名 常量值(通常在文件上方定义,表示一个常量)(2)const 修饰的变量:const 数据类型 常量名 = 常量值;(通常在变量定义前,加关键字const,修饰该变量为常量,不可修改)...

2020-06-10 15:30:55 284

原创 Linux 常用命令

1、Linux下解压缩文件:不同的后缀的文件解压缩的命令都不一样,总结如下:(1).tar 用 tar –xvf 解压(2).gz 用 gzip -d 或者 gunzip 解压(3).tar.gz 和 .tgz 用 tar –xzf 解压(4).bz2 用 bzip2 -d 或者 bunzip2 解压(5).tar.bz2 用 tar –xjf 解压(6).Z

2020-06-10 10:45:19 185

原创 Fastboot 常用命令

升级文件名 → update 作用: 刷入ROM 列句: fastboot update update.zip刷入所有镜像 → flashall 作用: 刷入boot.img、system.img、recovery.img 列句: fastboot flashall update.zip刷入镜像 → flash

2020-06-10 10:37:36 1205

原创 Git 概述

1、GitHub基础(1)基本概念:<1> 仓库(Repository)仓库是用来存放项目代码的,每个项目对应一个仓库,多个开源项目,则有多个仓库。<2> 收藏(Star)仓库主页的Star按钮,用来收藏项目,方便下次查看。<3> 复制克隆项目(Fork)注意:该Fork的项目是独立存在的,对于Fork的项目进行修改,不会改变原始仓库的项目。<4> 发起请求(Pull Request)基于Fork,就是把自己改进后的项目,合并到原始项目上。先

2020-06-10 09:33:59 178

原创 Systrace 工具

1、Systrace是分析Android设备性能的主要工具。不过,它实际上是其它工具的封装容器(是atrace的主机端封装容器),是用于控制用户空间跟踪和设置ftrace的设备端可执行文件,也是Linux内核中的主要跟踪机制。2、Systrace使用atrace来启用跟踪,然后读取ftrace缓冲区,并将其全部封装到一个独立的 HTML查看器中。(虽然较新的内核支持Linux增强型-柏克莱封包过滤器(eBPF),但是以下文档内容,仅适用于 3.18内核(无eFPF),因为Pixel/Pixel XL 上

2020-06-10 09:21:08 1241

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除