自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 Android 进阶解密读书笔记(十四)——插件化原理

插件化的客户端由宿主和插件两部分组成,宿主就是指先被安装到手机中的apk,就是我们平常加载的普通apk。插件一般是指经过处理的apk、so和dex等文件,插件可以被宿主进行动态安装。常用的插件化框架 DynamicApk、DroidPlugin、RePlugin。

2023-03-12 11:05:47 470

原创 Android 进阶解密读书笔记(十三)——Hook技术

Hook技术简介

2023-03-11 22:08:35 641

原创 Android进阶解密读书笔记(十二)——热修复原理

总结一下so修复主要有两个方案:(1)将 so 补丁插入到 NativeLibraryElement 数组的前部,让 so 补丁的路径先被返回和加载(2)调用 System的load方法来接管 so 的加载入口

2023-02-22 21:56:43 397

原创 Android进阶解密读书笔记(十一)——理解 ClassLoader

定义一个自定义 ClassLoader 并继承抽象类 ClassLoader复写 findClass 方法,并在 findClass 方法中调用 defineClass 方法。

2022-08-28 17:16:27 729

原创 Android进阶解密读书笔记(十一)——Dalvik和ART

ART 的运行时堆的空间也会有不同的划分,默认是由4个Space 和多个辅助数据结构组成的;4个Space分别是 Zygote space、Allocation Space、Image Space 和 Large Object Space。Zygote Space、Allocation Space和 DVM 中的作用是一样的,Image Space 用来存放一些预加载类;ART会为那些主动请求的垃圾收集事件或者认为GC速度慢时才会打印日志,GC速度慢指的是GC暂停超过5ms或者GC持续时间超过100ms。.

2022-08-21 19:56:26 910

原创 Android进阶解密读书笔记(十)——Java虚拟机

一、Java虚拟机的执行流程Java虚拟机执行流程分为两大部分:编译时环境和运行时环境,当一个Java文件经过Java编译器编译后会生成class文件,这个class文件会由Java虚拟机来进行处理Java虚拟机与Java语言没有什么必然的联系,它只与特定的二进制文件:Class文件有关;因此无论任何语言只要能编译成Class文件就可以被Java虚拟机来处理二、Java虚拟机结构Java虚拟机结构包括运行时数据区域、执行引擎、本地库接口和本地方法😭,其中类加载子系统并不属于Java虚拟机的内

2022-08-14 16:24:24 831

原创 Android进阶解密读书笔记(九)——JNI原理

JNI是Java Native Interface的缩写,一般有以下情况会用到JNI:需要调用java语言不支持的依赖于操作系统平台特性的一些功能 为了整合一些以前的非java语言开发的系统 为了节省程序的运行时间,必须采用其他语言来提升运行的效率1、Native方法注册(1)静态注册...

2022-04-26 21:55:58 1600

原创 Android进阶解密读书笔记(八)——理解WindowManagerService

1、WMS的职责,主要有以下几点:窗口管理:WMS是窗口的管理者,它负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的。窗口管理的核心成员有DisplayContent、WindowToken和WindowState 窗口动画:窗口间进行切换时,使用窗口动画可以显得更炫一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimator 输入系统的中转站:通过对窗口的触摸而产生触摸事件,InputManagerService(IMS)会对触摸事件进行处理,它

2022-04-13 21:09:30 479

原创 Android 面试总结(一)

一、Activity的四种启动模式standard(标准模式):系统默认的模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。当我们用 Application Context去启动standard模式的Activity的时候会报错,是因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但是由于非Activiy类型的Context(如Application Context)并没有所谓的任务栈,所以就会报错,解决这个问题的方法就是为待

2022-04-10 11:04:05 2110

原创 Android进阶解密读书笔记(七)——理解WindowManager

1、Window、WindowManager和WMSWindow是一个抽象类,具体的实现类为PhoneWindow,它对View进行管理 WindowManager是一个接口类,继承自接口ViewManager,用来管理Window的,它的实现类为WindowManagerImpl WindowManger会将具体的工作交给WMS来处理,WindowManager和WMS通过Binder来进行跨进程通信总的来说就是 WindowManger 将工作交给WMS来处理,并且对Window进行管理,也就

2022-04-09 11:05:03 562

原创 Kotlin学习——多平台程序设计

平台相关声明Kotlin 多平台代码的一个关键功能是让公共代码能够依赖平台相关声明的一种方式。在其他语言中,这通常可以通过在公共代码中构建一组接口并在平台相关模块中实现这些接口来完成。但是,当在某个平台上有一个实现所需功能的库,并且希望直接使用该库的API而无需额外包装器时,这种方法并不理想,此外它需要以接口表示公共声明,这无法覆盖所有可能情况作为替代方案,Kotlin提供了一种 预期声明与实际声明的机制。利用这种机制,公共模块可以定义 预期声明,而平台模块可以提供与预期声明相对应的实际声明/

2022-02-26 11:07:53 2234

原创 Kotlin学习——集合(三)

List 相关操作按索引取元素List的特点是能通过索引访问特定元素,因此读取元素的最简单方法是按索引检索它。通过 get() 函数或简写语法 [index] 来传递索引参数完成按索引取元素的所有常用操作:elementAt()、first()、last()与取单个元素操作如果List长度小于指定的索引,则抛出异常,不过有两个函数能避免此类异常:getOrElse() 提供用于计算默认值的函数,如果集合中不存在索引,则返回默认值 getOrNull() 返回 null 作为默认值v

2022-01-27 21:44:01 3513

原创 Kotlin学习——集合(二)

区间与数列Kotlin 可以通过调用 kotlin.ranges 包中的 rangeTo() 函数及其操作符形式的 .. 轻松地创建两个值的区间。通常,rangeTo() 会辅以 in 或 !in 函数if( i in 1..4){ //等同于 1 <= i && i <= 4 print(i)}for( i in 1..4) print(i)//反向迭代,使用 downTofor( i in 4 down 1) print(i)//通过 step

2022-01-23 16:59:46 1537

原创 Kotlin学习——集合(一)

集合概述集合通常包含相同类型的一些(数目也可以为零)对象。集合中的对象称为元素或者条目。下面是 Kotlin 相关的集合类型:List 是一个有序集合,可以通过索引访问元素。元素可以在 list 中出现多次。列表的一个示例是一句话:有一组字、这些字的顺序很重要并且字可以重复 Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字母的集合(set) Map 是一组键值对。键是唯一的,每个键刚好映射到一个值。值可以重复。

2022-01-10 17:50:16 1878

原创 Kotlin学习——函数与Lambda表达式

函数Kotlin中函数使用 fun 关键字声明fun double(x: Int){ return 2 * x}//调用函数使用传统的方法val result = double(2)//调用成员函数使用点表示法Stream().read()参数函数参数使用 Pascal 表示法定义,即 name: type 。参数用逗号隔开,每个参数必须有显式类型。默认参数:函数参数可以有默认值,当省略相应的参数时使用默认值。与其他语言相比,这可以减少重载数量fun power

2022-01-07 17:54:20 2110

原创 Kotlin学习——类与对象(三)

泛型与Java类似,Kotlin中的类也可以有类型参数。要创建这样类的实例,我们需要提供类型参数,但是如果类型参数可以推断出来,例如从构造函数的参数或者从其它途径,允许省略类型参数class Box<T>(t: T){ var value = t}val box: Box<Int> = Box<Int>(1)//1具有类型Int,所以编译器知道我们说的是 Box<Int>val box: Box(1)内部类标记为 inne

2022-01-05 17:12:49 1304

原创 Kotlin学习——类与对象(二)

扩展Kotlin能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。这通过叫做扩展的特殊声明完成。例如,可以为一个不能修改的、来自三方的库中的类编写一个新的函数。这个新增的函数就像那个原始本来就有的函数一样,可以用普通的方法调用。这种机制成为扩展函数。此外,也有扩展属性,允许为一个已经存在的类添加新的属性扩展函数声明一个扩展函数,需要用一个接收者类型也就是被扩展的类型来作为它的前缀。下面代码为 MutableList<Int> 添加一个 swap 函数:

2022-01-04 17:42:45 762

原创 Kotlin学习——类与对象(一)

类与继承构造函数在Kotlin中一个类可以有一个主构造函数以及一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名(与可选的类型参数)后class Person constructor(firstName : String){ /*...*/}//如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字class Person(firstNane: String){/*....*/}主构造函数不能包含任何的代码。初始化的代码可以放到以 init

2022-01-03 20:14:30 480

原创 Kotlin学习——基础

Kotlin基础知识

2022-01-02 15:47:43 1143

原创 JNI实用技巧

1、在C++层创建Java对象在C++中获取到对应的Java对象,并通过setIntField()方法,对width属性进行赋值//1、根据传入的包名获取到clazz对象(传入参数的为完整包名)jclass clazz = env -> FindClass("java/util/date")//2、根据clazz对象我们可以获取到构造方法jmethodID construcotr = env -> GetMethodId(clazz,"<init>","()V");

2021-12-26 17:04:47 1098

原创 OpenGL学习——基础概念

图形渲染管线(Graphics Pipeline)一堆原始图形数据途径一个输送管道,期间经过各种变化处理最终出现在屏幕的过程。OpenGL中是将3D空间坐标转换成为2D像素坐标着色器(Shader)GPU在渲染管线中快速处理你的数据的小程序图元(Primitive)提示我们所想渲染的类型,如GL_POINTS、GL_TARIANGLES、GL_LINE_STRIP基本数据类型Vec2:包含了两个浮点数的向量Mat2:2*2的浮点数矩阵Sampler2D:用于访问浮点型的二维数组Vec3 p

2021-12-19 14:07:17 296

原创 Android进阶解密读书笔记(六)——理解ActivityManagerService

Android 7.0 和 Android 8.0 对于 AMS 相关部分处理有较大的区别Android 7.0 的 AMS 家族主要有三个类 ActivityManager ActivityManager 是一个和 AMS 相关联的类,它主要对运行中的 Activity 进行管理,这些管理工作并不是由 ActivityManager 来处理的,而是交由 AMS 来处理的 ActivityManagerNative(AMN) AMN 是一个抽象类,它将功能交由它的

2021-11-10 18:00:00 2034

原创 adb 命令模拟操作事件

//按下电源键(keyevent+keycode代表按下那个键)adb shell input keyevent 26(keycode) //在屏幕上点击坐标 x:640 y:1721 位置adb shell input tap 640 1721 //在屏幕上从(500,1800) 滑动到(500,1000)adb shell input swipe 500 1800 500 1000 //在屏幕上从(500,1800) 滑动到(500,1000) 耗时500ms(单位.

2021-11-10 10:15:36 565

原创 Ubuntu下安装pygame

1、更改自己Ubuntu系统下的源在 /etc/apt/sources.list 文件中是我们的源,我们需要更换为清华大学或者阿里云源。(ps:之前可能更换过源,但是下载速度还是很慢,可能是之前更换的源有问题,所以需要再次更换一下源)清华大学源镜像ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror进入网址根据自己的Ubuntu版本选择对应的源#ubuntu 20.04LTS# 默认注释了源码镜像以提高 apt up

2021-11-09 12:06:53 1871

原创 开发工具之 Repo 学习

定义Repo 可以在必要时整合 Git 代码库,将相关内容上传到我们的Gerrit修订版本控制系统,并自动执行 Android 的开发工作流程的部分环节。Repo 命令是一段可执行的 Python 脚本,您可以将其放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作。也就是说 Repo 是谷歌用 Python 脚本写的调用 git 的一个脚本,可以管理多个 git 库作用Android 源代码工程(AOSP)也采用 Git 来进行版本管理。AOSP 作为

2021-11-03 17:29:57 8051

原创 CameraAppFramework流程之setRepeatingRequest

CameraCaptureSession.SetRepeatingRequestApp 调用该方法开始预览流程,通过层层调用最终会调用到Framework中的submitCaptureRequest方法,该方法主要作了两件事: 首先调用CameraService层CameraDeviceUser的submitRequestList方法,将此次Request下发到Cameraervice中 其次App通过参数传入的CameraCaptureSession.CaptureCallback对象

2021-11-01 22:00:00 869

原创 Android进阶解密读书笔记(五)——理解上下文 Context

Context 的关联类 Context 意为上下文,是一个应用程序环境信息的接口 它的使用场景总的来说分为两大类: 使用 Context 调用方法,比如启动Activity、访问资源、调用系统级服务等 调用方法时传入 Context,比如弹出 Toast、创建 Dialog等 Activity、Service和Application都间接地继承自 Context,因此我们可以计算出一个应用程序进程中有多少个 Context,这个数量等于Activity和Serv

2021-10-29 17:13:56 1343

原创 Android进阶解密读书笔记(四)——四大组件的启动过程

根 Activity 的启动过程Activity 的启动分为两种,一种是根 Activity 的启动过程,另一种是普通 Activity 的启动过程。根 Activity 指的是应用程序启动的第一个 Activity,因此根 Activity 的启动过程一般情况下也可以理解为应用程序的启动过程。普通Activity 指的是除应用程序启动的第一个 Activity 之外的其他 Activity。根 Activity 的启动过程分为3个部分:Launcher 请求 AMS 过程、AMS 到 Applicat

2021-10-28 08:00:00 416

原创 资源链接汇总

GoogleCameraDemoGitHub - android/camera-samples: Multiple samples showing the best practices in camera APIs on Android.https://github.com/android/camera-samplesAndroid Systrace 基础知识学习Android Systrace 基础知识 -- Systrace 简介 · Android PerformanceFocus On An

2021-10-27 11:06:15 345

原创 CameraAppFramework流程之CreateCaptureSession

CreateCaptureSession在CameraManager.openCamera() 成功后我们会在 CameraDevice.StateCallback 的 onOpened() 方法中获得到一个 CameraDevice 对象.mCameraDevice.createCaptureSession(SessionConfiguretion config)CameraDevice.java//这个方法会在 CameraDeviceImpl里面实现public void creat

2021-10-25 17:26:29 940

原创 CameraAppFramework流程之CreateCaptureRequest

CreateCaptureRequest创建一个 CaptureRequest 请求,表示一次图像请求,并将一些设置参数添加到这个request中,并通过 CreateCaptureSession 的时候下发给相机系统中CaptureRequest.Builder mCaptureRequestBuilder = CameraDevice.createCaptureRequset(templateType)//CameraDevice.javapublic abstract CaptureR

2021-10-23 08:00:00 752

原创 CameraAppFramework简介

AppCameraManager谷歌将CameraManager定义为一个系统服务,通过 Context.getService 来获取(Context.CAMERA_SERVICE),主要用于检测以及打开系统相机,通过 OpenCamera 方法来打开相机;此外,还定义了 getCameraCharacteristics 方法来获取当前 Camera 设备支持的属性信息,该属性信息通过 CameraCharacteristics 来表示,其中包括了图像数据的大小以及帧率等信息CameraDevi

2021-10-22 08:00:00 263

原创 CameraAppFramework流程之OpenCamera

APP 到 Framework 阶段CameraManager.java谷歌将CameraManager定义为一个系统服务,通过 Context.getService 来获取(Context.CAMERA_SERVICE),主要用于检测以及打开系统相机,通过 OpenCamera 方法来打开相机;此外,还定义了 getCameraCharacteristics 方法来获取当前 Camera 设备支持的属性信息,该属性信息通过 CameraCharacteristics 来表示,其中包括了图像数据的大

2021-10-20 16:45:39 483

原创 Android进阶解密读书笔记(三)—— 应用程序进程启动过程

应用程序进程简介要想启动一个应用程序,首先要保证这个应用程序所需要的应用进程已经启动。AMS 在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求 Zygote 进程启动需要的应用程序进程。在应用程序进程创建的过程中除了获取虚拟机实例外,还创建了 Binder 线程池和消息循环,这样运行在进程中的应用程序就可以方便地使用 Binder 进行进程间通信以及处理消息了应用进程启动过程介绍应用程序进程创建过程分为两个部分来讲解,分别是 AMS 发送启动应用程序进程请求,以及 Z

2021-10-12 14:44:26 231

原创 ANR 日志分析

按产生机制分为四类 输入时间超时(5s)—— InputEvent Timeout a. InputDispatcher 发送 Key 事件给对应的进程的 Foucused Window,对应的 window 不存在、处于暂停态、或者通道(input channel)占满、通道未注册、通道异常、或5秒内没有处理完一个事件,就会发生ANR b. InputDispatcher 发送 MotionEvent 事件有个例外之处:当对应Touched Window 的 Input waitQueue

2021-10-08 12:01:10 480

原创 Android 进阶解密读书笔记(二)——系统启动

僵尸进程与危害:在Linux中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程并不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称为僵尸进程。if(app == null) || app.instr == null): 判断符合Action为 Intent.ACTION_MAIN、Category 为 Intent.CATEGORY_HOME的应用程序是否已经启动,如果没有启动则走下一步。

2021-09-30 17:15:39 392

原创 Android进阶解密读书笔记(一)——Android系统架构

(Android4.4及之前使用的是Dalvik虚拟机,使用的是JIT(just in time)技术来进行代码转译,每次执行应用的时候,Dalvik将程序的代码编译为机器语言执行)位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可以在多种平台上进行移植。系统运行库层(Native) 系统运行层分为两部分:C/C++程序库、Android运行时库。Linux 内核层(Linux Kernel)硬件抽象层(Hal)

2021-09-28 14:31:07 381 1

原创 接口与内部类

代理:任意接口的对象,构造系统及的工具接口中的所有方法都属于publicjava为什么要使用接口而不用一个抽象类呢?使用抽象类每个类只能扩展于一个类而每个类却可以实现多个接口。使用接口的目的:确保类实现某个特定的方法或一组特定的方法回调是一种设计模式,可以指出某个特定事件发生时应该采取的动作。使用内部类的原因:1.可以访问该类定义所在的作用域中的数据,包括私有2.可以对

2016-03-20 16:45:29 177

原创 继承

子类的方法不能直接访问超类的私有域,如果一定要访问的话,就必须借助公有的接口。this:1.引用隐式参数2.调用该类其他的构造器super:1.调用超类方法2.调用超类构造器多态就是一个对象变量可以指示多种实际类型的现象被称为多态,在运行时能够自动地选择调用那个方法的现象称为动态绑定。动态绑定的特性:无需对现存的代码进行修改,就可以对程序进行扩展。声明为final的

2016-03-20 15:28:08 139

原创 JAVA对象和类

类之间最常见的关系:『依赖(uses-a):一个类的方法操纵另一个类的对象聚合(has-a):一个类的对象包含另一个类的对象继承(is-a)』一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。java对象变量(变量的声明)与c++的引用不同,在c++中没有空引用,并且引用不能被赋值。可以将java的对象变量看作C++的对象指针更改器方法:对实例域做出修改的方法(设

2016-03-20 14:54:39 229

空空如也

空空如也

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

TA关注的人

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