自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 安装redis

通过yum安装redis

2022-11-24 10:29:53 171 1

原创 安装Mysql

通过yum安装mysql

2022-11-24 10:29:21 157

原创 安装nginx

通过yum安装nginx。

2022-11-24 10:28:50 152

原创 自动签名配置

自动签名配置

2022-11-24 10:27:20 260

原创 屏幕展示UI的原理

帧(Frame),一帧就是一幅静止的画面。

2022-11-24 10:26:13 191

原创 自定义悬浮窗

我们在APP中想不依赖Activity中的布局添加View时,可以通过WindowManager.addView()的方式,创建一个window,并显示添加的View。

2022-11-24 10:25:15 1738

原创 APP被修改检测探索

现在市面上,诸如:MT管理器、APK Editor等软件,可以对APK文件进行修改,提取AndroidManifest文件,修改包名、版本号、图标、应用名称等。通过修改版本号,可以跳过应用升级检测,从而出现新版本修复的漏洞无法修复的情况;还会造成新功能无法使用,新推广的业务无法正常展开。

2022-11-24 10:23:48 1055

原创 Android逆向工具

dex2jar 工具主要是将 dex 文件转换为包含 class 文件的 jar 文件。JD-GUI 工具是针对从dex 转为jar后的文件,进行可视化读取与展示。

2022-11-24 10:23:23 127

原创 无障碍(二)检测与防范

由无障碍(一)功能实现我们知道,无障碍服务可以获取界面上的控件和控件的文案信息。那么就可以通过文案做一些自动化操作。比如:自动刷新,找到列表中符合条件的票务信息、订单信息,找到抢票按钮,实现自动抢单操作。

2022-11-24 10:22:39 4521

原创 无障碍(一)功能实现

是一种应用,它可以模拟用户操作。协助残障用户或无法与设备进行全面互动的用户完成操作。例如,正在开车、照顾孩子或参加喧闹聚会的用户可能需要其他或替代的界面反馈方式。抢红包、一键获取权限、自动抢单等功能中。详情可以了解官网介绍。

2022-11-24 10:22:05 411

原创 JUC(四)线程池

创建线程的代价是十分昂贵的, 需要给它分配内存、列入调度。Java中默认一个线程的线程栈大小是1M,虽然看着不多,但是如果同时创建很多线程,占用的内存也是不容忽视的。

2022-11-23 10:51:15 1253

原创 JUC(三)CAS与原子变量

CAS(compare and swap),比较并交换。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。通过CAS可以实现原子操作。

2022-11-23 10:49:40 107

原创 JUC(二)锁

volatile可以保证可见性和有序性,那么使用volatile可以达到线程安全吗?

2022-11-23 10:48:10 88

原创 JUC(一)JMM内存模型

JMM((Java Memory Model)是Java内存模型,与JVM内存模型不同,与CPU内存模型相似它定义了程序中各个共享变量的访问规则它屏蔽了各种硬件和操作系统的内存访问差异,使Java程序在各种平台下都能达到一致的内存访问效果如上图所示,每个线程拥有自己的工作内存(类比于高速缓存),工作内存中保存的是主内存中变量的副本,线程对变量的读写操作是在自己的工作内存中进行,而不是直接读写主内存中的变量。由于每个线程都有一个共享变量副本,因此在多线程环境下,就会出现问题。

2022-11-23 10:46:32 145

原创 JVM(五)类加载

上文已经知道Android的类加载流程,可以看到会通过BaseDexClassLoader.pathList来寻找class,而DexPathList又是通过字段dexElements进行查找,热修复就是通过反射拿到DexPathList,生成新的Element数据,将他的dexElements替换掉从而达成修复的目的。

2022-11-23 10:44:41 86

原创 JVM(四)GC

在Java SE 8的文档中,有这样一句话: An object is considered garbage when it can no longer be reached from any pointer in the running program.垃圾是指在程序运行过程中,没有被任何指针引用的对象。

2022-11-23 10:42:10 146

原创 JVM(三)堆与对象

内存分配完成后,虚拟机需要将分配到的内存空间初始化为零值(不包括对象头),保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。初始化零值之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。如果对象未发生逃逸,该对象就可以分配在栈内存中,和方法的生命周期一致,随着栈帧出栈时销毁,从而减少GC运行频率。如果堆区是规整的,已知对象的内存,只需要更新指针的位置即可。

2022-11-23 10:40:13 202

原创 JVM(二)虚拟机栈

每个JVM线程都有一个JVM栈,栈中保存着栈帧(Frame)。

2022-11-23 10:37:28 265

原创 JVM(一)简介

Java Virtual Machine,是一种规范,可以将class字节码文件转换成机器码指令。任何语言(如:kotlin、groovy等),只要最终编译成class,即符合jvm规范的字节码文件,就可以在jvm虚拟机上运行。详情可参考Java虚拟机规范。

2022-11-23 10:34:07 317

原创 APP启动优化与黑白屏

通过APP冷启动的流程,可以看到1、2、3步骤都是系统进行的操作,很难进行优化;而4、5两步,分别执行Application的onCreate和Activity的onCreate、onStart,应尽量避免耗时操作。

2022-11-23 10:23:54 1376

原创 AMS-Activity启动流程

本文基于Android_9.0、kernel_3.18源码由PMS-PackageManagerService我们知道,PMS会在开机/安装app时解析APK的AndroidManifest.xml文件,并将解析的结果缓存在PMS中。接下来分析启动Activity的流程。Launcher启动流程frameworks/base/services/java/com/android/server/SystemServer.javaframeworks/base/services/core/java/c

2022-01-08 21:07:35 1938

原创 PMS-PackageManagerService

本文基于Android_9.0、kernel_3.18源码PMS的作用在讨论PMS作用之前,我们不妨考虑一个问题:如果我们想要打开一个app,要经历哪些过程?1、遍历data/app目录找到apk2、解析AndroidManifest.xml文件3、找到要启动的Activity,加载class4、实例化Activity对象,进行展示显然如果每次启动一个app都进行这几步操作,是非常消耗资源的,因此google设计了PMS、AMS来完成这些工作:前两步由PMS完成,在开机时解析xml,然后对

2021-12-24 20:27:06 1157

原创 Javassist实现无侵入埋点

Apk编译流程Apk编译流程主要经过以下几步:1、使用javac将java文件编译成class2、使用dex工具将class打包成dex3、使用apkbuilder工具将dex、资源文件打包成apk4、使用jarsigner工具对apk签名其实在编译过程中,google工程师留给了我们很多api用来添加自己的操作。如APT在编译时可以对代码进行处理,Transform在将class打包成dex中途,可以对class文件做自己的处理。操作流程一、创建工程、基础配置1、新建Java Libr

2021-12-24 16:46:56 621

原创 基于virtual-xposed实现用户隐私行为监听

简介VirtualXposed可以在非root手机上运行xposed插件。通过xposed插件做到各种操作,如:模拟定位、监听用户行为等。原理VirtualXposed 是基于VirtualApp和Epic在非ROOT环境下运行Xposed模块的实现(支持5.0~10.0)https://github.com/android-hacker/VirtualXposed/blob/vxp/CHINESE.mdVirtualApp 是一款运行于Android系统的沙盒产品,可以理解为轻量级的“Andr

2021-12-24 16:46:40 2340

原创 数据结构(一)ArrayList

数组相信大家对数组都很熟悉,但是数组有一个很大的弊端,容量是固定的。因此在不确定数据数量的场景使用起来会很不方便:声明大了浪费空间,声明小了数据存不下。那么是否可以变更它的存储空间呢?ArrayList假设数组的基础长度是3,当想要插入第4个元素(array[3])时,可以考虑这样的算法:1、重新申请一块连续的空间,空间大小为5。2、将原来的数据依次复制到新的数组中3、将第4个元素插入新数组相应的位置这样,我们便可以摆脱数据长度的限制,放心的使用。ArrayList便是基于这种算法实现的

2021-12-24 16:46:26 299

原创 数据结构(二)LinkedList

引言由上一篇我们知道,ArrayList的优势是查询速度快,但是插入、删除相对较慢,那对于需要大量增、删操作的数据,该用什么样的结构呢?链表如图所示,定义一种链表结构,每一个节点都持有下一个节点的引用,当增加元素时,只需要修改当前位置的指向即可,速度就会比ArrayList复制快。显然,它有一个弊端,如果我们想获取最后一个元素,必须从第一个元素一个一个查下去,浪费时间。为了提高查询效率,定义如下结构:每个元素都持有它前、后两个元素的引用,在遇到上述问题,会大大缩短查询时间。LinkedL

2021-12-24 16:46:09 284

原创 Retrofit源码分析

简介Retrofit turns your HTTP API into a Java interface.官网简介,言简意赅。它可以将你的HTTP API简化成一种Java接口的方式书写。1、地址retrofit github地址:https://github.com/square/retrofitretrofit官网:https://square.github.io/retrofit/gradle依赖:implementation 'com.squareup.retrofit2:retrof

2021-12-23 15:32:17 628

原创 Binder(七)系统服务注册流程总结

本文基于Android_9.0、kernel_3.18源码通过Binder(三)到Binder(六)的相关文章,我们详细介绍了Binder服务启动、服务注册的流程;其中服务注册相当于servicemanager提供的一个方法,AMS在system_server进程中,AMS完成注册即通过binder完成了一次跨进程通信,我们再梳理一下整体流程。流程梳理一、初始化1、service_manager进程创建之后,会进行binder的初始化:(1)通过binder_open打开dev/binder,创

2021-12-23 15:29:14 293 1

原创 Binder(六)服务注册流程-请求处理、反馈

本文基于Android_9.0、kernel_3.18源码上文Binder(五)服务注册流程-发送注册请求提到,AMS通过addService会将数据发送给binder驱动,然后创建binder_transaction,并唤醒servicemananger进程进行处理。在Binder(三)servicemanager初始化我们知道,由于没有待处理的事务,servermanager进程会进入中断状态。请求处理1、binder_thread_readstatic int binder_thread_r

2021-12-23 15:27:53 1006

原创 Binder(五)服务注册流程-发送注册请求

本文基于Android_9.0、kernel_3.18源码简介servermanager提供了服务注册、服务获取等功能,以AMS(ActivityManagerService)为例:首先, AMS通过binder将自己注册到servermanager中;然后, 其他进程通过binder从servermanager获取到AMS服务(取到的其实是代理);最后, 通过获取到的AMS代理对象便能调用到AMS的方法。本文主要介绍服务注册的流程。调用SystemServer.java->main()

2021-12-23 15:25:29 1128

原创 Binder(四)system_server中binder的初始化

本文基于Android_9.0、kernel_3.18源码引言由Zygote进程简介,我们知道android进程之间的关系;system_server是由zygote进程fork出来的,那它中间是怎样操作的呢?frameworks/base/cmds/app_process/app_main.cppframeworks/base/core/java/com/android/internal/os/ZygoteInit.javaframeworks/base/core/java/com/andro

2021-12-23 15:19:17 848

原创 Binder(三)servicemanager初始化

本文基于Android_9.0、kernel_3.18源码由Zygote进程简介我们可以得到以下的关系图,init进程通过解析init.rc配置,启动zygote进程和service_manager进程。service_manager初始化流程frameworks/native/cmds/servicemanager/service_manager.cframeworks/native/cmds/servicemanager/binder.ckernel_common/drivers/andr

2021-12-23 15:16:43 928

原创 Binder(二)简介

根据Binder(一)Linux进程通信,我们知道,各个进程的内存空间是相互隔离的,他们之间想要通信,需要借助内核空间中转。在Android中,便是通过Binder驱动进行通信的,它是Binder机制的核心。Android为什么要使用Binder通过上一篇文章我们知道,linux中常见的进程通信有管道/消息队列/共享内存/Socket等,接下来从架构/性能/安全性等方面进行比较。1、从架构考虑Binder是一套基于C/S架构的通信方式,但是目前linux中支持的进程通信中,只有Socket是C/S.

2021-12-23 15:11:57 508

原创 Binder(一)Linux进程通信

用户空间、内核空间Linux分为内核进程和用户进程:1、内核进程共享一块内存空间,称为内核空间。2、内核进程不能访问用户空间。3、用户进程有自独立的地址空间,彼此隔离。4、用户进程通过系统调用,从用户态陷入内核态,可以访问到内核空间。进程通信的手段1、共享内存获取一块内存区域,两个用户进程都能够访问,便可实现进程间通信。2、系统调用借用内核态可以访问内核空间的特性,通过内核空间进行数据传输:用户进程A通过系统调用,进入内核态,向内核空间写入数据;用户进程B通过系统调用,进入内核态

2021-12-23 15:10:11 640

原创 Handler(二)Native实现

本文基于Android9.0源码引言通过上一篇Handler(一)源码解析,我们对Handler已经有了一定的了解,我们再深入分析一下Handler Native实现。frameworks/base/core/jni/android_os_MessageQueue.cppframeworks/base/core/jni/android_os_MessageQueue.hsystem/core/libutils/Looper.cppsystem/core/include/utils/Looper

2021-12-23 15:05:37 550

原创 Handler(一)源码解析

前言Android Handler基本是面试必问的知识点,也是了解Android源码的第一步,那么Handler到底是什么呢?接下来我们一探究竟。Handler基础Handler主要涉及4个类,分别是Handler、Looper、Message、MessageQueue。Handler发送消息-处理消息流程那么它们是如何相互作用,来实现Handler的功能的呢?1、通过调用sendMessage、post等方法,会最终调用到Handler的enqueueMessage方法

2021-12-23 15:04:04 456

原创 Zygote进程简介

本文基于Android_9.0、kernel_3.18源码#Android手机进程打开控制台,使用adb shell,然后执行ps -A命令;便可看到Android系统中运行的进程。PID是进程号,PPID是父进程号。PID越小启动越早。通过梳理我们可以得到以下的关系图:#init进程打开android手机后,会先启动bootloader引导程序,当kernel完成系统设置后,它会拉起init进程。init进程主要进行文件夹创建挂载、init.rc文件解析等操作。system/core/

2021-12-20 16:56:33 1382

空空如也

空空如也

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

TA关注的人

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