- 博客(101)
- 资源 (1)
- 问答 (5)
- 收藏
- 关注
原创 Trae Android编程初体验
AI编程工具测试体验:选择字节跳动旗下Trae工具进行实测后发现,当前AI编程仍存在明显局限。测试显示工具存在环境配置困难、语法错误频发、项目识别不准等问题,复杂需求如"绚丽启动页"都难以实现。虽然AI编程被过度吹捧,但实测表明其仍处于辅助阶段,与"取代程序员"的愿景相去甚远,特别是在IDE整合和复杂逻辑处理方面亟待改进。大厂产品尚且如此,AI编程要真正成熟还有很长的路要走。
2025-11-04 17:59:36
169
原创 Exception 异常源码理解
摘要:不建议在整个项目代码外层使用try-catch处理异常,主要原因包括:1)性能影响,特别是高频调用时异常处理会增加开销;2)降低代码可维护性,使业务逻辑与异常处理混杂;3)实际开发中应针对性处理异常场景(如文件、网络操作),而非滥用全局捕获。合理的异常处理策略需结合具体业务场景设计。(98字)
2025-09-16 19:51:38
128
原创 Android报错:java.lang.IllegalArgumentException: Software rendering doesn‘t support hardware bitmaps
摘要:内容处理要求仅为插入指定图片链接,格式为Markdown图片语法。图片链接为CSDN博客平台的CDN地址,图片描述文字为"在这里插入图片描述"。摘要字数控制在150字符以内,仅说明需要执行的单一图片插入操作。
2025-07-04 14:49:57
235
原创 软件工程之软件产品的环境
软件开发过程中,通常需要设置三个关键环境以确保产品质量和稳定性。首先是开发环境,供开发者编写和测试代码,环境设置灵活,但不完全模拟生产环境。其次是预发布环境,它尽可能模拟生产环境,用于最终阶段的测试和验证,确保软件在部署前的各项指标满足要求。最后是生产环境,这是软件对最终用户提供服务的实际运行环境,强调稳定性、性能和安全性。测试人员需在这三个环境中依次验证,确保产品稳定可靠。
2025-05-15 21:05:56
388
原创 Android SystemUI的初步了解
main 方法里启动了 run() 方法,而在 run 方法中调用了 startBootstrapServices() 方法和 startOtherServices() 方法,在 startOtherServices() 里 mActivityManagerService.systemReady 创建线程去执行startSystemUi(context),这里将启动 SystemUI。Android 9.0作为研究对象的话,近期列表就还是在SystemUI中,那是在系统启动的什么时候启动的呢?
2025-04-22 13:51:59
501
原创 android studio sdk unavailable和Android 安装时报错:SDK emulator directory is missing
里面的工具的原理也是本文中的思路脚本执行。这一套走下去,确实很实用的解决方案,解决的也很巧妙,对于其他的问题也有参考的价值。figima 这个设计师用的设计工具用的是外网,给程序员看设计图,程序员都得翻墙,那我们用这种方式不翻墙也是可以解决的,1、在多个地点Ping服务器,网站测速 - 站长工具 输入dl.google.com,进行ping检测。核心就是在本地配置host,host是域名和ip的映射,将域名映射到离自己近的网速好的ip。在最后添加下述三行,保存。3、修改hosts文件。
2025-04-21 20:31:12
1757
6
原创 Android 关于compose的一些坑和理解
通过依赖注入,你的示例中的 ViewModel、Repository 和 ApiService 完全解耦,各组件职责清晰,为应用扩展(如添加数据库、Mock 测试)打下坚实基础。在 Compose 中修改数据并写回数据层,需要遵循 单向数据流 原则:UI 层只负责触发事件,由 ViewModel 协调业务逻辑并更新数据层。我们通过一个简单的 计数器应用 来演示如何用 ViewModel + StateFlow 实现逻辑与 UI 的分离,让 Composable 只负责渲染。
2025-03-20 17:10:47
1446
原创 关于Git的命令使用总结和思考理解
当你分到一个任务要做一个功能或者修改优化,可以统称为来了一个任务,都是需要改动代码的,你要拉一个自己的分支在这个分支上改动,因为要防止突然有新的任务到来,而你在做的任务还未完工,还有如果你自己改动代码造成的问题,你可以在自己的分支上肆意遨游,大胆实验,你可以随时暂停,放弃这个分支,你从公开的分支拉出的这条线上不受影响,你可以随时回到这个起点。提到这些伟大的程序员,我想搞个程序员全球排行榜,让世界上所有人来投票,标准根据程序员的贡献,能力,作品评定,这个idea可以先码上,哈哈,也挺有意义和意思。
2025-03-20 13:42:37
801
原创 Android adb常用命令总结
1.通过命令查看应用权限:adb shell dumpsys package “xxx.xxx.xxx” //如adb shell dumpsys package com.tencent.androidqqmail查看已连接设备2.adb devices此命令列出当前连接的所有设备。3.安装应用adb install <path_to_apk>此命令将指定路径的APK文件安装到设备上。4.卸载应用adb uninstall <package_name>此命令卸载指定包名的应用。5.传输文件a
2025-02-27 14:31:26
509
原创 Android 源码入门
Android 14中的hardware目录是Android系统架构中的一个重要组成部分,它包含了与硬件相关的库和驱动程序,允许Android系统与设备的硬件进行高效通信。然而,需要注意的是,Android源码中的packages目录结构可能会随着版本的更新而有所变化,但基本的概念和布局在多个版本中保持相对一致。,下面是我在看AlertDialog的源码的时候,想说AlertDialog对应在framework目录下的,它里面用到的layout xml 在下面的目录下,记录一下。
2025-02-26 09:25:06
1054
原创 网络基础知识总结
网络的7层结构是指OSI模型,即开放式系统互联模型,由国际标准化组织(ISO)定义,用于描述计算机网络中各个不同层次之间的通信和功能。TCP的全称是传输控制协议(Transmission Control Protocol),UDP的全称是用户数据报协议(User Datagram Protocol)。OSI模型的作用在于通过分层结构实现标准化、模块化和互操作性,使得网络通信的设计、开发和管理更加高效。每一层都负责不同的任务,下层只和上层有来往关系,不可跨层传输。TCP和UDP的基本概念和区别。
2024-12-28 21:14:38
536
原创 Plugin [id: ‘com.android.application‘, version: ‘8.2.0‘, apply: false] was not found
代理关了就好了,需要说的是即使 File->settings->Appearance&Beavior->System Settings->HTTP Proxy的时候,明明已经修改成了No proxy,这个是全局设置的。
2024-11-19 20:58:04
1371
翻译 Android:再见 Groovy!将我们的 build.gradle 迁移到 Kotlin
最近,Google 的文档通知,Kotlin Script (KTS) 现在将成为依赖同步的默认语言,并且从 Android Studio 的下一版本开始,此过程将成为新应用程序中的默认过程,因此这个小教程可以帮助您迁移从 Groovy 到 KTS 的一个小项目。在这种情况下,我们将更改应用程序模块之一,在这种情况下,如果您有更多模块,则必须对其余模块执行几乎相同的操作。这样,您就可以更新您的项目,使其包含 KTS,并能够享受它的好处,并保持您的应用程序更新。3.更改我们模块的build.gradle。
2024-11-14 21:42:15
342
原创 程序代码设计模式之模板方法模式(1)
今天我们将开始整理程序代码的设计模式,之前一直没有整理是因为网上讲的一大堆了,都烂大街了,现在又打算开始整理是因为设计模式要融入自己的程序代码里,不断的加深理解,去实践而不是只读读博文。在这个例子中,draw方法定义了视图绘制的基本步骤,而onDraw方法则留给子类去实现具体的绘制逻辑。这样做的好处是,draw方法为子类提供了一个清晰的绘制接口,同时保留了灵活性,允许子类根据需要自定义绘制过程。其主要特点是将一些步骤延迟到子类中,这些子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2024-11-12 21:35:51
484
原创 Android和webView交互详解
通过WebChromeClient的onJsAlert()、onJsConfirm()、onJsPrompt() 方法回调拦截JS对话框alert()、confirm()、prompt() 消息。(1)Android通过WebViewClient的回调方法==shouldOverrideUrlLoading()==拦截url。(1)因为该方法的执行不会使页面刷新,而第一种方法(loadUrl )的执行则会。// 由于对象映射,所以调用Android对象等于调用Android映射的对象。
2024-09-26 19:11:17
1587
原创 Android Framework之Pkms详解
system 用户并没有访问应用程序目录的权限,但是 Installd 服务是以 root 用户启动的,可以访问 /data/data/ 下的目录,Installd 需要完成一些创建应用数据的任务。Installer 服务是 Android 提供的用于安装的服务,Installer 持有 Installd 守护进程对应的 Binder 服务的代理对象,本质上是通过 Binder 通信调用底层的 Installd 服务真正完成 APK 文件格式的优化和转换、建立相关的数据目录、删除文件、安装应用等工作。
2024-08-12 21:37:05
1604
原创 Android Framework 之WMS详解
WindowState:和客户端窗口一一对应,在向WMS添加一个窗口时,WMS会为其创建一个WindowState,来表示窗口的所有属性,WindowState相当于属性窗口管理(比如对外提供操作接口,属于层级结构中最底部的容器),窗口画面相关都剥离给了WindowStateAnimator,WindowState也是WMS中事实上的窗口。这是因为在Android系统中,可能会存在一些特殊情况,例如PopupWindow、Dialog等,它们属于同一个WindowToken,但是显示在不同的窗口上。
2024-08-03 16:52:47
1884
原创 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
653
原创 Android 内存原理详解以及优化(二)
这个其实和单例的原理是一样的,由于静态对象 test 的生命周期和整个应用的生命周期一致,而非静态内部类 Test 持有外部类 MainActivity 的引用,导致 MainActivity 退出的时候不能被回收,从而造成内存泄漏,解决的方法也很简单,把 test 改成非静态,这样 test 的生命周期和 MainActivity 是一样的了,就避免了内存泄漏。3.1 对于大图片加载的时候,会内存溢出。知道了内存泄漏的根本原因,再分析为什么会出现内存泄漏就很简单了,下面就针对一些常见的内存泄漏进行分析。
2024-07-02 16:11:46
914
原创 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
1456
原创 Okhttp框架总结(1)
那么connection在timeout时间类是如果失效的呢,并且如果做到有效的对连接进行清除操作以确保性能和内存空间的充足。遍历connections缓存列表,当某个连接计数的次数小于限制的大小以及request的地址和缓存列表中此连接的地址完全匹配。在timeout空闲时间内,连接不会关闭,相同重复的request将复用原先的connection,减少握手的次数,大幅提高效率。在看ConnectionPool的成员变量的时候我们了解到一个Executor的线程池是用来清理闲置的连接的。
2024-06-05 21:53:40
813
原创 你熟悉又陌生的Android Context 下上文详解
那么我请问,如果定义x和y作为变量传入构造方法呢,是不是上面的问题也能解决,而且性能和结构上都有一流的表现,你告诉我我为什么要用装饰者模式呢?其实装饰者模式的思想并不直,有点抽象和绕的,重点是 最开始是一个接口也就是抽象构件,然后是这个抽象装饰者是一个抽象类实现了这个抽象构件的接口,同时里面有一个这个抽象构件 接口的属性,来承接传入的要装饰的对象,然后具体的装饰者就这样通过一层一层的传入来动态的构建,不影响原来的要装饰的对象,同时构造出在原来的对象基础之上,装饰了新功能的对象。4个组件扩展不同的功能。
2024-06-02 13:28:41
390
原创 Gradle命令打包 Execution failed for task ‘:app:compileDebugJavaWithJavac错误
Gradle命令打包的时候遇到的,Gradle的java版本不对导致的,用的17,换成11的就能正常打包了。
2024-06-01 19:37:19
480
原创 HarmonyOS 应用开发——入门
上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。@Link 子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定(只要是父组件引用了带有@link属性的)@State 状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。不想花时间看,可以看我下面总结的干货,哈哈。
2024-04-27 20:32:34
1639
原创 okhttp post请求 header post参数加密遇到的两个问题
Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a
2023-10-31 18:21:07
1565
2
原创 网络安全https
答:分两种,一种是单向认证,像访问普通网站比如百度(https),百度网站上安装有网站证书(私钥),用户端的计算机预装有根证书(公钥),也就是签发那个百度网站证书的上级CA的证书,用来验证网站证书,这是单向认证。另一种是双向认证,客户端要验证服务器的证书,反过来服务器也要验证客户端的证书,像访问网上银行比如工行企业网银(https),网站上有证书,用户端的计算机预装有(签发网站证书的CA的)证书,此外,用户持有的U盾帮助提供用户端证书,这是双向认证。这时候中间人介入后,他只能自己造一个证书。
2023-10-24 12:39:36
1169
原创 Kotlin 知识点小结
supervisorScope 表示主从作用域,会继承父协程的上下文,它的特点就是子协程的异常不会影响父协程,内部的 子协程挂掉 不会影响外部的父协程和兄弟协程的继续运行,它就像一道防火墙,隔离了异常,保证程序健壮,但是如果外部协程挂掉还是可以取消子协程的,即 单向传播。coroutineScope 表示 协同作用域, 内部的协程 出现异常 会向外部传播,子协程未捕获的异常会向上传递给父协程, 子协程 可以挂掉外部协程 , 外部协程挂掉也会挂掉子协程,即 双向传播。
2023-10-20 12:11:49
440
原创 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
7802
2
原创 Android最好用的日志打印库(自动追踪日志代码位置)
给大家推荐一个自己写的日志打印的库,我愿称之为最强日志打印库:BytUtilLog Byt是Big一统的缩写,大一统日志打印库,哈哈!关于它的功能:它可以控制整个日志是否输出,打印的日志可以直接跳转到代码的位置,方便查看调试,同时解决输入内容一样的时候不知道是哪一处的日志的问题,自动追踪日志代码位置。也看过前辈们写的日志打印库,我对自己的库在多线程的情景下的表现,还是有担心的,如果有遇到问题,可以github或者csdn 本篇上留言都可以,看到会及时回复处理的。
2023-09-25 22:26:56
537
原创 LeakCanary 源码详解(3)
我没法理解这样的解释,我个人理解是这个算法用的是广度优先算法(因为与深度优先算法比,广度优先的长处是速度快,缺点是占用空间),从下面一层一层的查,找到最近最短的路径,这个肯定是泄漏的,是要我们处理的。如果你是直接刷到这篇的,建议还是从1开始看,然后2,然后是这篇3,如果你只关注这篇的重点hprof 文件定位泄漏位置的感兴趣,可以试试直接读这篇,如果中间没发觉有难理解的就算了,要是发觉无法理解了就建议从1 2篇读起,经典的库的代码没那么简单,不要害怕花时间。
2023-09-24 22:34:25
269
原创 Android 图片加载框架Glide源码详解
值得看的是currentGenerate是下图中3个的哪一个呢,从逻辑上看3个会依次遍历,分别是先处理过的resource缓存,然后是data缓存,最后是Source网络加载, 这也是glide的三级缓存。下面就要开始讲根据model,data找modelloader的逻辑了,做好心理准备,不简单,网上大都是一笔带过(因为他们也弄不清,的确有点复杂,绕来绕去),好不容易全网找到一篇,不知道是他的版本旧的,还是他理解的不对,珍惜吧,我认为是全篇最难的地方了。给你们看一下添加的listener。
2023-09-17 20:03:31
658
原创 Android 线程池源码详解(一)
newCachedThreadPool(可缓存线程池):这是一个可缓存的线程池,它可以根据需要创建新的线程,当线程闲置时间超过一定时间后,这些线程会被回收。这种线程池适合处理突发的、短时间的任务,因为它可以快速扩展和收缩,但可能不适合需要长时间运行的任务,因为它可能会频繁地创建和销毁线程。因为一个cpu核心同一时间只能被一个线程持有,+1是为了防止任务中断,比如偶发的线程缺页中断,等其他原因导致的任务暂停,那么cpu就出现空闲时间,多一个来充分利用这个时间)直接使用CAS获取,避免阻塞。
2023-09-06 21:37:51
290
原创 java锁杂谈
如在操作的数据上加上版本version属性,每次操作版本递增,在取得数据的同时获取版本属性,在操作完数据后保存前,将之前的版本号与当前的版本号进行对比,如果一致则进行更新操作,否则代表数据以被修改,重试更新操作。重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。但是需要注意的是,在使用读写锁时,需要考虑锁的粒度和性能问题,避免因为锁的过多或者过少导致程序的性能下降或者数据不一致。
2023-09-05 17:36:54
244
原创 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
249
原创 Android类加载机制
通常我们在手机看到,app即使热修复了,最后还是要全量更新版本,因为一个是安装包热修复后变大,还有热修复之后的应用性能,稳定兼容性上还是不如整体包安装的应用。下面这个图还是比较好表达了类加载流程,但如果不看我红色画的线,就会感觉有点乱,需要注意是采用的是双亲委派模式,class加载要先一层层询问是否加载过没有就传到它的上层加载,加载不到的开始往下传,是否可以加载,最后都没能加载的not found。要说Android的类加载机制 ,就离不开 类加载器ClassLoader,它是一个抽象接口。
2023-08-22 17:57:15
865
原创 EventBus3.0源码详解
详解之前要说明一下,LivedataBus 比EventBus更适合目前jetpack化的app,因为考虑到组件的生命周期处理,性能方面,EventBus还是要反射invoke的调用的,网上找不到有实测过的博文,我想来个性能对比实测,然后写一篇博文分享给大家,想看的可以评论留言,我看看有多少人支持。好了步入正题,整个框架运用了多个设计模式:首先从Eventbus的使用入手Eventbus.getDefault()方法,使用了带volatile的双重检验的单例模式,是线程安全的。
2023-08-20 18:07:05
141
原创 LiveDataBus 其中的一个库LiveEventBus库的源码解析
那我们接着说,那整个的精华就是这个bus 的map了,key是string的 ,value是LiveEvent 的,看下图一个LiveEvent是有一个livedata来负责观察的,也就是多个消息的时候就是多个livedata,然后是bus这个map在管理。注意,我们发送消息和接收消息都是调用了get方法,也就是下面的with方法,看看,这里可是get set方法集成到一起的,就很怪,作者这里弄的,讲道理,不符合单一职责。
2023-08-16 17:40:34
319
原创 Jetpack之MutableLiveData和LiveData源码分析
接着我们着重看一下liveData的源码,先看setValue方法吧,assertMainThread是判断当前是不是主线程,如果不是就抛出异常:这就是为什么postvalue可以在任何线程调用,setPost只能在主线程调用的原因,也是这两个方法的区别。上图我们知道这两个方法都是调用了livedata的各自对应的方法,我们点进去看看livedata的这两个方法是protect 的。允许子类和自己调用,而MutableLiveData重写的时候用的是public,开放出去了。下图是它的item哦。
2023-08-15 16:21:29
359
原创 Java反射机制,动态代理,hook以及在Retrofit源码中的应用
Java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。然后我们回过头来看反射机制是 基础,动态代理里面也是用反射来实现的,动态代理对类里面的所有方法统一动态加入操作代码,java使用更多是对接口的,是生成了你想往里面塞的代码,hook把hook对象勾出来,换成自己想塞进去的,是一种手法。1.1.3使用对象.getClass() 方法,返回对象所属的类的 Class 对象。
2023-08-11 11:00:21
1014
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关注的人
RSS订阅