自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 APK的安装

DEX优化是Android应用性能优化的重要环节之一。通过DEX布局优化、启动配置文件、代码混淆与压缩、使用D8和R8优化工具以及Dex注解优化等手段,可以显著提升Android应用的启动速度、执行效率和整体性能。需要注意的是,不同的优化策略可能需要结合应用的具体情况和需求来选择和应用。

2024-08-14 17:23:53 1048

原创 Android 多用户问题

在工程模式下,可以使用 getInstalledPackages 或 getInstalledPackagesAsUser 方法获取全部已安装的应用程序,并展示给用户。List 在普通应用中可以获取到,但是在systemUI中获取不到。这个api解决 那为什么systemUI在 0这个组别?在systemserver 里启动的组别就是这个。音频mediassion相关是区分用户的。看了一下是 user组别问题导致的。那么还有没有什么是区别用户的。当然有 PMS也是这样。

2024-07-22 10:56:10 540

原创 Android开机动画关闭流程

一步一图项目上要加一个开机动画结束的回调,我这边看下如何加好,老规矩,如何启动动画?动画是谁启动的?怎么关闭的?谁通知关闭的带着问题看源码动画的启动流程开机动画的主入口在哪?这个main.cpp就是主入口那么是谁通知它启动的?Android系统在启动SystemServer进程时,通过两个阶段来启动系统所有服务,在第一阶段启动本地服务,如SurfaceFlinger,SensorService等,在第二阶段则启动一系列的Java服务。开机动画是在什么时候启动的呢?通过查

2024-06-07 15:54:02 1451

原创 忘记mysql初始密码怎么办!往这看!

注意:你可能需要定位到 mysqld.exe 所在的目录,通常在 C:\Program Files\MySQL\MySQL Server 8.0\bin。可以进入该目录下,直接输入cmd,点击回车。当然也可以回到第一个命令提示符窗口,按 Ctrl + C 停止 MySQL 安全模式。无脑下一步安装,然后关机重启(我认为这个方法比较方便快捷)1、打开cmd,停止MySQL服务。2、启动MySQL服务(安全模式)启动MySQL服务器,忽略权限系统。选择第二个,点击下载,GO!不要慌,到这去---->

2024-05-22 11:15:35 585

原创 解决pycharm写出csv文件乱码问题

1、使用Notepad++文件导入乱码的csv文件。1、打开导出的csv文件,数据可能会出现这种情况。6、选择excelsheet页,导出即可!2、选择格式,utf-8 BOM 编码。3、点击保存或导出CSV文件。2、点击数据-从文本/csv。5、点击【关闭并上载至】

2024-05-22 09:38:23 794

原创 线程池的分析

为什么会有线程池这个东西存在呢?其实原因跟其他池化技术是一样的,都是由于创建对象、连接、线程等操作时是比较“重”的,耗时的,高成本的。针对与这种场景,我们都会采用能复用就复用,而不是每次都要重新的去创建一遍,那么在性能的提升、资源的利用率上,都能获得非常理想的效果。

2024-01-30 13:08:51 962 1

原创 Android 系统启动流程

这里有个小知识点,线程和进程在Linux内核空间是一样的,只是因为共享内存,所以才有线程和进程区分,连调用方法都一样,只是传进去的参数线程会传入的是父进程的用户空间。binder这个死锁是另一个场景,如果你切换了进程,当前线程拿了一把锁,你在这里切进程,锁没人通知它解开就会一直锁住,也会死锁。这是main.cpp的main函数,这个main方法会执行多次,Android系统最初的函数 先看 First。因为socket更安全,binder会有一个线程池,有死锁的风险,为什么有死锁风险?

2024-01-28 16:35:51 1767

原创 HashMap

HashMap提供了四个构造方法,构造方法中 ,依靠第三个方法来执行的,但是前三个方法都没有进行数组的初始化操作,即使调用了构造方法,此时存放HaspMap中数组元素的table表长度依旧为0。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突"或者说,它是如何实现红黑树 + 链表的模式的。

2024-01-11 14:50:29 840

原创 ArrayBlockingQueue 源码分析

ArrayBlockingQueue 实际实现是一个环形数组,并且保护了线程安全,那么是如何保证线程安全的?ArrayBlockingQueue 实际实现是一个环形数组 先看下它咋实现的。offer如果队列满了会抛弃掉,offer方法如果满了会锁住挂起等到加入为止。先看下里面的几个参数是干嘛的。环形数组示例图片嘛,大概这样。环形数组怎么实现的?

2024-01-10 11:48:41 411

原创 Activity 栈管理

上一章笔记写的是Activity的启动流程这章看下AMS的栈管理如何实现Activity栈管理是的另一个重要功能,栈管理又和Activity的启动模式和startActivity时所设置的Flag息息相关,Activity栈管理的主要处理逻辑是在方法中为什么要带Unchecked呢?Unchecked-不确定,是因为在执行这个方法时,我要启动哪个Activity还没决定呢,具体为什么,我想看过这篇文章你就明白了。Activity栈管理相关类Activity栈的管理人。

2024-01-07 16:51:58 860

原创 Activity启动流程

在前面章节中介绍过,启动(或跳转)Activity会先配置一个Intent,这个Intent存放的数据可是很丰富了:包含了启动Activity的信息,传递给Activity的数据,甚至还有启动Activity的方式等等.app进程与AMS不处于同一进程,它们之间的通信使用的是binder,Intent会在"binder这条搭建好的公路"上传递到AMS.上面的方法主要做的事情:会根据mParent是否存在执行不同的逻辑,但是最终都会调用到同一方法。搞一张时序图来看下这个流程,这里只是一个请求流程。

2024-01-04 15:14:33 1149

原创 JVM的小知识总结

将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中。之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。总的来说,尽管对象在堆上分配,但在多线程环境中,线程之间的独立性和引用的独立性通常由于每个线程操作自己的局部变量而得以保持,因此不会产生直接的影响。对象在Java中是分配在堆上的,但每个线程在操作对象时,操作的是对象的引用而不是对象本身。因此,即使对象是在堆上分配的,各个线程分别操作对象引用,不会直接影响到堆上的对象。

2023-11-25 17:26:38 1579 1

原创 MD5的使用

在一般情况下,MD5 算法是设计为尽量避免哈希冲突的,即不同的输入应该产生不同的 MD5 哈希值。MD5 算法的输出长度是固定的 128 位,理论上有 2^128 种不同的可能性,因此对于随机选择的输入,出现哈希冲突的概率非常小。因此,尽管在一般情况下 MD5 可能不会立即出现哈希冲突,但由于已知的漏洞,不再推荐将 MD5 用于安全性要求高的场合。MD5 算法的特性是对输入的敏感性很高,即使输入发生微小的改变,输出的哈希值也会显著不同。",再次计算 MD5 值,两者的 MD5 值会是截然不同的。

2023-11-19 16:23:23 191

原创 WMS简单分析

WMS带着问题看源码token的作用?WMS在移除一个window的时候会移除它的子window嘛?我们以一个dialog为例WindowManagerImpl的addView方式在 WindowManagerGlobal 里的addView方式前面有提到 WindowManagerGlobal的作用 在这里不在重复贴了那么 继续看看下ViewRootImpl的构造函数其实这里面就获得了WMS的对象,老规矩,一个跨进程的服务看下ViewRootImpl setView方法。

2023-11-12 17:28:33 178

原创 Glide 解析2

初始化创建了Glide创建engine、其他工厂创建RequestManagerRetriever绑定生命周期创建对应的RequestManagerload@NonNull@Override@NonNull//通用类,可以处理通用资源类型的设置选项和启动负载//一些转换参数配置//初始化加载监听 onLoadFailed onResourceReady 两个回调//执行 获取默认请求配置@NonNull@Override@NonNull总结。

2023-11-05 18:08:36 150

原创 mysql安装相关问题

1、mysqld --initialized -insecure:初始化MySQL,并且默认密码为空;2、mysqld --initialized --console:初始化MySQL;mysql admin -V,如果出现MySQL的版本信息则说明环境变量设置成功。服务,可以通过“net start myql”命令实现;1、“net start myql”命令:服务名无效,mysqld --install:安装MySQL服务;mysqld -remove:删除MySQL服务;MySQL 服务无法启动。

2023-08-16 16:09:06 55

原创 ClassLoader简单分析

ClassLoader简单分析

2023-08-02 22:18:55 68

原创 Binder的简单分析

Socket 是一种通用的接口,它可以在不同的层级上实现不同的传输协议(如 TCP、UDP),而底层的实现细节则由操作系统负责处理。开发者只需要使用正确的方式进行跨进程通信,并遵循异步操作的原则,让系统自行管理 Binder 线程的创建和销毁。而在跨进程通信中,Socket 可以通过底层的 Binder 机制与其他进程进行通信,传递数据和调用方法。比如一个数组,而内存不一定会有连续的地址,为了解决这种问题,就分为了虚拟内存和物理内存,这是一个比较简单的比喻。一个内存才8G,那么进程就占4G如何处理?

2023-07-17 22:07:24 203

原创 Android 启动流程和AMS简单初步分析

方法其实是在启动虚拟机进行内存管理,虚拟机是为了跨平台而建设的Android 把文件编译成.dex可以跨平台执行。AndroidRuntime 正式开始启动app,那么运行Android Runtime 是在进程上嘛?android 之前使用Android.mk来编译,现在使用Android.bp来编译 是一个脚本文件。那么有个问题,java和native是怎么通信的?每一个进程都是zygote孵化出来,复制出来,所以每个进程都有自己的JVM,也都有自己的虚拟机。那么这里注册JNI是在干什么?

2023-07-02 01:40:17 155

原创 Rxjava flatmap的源码简易解析

就是下游的流,那么如同rxjava图解里的,flatmap会把当前流的数据包装成多个被观察者,然后进行发射数据。在InnerObserver onNext,也就是当前flatmap对应的流发射数据的时候发起tryEmit。这个t就是下游流的对象,当数据到来的时候会先进入MergeObserve里的onNext。如果异步发射集合的话可能会导致内存过高甚至OOM,这时就需要切片进行发射,防止内存过高。先进行cas,失败的存入对列,如果获取到了锁就发射,如果没有获取到锁就等待发射。这个actual是谁?

2023-07-01 15:13:31 114

原创 Glide 三级缓存的简单分析

这是一个简易的流程图,磁盘缓存如果访问到了就会复制给活动缓存,而内存缓存会剪切到活动缓存当中,那么问题来了,这个流程是如何实现的?而移除的时候如果被移除了就会出问题,这个时候就要使用一个非LRU的活动缓存。有可能获取到的磁盘缓存的策略,那么就不会走网络流程而是走磁盘缓存的流程。当 onDestory的时候会把活动缓存释放到内存缓存里面。活动缓存是为了防止正在访问的过程当中被删除而创建的缓存。put的时候如果大于的时候就会移除。遗漏的流程关于磁盘缓存 如下图。活动缓存里的数据是弱引用的。

2023-06-17 19:00:30 561

原创 Glide 框架源码分析

这样就保证了一个Fragment/Activity只有一个RequestManager。为什么findFragment之后还要用集合get一次Fragment?因为多次添加是个异步操作,异步操作会导致无法保证只添加一个Fragment。为了保证执行执行完成,第二是保证了Handler快速执行。但是这里有个问题,集合如果多线程情况下就无法保证安全了。那么可不可以在子线程调用with?接下来分析一下into流程。那为什么会出现这个现象?为什么要发送一个消息?为什么要监听生命周期?

2023-06-04 18:02:12 117

原创 Android事件分发的流程图

不过这里还有前面的流程,实际上是WMS接收到了信号再走到了ViewRootImpl。

2023-05-28 17:29:11 74

原创 WMS的小问题

WindowManagerService 是 Android 系统中的一个系统服务,它负责管理所有窗口的显示和操作,因此 mWindowMap 变量的访问和修改都是在 WindowManagerService 的上下文中进行的。在处理窗口创建的过程中,WMS需要与UI线程进行交互,以便实时更新窗口的显示状态。相比于新开一个线程来处理窗口创建的过程,使用Handler的runWithScissors方法可以避免线程切换的开销和资源浪费,同时也可以确保对UI线程的访问是线程安全的,避免了可能出现的并发问题。

2023-05-28 16:56:34 165

原创 AMS 家族简单分析

综上所述,使用ActivityManagerProxy来代理ActivityManagerService可以提高代码的安全性、可维护性和可扩展性,同时可以隐藏底层实现细节,控制权限并提供额外功能。使用代理可以控制权限,只有授权的应用才能访问特定方法。隐藏底层实现:ActivityManagerService是系统级服务,直接调用会暴露底层实现细节,使用代理可以隐藏底层实现,提高代码安全性和可维护性。解耦合:使用代理可以将业务逻辑与底层实现解耦,降低代码的耦合度,提高代码的可维护性和可扩展性。

2023-05-12 23:48:32 74

原创 简单解析Context

当Application::getApplicationContext的时候获取到的就是base::getApplication。LoadApk里会有Appliaction对象,但是不是在这个时候创建的 到这步为止仍然是空对象。Application attach的时候会将这个包含了Loadapk的context保存下来。上面的方法是LoadApk内的一个方法,this就是Loadapk。最终调用的是Loadapk里之前保存的Application。先分析下Application的Context创建流程。

2023-05-07 18:04:05 55

原创 startActivity流程简单分析

startActivity 如果是Launcher的话就肯定为parent为空,如果是Activity跳Activity就不为空,那么我们来分析一下Launch启动Activity的流程,接下来调用Instrumentation 的。通过ActivityTaskManager.getService对象来获取AMS代理对象 getService调用了startActivity,当获取到结果后进行check。紧接着调用了Instrumentation 的 execStartActivity 方法。

2023-04-17 22:34:05 247

原创 Retsofit 源码初步分析

但是这里有个问题,这个platform是干嘛的,实际上是为了适应多个平台的适配,当我们在开发时候使用platform多数也是为了平台化等操作。构建Retsofit 使用了构建者,那为什么使用构建者?带着问题看源码,Retsofit解决了OKhttp什么问题,为什么不使用OKhttp而使用Retsofit?先在适配器里添加一个默认的适配器,来进行转换,传递的参数是进行线程切换callbackExecutor。如果没有添加rxjava的适配器就转成线程切换的默认适配器。Retsofit是如何进行线程切换的?

2023-04-05 15:41:18 76

原创 加锁流程初步分析

仍需补充AQS内容

2023-03-09 00:06:13 64

原创 阻塞队列的阻塞原理

阻塞队列的简单分析

2023-03-07 21:28:14 559

原创 java类的设计技巧

java类的设计技巧

2023-02-19 16:26:46 192

原创 StringBuffer和StringBuilder的分析

StringBuffer和StringBuilder的分析

2023-02-19 14:34:11 64

原创 Gradle基础知识

gradle 基础

2023-02-11 18:30:06 552

原创 关于代码设计

简单的设计理解

2023-02-10 19:38:44 73

原创 动态代理源码解析

动态代理的分析初版

2023-02-08 22:20:52 240

原创 JVM学习笔记1(基础知识)

简单的JVM图(画的巨丑)所有的扩展如果不足就会产生StackOverflowError或者OutOfMemoryErrorjava虚拟机栈大部分情况下指虚拟机栈里的局部变量表,局部变量表里存放了各种基本数据类型,还有对象引用,但是并不是对象本身,有可能只是引用地址,或者句柄和指针本地方法栈虚拟机栈使用的是java方法服务,本地方法栈是为Native方法服务,有的虚拟机甚至将两者合二为一java堆。

2023-02-05 16:27:21 162 1

原创 线程池源码分析

线程池初步分析

2023-02-04 17:55:26 173

原创 RecycleView源码解析

Recycle的简单分析

2023-02-02 22:05:40 142

原创 代码小技巧笔记本

111

2023-01-16 11:15:49 64

原创 OKHTTP-拦截器专题

拦截器

2023-01-15 16:33:56 173

空空如也

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

TA关注的人

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