- 博客(86)
- 资源 (1)
- 问答 (5)
- 收藏
- 关注
原创 Android Framework之Pkms详解
system 用户并没有访问应用程序目录的权限,但是 Installd 服务是以 root 用户启动的,可以访问 /data/data/ 下的目录,Installd 需要完成一些创建应用数据的任务。Installer 服务是 Android 提供的用于安装的服务,Installer 持有 Installd 守护进程对应的 Binder 服务的代理对象,本质上是通过 Binder 通信调用底层的 Installd 服务真正完成 APK 文件格式的优化和转换、建立相关的数据目录、删除文件、安装应用等工作。
2024-08-12 21:37:05
921
原创 Android Framework 之WMS详解
WindowState:和客户端窗口一一对应,在向WMS添加一个窗口时,WMS会为其创建一个WindowState,来表示窗口的所有属性,WindowState相当于属性窗口管理(比如对外提供操作接口,属于层级结构中最底部的容器),窗口画面相关都剥离给了WindowStateAnimator,WindowState也是WMS中事实上的窗口。这是因为在Android系统中,可能会存在一些特殊情况,例如PopupWindow、Dialog等,它们属于同一个WindowToken,但是显示在不同的窗口上。
2024-08-03 16:52:47
849
原创 Android Framework 之AMS详解
Android 10将原先AMS中对activity的管理和调度移到了ActivityTaskManagerService中,位置放到了wm下(见上面完整路径),因此AMS负责四大组件中另外3个(service, broadcast, contentprovider)的管理和调度。源码位置/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java。ProcessRecord.java:记录每个进程的信息。
2024-07-29 22:14:09
324
原创 Android 内存原理详解以及优化(二)
这个其实和单例的原理是一样的,由于静态对象 test 的生命周期和整个应用的生命周期一致,而非静态内部类 Test 持有外部类 MainActivity 的引用,导致 MainActivity 退出的时候不能被回收,从而造成内存泄漏,解决的方法也很简单,把 test 改成非静态,这样 test 的生命周期和 MainActivity 是一样的了,就避免了内存泄漏。3.1 对于大图片加载的时候,会内存溢出。知道了内存泄漏的根本原因,再分析为什么会出现内存泄漏就很简单了,下面就针对一些常见的内存泄漏进行分析。
2024-07-02 16:11:46
746
原创 Android 内存原理详解以及优化(一)
Minor GC 执行后,Eden 区被清空了,存活的对象放到了 Survivor 区,而之前 Survivor 区中的对象,可能也有一些是需要被清除的。IBM 公司的专业研究表明,有将近98%的对象是朝生夕死,所以针对这一现状,大多数情况下,对象会在新生代 Eden 区中进行分配,当 Eden 区没有足够空间进行分配时,虚拟机会发起一次 Minor GC,Minor GC 相比 Major GC 更频繁,回收速度也更快。上图中等方块的假设是 2M,小一些的是 1M,大一些的是 4M。
2024-06-23 22:45:04
651
原创 Okhttp框架总结(1)
那么connection在timeout时间类是如果失效的呢,并且如果做到有效的对连接进行清除操作以确保性能和内存空间的充足。遍历connections缓存列表,当某个连接计数的次数小于限制的大小以及request的地址和缓存列表中此连接的地址完全匹配。在timeout空闲时间内,连接不会关闭,相同重复的request将复用原先的connection,减少握手的次数,大幅提高效率。在看ConnectionPool的成员变量的时候我们了解到一个Executor的线程池是用来清理闲置的连接的。
2024-06-05 21:53:40
698
原创 你熟悉又陌生的Android Context 下上文详解
那么我请问,如果定义x和y作为变量传入构造方法呢,是不是上面的问题也能解决,而且性能和结构上都有一流的表现,你告诉我我为什么要用装饰者模式呢?其实装饰者模式的思想并不直,有点抽象和绕的,重点是 最开始是一个接口也就是抽象构件,然后是这个抽象装饰者是一个抽象类实现了这个抽象构件的接口,同时里面有一个这个抽象构件 接口的属性,来承接传入的要装饰的对象,然后具体的装饰者就这样通过一层一层的传入来动态的构建,不影响原来的要装饰的对象,同时构造出在原来的对象基础之上,装饰了新功能的对象。4个组件扩展不同的功能。
2024-06-02 13:28:41
276
原创 Gradle命令打包 Execution failed for task ‘:app:compileDebugJavaWithJavac错误
Gradle命令打包的时候遇到的,Gradle的java版本不对导致的,用的17,换成11的就能正常打包了。
2024-06-01 19:37:19
240
原创 HarmonyOS 应用开发——入门
上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。@Link 子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定(只要是父组件引用了带有@link属性的)@State 状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。不想花时间看,可以看我下面总结的干货,哈哈。
2024-04-27 20:32:34
1347
原创 okhttp post请求 header post参数加密遇到的两个问题
Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a
2023-10-31 18:21:07
1178
1
原创 网络安全https
答:分两种,一种是单向认证,像访问普通网站比如百度(https),百度网站上安装有网站证书(私钥),用户端的计算机预装有根证书(公钥),也就是签发那个百度网站证书的上级CA的证书,用来验证网站证书,这是单向认证。另一种是双向认证,客户端要验证服务器的证书,反过来服务器也要验证客户端的证书,像访问网上银行比如工行企业网银(https),网站上有证书,用户端的计算机预装有(签发网站证书的CA的)证书,此外,用户持有的U盾帮助提供用户端证书,这是双向认证。这时候中间人介入后,他只能自己造一个证书。
2023-10-24 12:39:36
1065
原创 Kotlin 知识点小结
supervisorScope 表示主从作用域,会继承父协程的上下文,它的特点就是子协程的异常不会影响父协程,内部的 子协程挂掉 不会影响外部的父协程和兄弟协程的继续运行,它就像一道防火墙,隔离了异常,保证程序健壮,但是如果外部协程挂掉还是可以取消子协程的,即 单向传播。coroutineScope 表示 协同作用域, 内部的协程 出现异常 会向外部传播,子协程未捕获的异常会向上传递给父协程, 子协程 可以挂掉外部协程 , 外部协程挂掉也会挂掉子协程,即 双向传播。
2023-10-20 12:11:49
187
原创 java.lang.IllegalAccessError: class org.jetbrains.kotlin.kapt3.base.KaptContext cannot access class
Task :app:kaptGenerateStubsDebugKotlin FAILEDe: java.lang.IllegalAccessError: class org.jetbrains.kotlin.kapt3.base.KaptContext (in unnamed module @0x4d1ecff7) cannot access class com.sun.tools.javac.util.Context (in module jdk.compiler) because module jd
2023-09-27 18:40:51
4311
2
原创 Android最好用的日志打印库(自动追踪日志代码位置)
给大家推荐一个自己写的日志打印的库,我愿称之为最强日志打印库:BytUtilLog Byt是Big一统的缩写,大一统日志打印库,哈哈!关于它的功能:它可以控制整个日志是否输出,打印的日志可以直接跳转到代码的位置,方便查看调试,同时解决输入内容一样的时候不知道是哪一处的日志的问题,自动追踪日志代码位置。也看过前辈们写的日志打印库,我对自己的库在多线程的情景下的表现,还是有担心的,如果有遇到问题,可以github或者csdn 本篇上留言都可以,看到会及时回复处理的。
2023-09-25 22:26:56
352
原创 LeakCanary 源码详解(3)
我没法理解这样的解释,我个人理解是这个算法用的是广度优先算法(因为与深度优先算法比,广度优先的长处是速度快,缺点是占用空间),从下面一层一层的查,找到最近最短的路径,这个肯定是泄漏的,是要我们处理的。如果你是直接刷到这篇的,建议还是从1开始看,然后2,然后是这篇3,如果你只关注这篇的重点hprof 文件定位泄漏位置的感兴趣,可以试试直接读这篇,如果中间没发觉有难理解的就算了,要是发觉无法理解了就建议从1 2篇读起,经典的库的代码没那么简单,不要害怕花时间。
2023-09-24 22:34:25
167
原创 Android 图片加载框架Glide源码详解
值得看的是currentGenerate是下图中3个的哪一个呢,从逻辑上看3个会依次遍历,分别是先处理过的resource缓存,然后是data缓存,最后是Source网络加载, 这也是glide的三级缓存。下面就要开始讲根据model,data找modelloader的逻辑了,做好心理准备,不简单,网上大都是一笔带过(因为他们也弄不清,的确有点复杂,绕来绕去),好不容易全网找到一篇,不知道是他的版本旧的,还是他理解的不对,珍惜吧,我认为是全篇最难的地方了。给你们看一下添加的listener。
2023-09-17 20:03:31
484
原创 Android 线程池源码详解(一)
newCachedThreadPool(可缓存线程池):这是一个可缓存的线程池,它可以根据需要创建新的线程,当线程闲置时间超过一定时间后,这些线程会被回收。这种线程池适合处理突发的、短时间的任务,因为它可以快速扩展和收缩,但可能不适合需要长时间运行的任务,因为它可能会频繁地创建和销毁线程。因为一个cpu核心同一时间只能被一个线程持有,+1是为了防止任务中断,比如偶发的线程缺页中断,等其他原因导致的任务暂停,那么cpu就出现空闲时间,多一个来充分利用这个时间)直接使用CAS获取,避免阻塞。
2023-09-06 21:37:51
165
原创 java锁杂谈
如在操作的数据上加上版本version属性,每次操作版本递增,在取得数据的同时获取版本属性,在操作完数据后保存前,将之前的版本号与当前的版本号进行对比,如果一致则进行更新操作,否则代表数据以被修改,重试更新操作。重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。但是需要注意的是,在使用读写锁时,需要考虑锁的粒度和性能问题,避免因为锁的过多或者过少导致程序的性能下降或者数据不一致。
2023-09-05 17:36:54
136
原创 Hashmap源码详解
接着putVal函数的逻辑走,注释里面写了逻辑,table就是前面所说的Hashmap里面的数组,item就是链表的节点Node,还有一个数组下标用 index = (n - 1) & hash 来计算的原因,因为n是table的长度,是2^N,所以 这里的(n-1)就是11111,这样的,那么(n-1)&hash就是取hash的后N位,这样的下标index一定小于2^N ,不会下标数组越界。链表:一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
2023-08-27 12:29:14
126
原创 Android类加载机制
通常我们在手机看到,app即使热修复了,最后还是要全量更新版本,因为一个是安装包热修复后变大,还有热修复之后的应用性能,稳定兼容性上还是不如整体包安装的应用。下面这个图还是比较好表达了类加载流程,但如果不看我红色画的线,就会感觉有点乱,需要注意是采用的是双亲委派模式,class加载要先一层层询问是否加载过没有就传到它的上层加载,加载不到的开始往下传,是否可以加载,最后都没能加载的not found。要说Android的类加载机制 ,就离不开 类加载器ClassLoader,它是一个抽象接口。
2023-08-22 17:57:15
780
原创 EventBus3.0源码详解
详解之前要说明一下,LivedataBus 比EventBus更适合目前jetpack化的app,因为考虑到组件的生命周期处理,性能方面,EventBus还是要反射invoke的调用的,网上找不到有实测过的博文,我想来个性能对比实测,然后写一篇博文分享给大家,想看的可以评论留言,我看看有多少人支持。好了步入正题,整个框架运用了多个设计模式:首先从Eventbus的使用入手Eventbus.getDefault()方法,使用了带volatile的双重检验的单例模式,是线程安全的。
2023-08-20 18:07:05
98
原创 LiveDataBus 其中的一个库LiveEventBus库的源码解析
那我们接着说,那整个的精华就是这个bus 的map了,key是string的 ,value是LiveEvent 的,看下图一个LiveEvent是有一个livedata来负责观察的,也就是多个消息的时候就是多个livedata,然后是bus这个map在管理。注意,我们发送消息和接收消息都是调用了get方法,也就是下面的with方法,看看,这里可是get set方法集成到一起的,就很怪,作者这里弄的,讲道理,不符合单一职责。
2023-08-16 17:40:34
197
原创 Jetpack之MutableLiveData和LiveData源码分析
接着我们着重看一下liveData的源码,先看setValue方法吧,assertMainThread是判断当前是不是主线程,如果不是就抛出异常:这就是为什么postvalue可以在任何线程调用,setPost只能在主线程调用的原因,也是这两个方法的区别。上图我们知道这两个方法都是调用了livedata的各自对应的方法,我们点进去看看livedata的这两个方法是protect 的。允许子类和自己调用,而MutableLiveData重写的时候用的是public,开放出去了。下图是它的item哦。
2023-08-15 16:21:29
239
原创 Java反射机制,动态代理,hook以及在Retrofit源码中的应用
Java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。然后我们回过头来看反射机制是 基础,动态代理里面也是用反射来实现的,动态代理对类里面的所有方法统一动态加入操作代码,java使用更多是对接口的,是生成了你想往里面塞的代码,hook把hook对象勾出来,换成自己想塞进去的,是一种手法。1.1.3使用对象.getClass() 方法,返回对象所属的类的 Class 对象。
2023-08-11 11:00:21
724
原创 Handler源码详解
Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce() 方法里,这也是为什么Looper是一个死循环但没有崩溃的原因。整个看下来就是一个生产者消费者模式,还有一个细节 post(Runable)的message是 Message.obtain()获取的,这个message可以复用,所以在使用的时候尽量也用这种方式,节约资源,算是个小技巧吧。message入队列。
2023-08-02 17:19:07
186
原创 Activiity跳转startActivity源码分析Activity启动流程(下)
这样Zygote进程就会fork出一个应用进程,然后执行应用进程的入口函数也就是我们熟悉的ActivityThread.main()函数。然后是第二种情况,新启动一个App应用的Activity:调用了AMS的.startProcessLocked方法。接着会执行translacationExecutor的execute方法。然后就是application的创建和oncreate方法的调用。然后调用了 Process.start方法,开启一个进程。调用了自己的startProcess方法。
2023-08-02 11:38:38
185
原创 Activiity跳转startActivity源码分析Activity启动流程(上)
分为两种情况,一种是app已经启动,只是app内部activity跳转走 realStartActivityLocked方法,否则就拉起一个新的app,像从桌面点击一个app,就属于这种情况走的就是AMS的 startProcessLocked。6.IActivityManager 是AMS 的IBinder 实现是在AMS中,最后走的是ActivityStartControl的链式调用。3.实际还是startActivityForResult 带option的方法,只不过null传过去的。
2023-08-01 22:43:05
418
原创 Android系统启动流程
Binder方式虽然高效,但是Binder的使用看起来就像是客户端直接通过所持有的引用对象调用了服务端的方法,类似于一种强引用调用。Zygote进程负责孵化出各个子进程,其地位非常重要,出于安全性的考虑,该场景下的Zygote进程的交互采用Socket会更合适。被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。注意,Zygote进程与其它进程的交互方式是Socket方式,不是Binder方式,这是出于安全性上的考虑。
2023-07-28 20:26:12
213
原创 Java三大特性,设计的六大原则的理解
抽象不应该依赖细节;封装的目的是隐藏类的内部实现细节,将类的内部状态和行为进行封装,使得外部代码无法直接访问和修改类的内部数据,只能通过类提供的公有接口(也称为类的方法)进行间接访问和操作。1.封装 指的是将类的成员变量(属性)和成员方法(方法)隐藏起来,通过使用访问修饰符(如private、public、protected等)来限制外部对类的直接访问,从而保护类的内部状态和行为。3.多态 指的是父类可以引用接受不同子类的对象实例,父类调用相同的方法,由于子类对方法的实现不同,产生不同的行为。
2023-07-26 20:29:49
253
原创 Ndk c++层 crash问题分析
拿到这个文件了,可以看到上面记录的是crash .so 的地址,有两种方式处理,但也要分情况选择,如果你有设备来测试,并且知道如何去复现这个crash 那你可以用ndk-stack来直接将crash翻译成指向代码的容易理解的log,现在是指向地址的tomstone,其实这种也就不需要tomstone了,前提是你要判断出来,crash时因为c++ native层的,我就不具体解释ndk-stack怎么使用了,如果后面观众老爷留言有需要我再补吧,也是ndk带的一个工具。
2023-06-25 13:47:59
584
原创 W Failure to open libjavacore.so, try next. 华为真机崩溃问题。
原因是项目中使用了腾讯的性能监测工具Matrix Matrix 的原理是会去hook .so的库。当我把matrix的初始化去掉之后华为真机就不会崩溃了,其他的设备则不会。
2023-05-17 16:41:19
484
原创 Android源码编译FAILED: out/target/product/generic/dex_bootjars/system/framework/arm/boot.art
下面是成功的喜悦,哈哈,两年前就把源码下载好了,现在才编译通过,一定要坚持啊。WITH_DEXPREOPT=false是解决上面问题的。使用的是ubuntu 22的,android版本是9。
2023-04-21 17:42:12
1573
原创 Android webview Anr com.android.webview.chromium.WebViewChromium.onDraw(WebViewChromium.java:169
这个是日志 :1-30 10:27:38 01-30 10:27:38.601 30384 30405 W System.err: com.github.anrwatchdog.ANRError: Application Not Responding for at least 5000 ms.2023-01-30 10:27:38 01-30 10:27:38.601 30384 30405 W System.err: Caused by: com.github.anrwatchdog.ANRErr
2023-01-30 14:43:59
803
原创 Android Anr traces.txt 最全最完整说明文档
欢迎各位评论补充和指正,还有很多项还没确定含义。----- pid 461 at 2022-11-03 07:12:55 -----// pid 进程id 进程461在 2022-11-03 07:12:55的时候Cmd line: system_server//出问题的程序名称 是system_serverBuild fingerprint: ‘Android/rk3399_all/rk3399_all:7.1.2/NHG47K/server03271642:userdebug/test-keys
2022-11-11 15:44:10
909
原创 com/android/tools/idea/gradle/run/OutputBuildAction has been compiled by a more recent version of th
网上有说gradle java 版本是11 你用的是java 8 55说的是java 11 52说的是java8 让你去设置setting。我的解决方案,排除了上面两个,大概率出问题的是gradle。gradle java 版本设置的,我试过不行。还有说是Android studio 版本不对的,需要更换gradle版本,最好往新版本更新。图上是更新过后的版本,测试就没有这个问题了。
2022-11-11 15:33:59
18231
2
原创 Android 面试java知识小结
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 [1]。-1 转换成二进制是 1000 0001 反码是符号位不变,其他取反 1111 1110 补码是 反码加1 那就是 1111 1111了,需要提醒的是正数的原码,反码,补码,一样。在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。在Java中,byte类型的数据是8位带符号的二进制数。
2022-10-10 15:24:33
690
原创 Android ObjectBox 数据库避坑Duplicate files copied in APK lib/armeabi-v7a/libobjectbox.so
传说比所有的数据库都快点Objectbox ,坑还是有的,搞了一天,官网给的文档真的坑 ,Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfig。你要是按官网的集成,你就入坑了,我是花一天才出来,官网那样还是这个插件在前面了,这样就还会库重复。gradle编译不通过。如图这样才对,网上很多文章也是这样说的,但都少说了 第一个划线的部分。但没提到第一个划线的部分,导致很多小伙伴也进坑了。
2022-08-25 11:43:42
862
2
原创 Android动画详解
为什么要引入属性动画,上面说说的动画,是针对view,这就留下了场景的局限性,很多场景我们都是要针对数值,或者是一个对象,不局限于view。我们先看看使用 ,另外多一句,属性动画是可以代替上面我们所说的传统动画。有4种补间动画:放大缩小scale ,旋转 rotate ,平移 translate,透明度动画alpha。Android动画大方向上分为:View 视图动画(里面又分为补间动画和帧动画)和属性动画。ValueAnimator 的使用,也是可以设置listen监听,从值的变化来驱动动画。...
2022-08-17 11:51:19
319
原创 Android View 加载源码详解
表述一下:一个触摸事件触发,先来到Actvity的DispatchTouchEvent 方法,Activity接着去询问ViewGroup的dispatchTouchEnvent方法,你告诉我,ViewGroup调用onInterceptouchEvent问自己要不要拦截处理,我不拦截,好,那我问我的子view,调用view的dispachTouchEvent方法,view调用onTouchEvent()方法,到底了,开始往上反。还有个问题就是大家都不干的时候,为什么Activity 会来两边。......
2022-08-16 13:33:04
1465
Android ViewPager 平滑过渡实现手动循环和自动循环
2016-02-04
kotlin 关键字 operator 和overide的区别
2022-06-29
Android协程io里面为什么可以做view的操作
2022-04-27
musescore c++源码,请解释一下这段代码的意思,小弟刚开始搞这方面!
2018-04-09
编译musescore源码cmake错误。
2017-08-20
android studio cmake ndk jni 开发
2016-12-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人