- 博客(2064)
- 资源 (15)
- 收藏
- 关注

原创 我写的《高性能Android开发技术》一书已正式出版全国发行
我写的《高性能Android开发技术》一书,已由北京航空航天大学出版社正式出版并全国发行,京东上的发售页面链接地址:https://item.jd.com/12602702.html感谢北京航空航天大学出版社,感谢北京航空航天大学出版社的董宜斌先生、张冀青老师,感谢CSDN,感谢给予我帮助和支持的人!谢谢你们!我的邮箱:[email protected]...
2019-05-11 23:10:56
4312
13
原创 Android数据缓存目录context.getCacheDir与Environment.getExternalStorageDirectory
Android提供了两种数据缓存目录获取方式:context.getCacheDir()和Environment.getExternalStorageDirectory()。前者位于应用内部,卸载时自动清除;后者位于外部存储,数据会保留。文章还介绍了高版本Android(API29+)获取SD卡目录的新方法,以及使用DiskLruCache实现二级缓存的技术细节。此外,还包含了SD卡文件写入的完整流程说明,涉及权限申请、目录创建和文件操作等关键步骤。
2025-08-14 23:51:01
539
原创 Android实现Glide/Coil样式图/视频加载框架,Kotlin
本文介绍了一种Android实现Glide/Coil样式图片/视频加载框架的Kotlin解决方案。该方案采用二级缓存架构:内存缓存使用LruCache,磁盘缓存基于DiskLruCache实现,最大支持1GB存储空间。通过MD5加密URL生成缓存键,支持同步/异步加载模式,并利用协程处理IO操作。框架包含完整的缓存管理、异常处理和生命周期绑定功能,特别针对视频封面提取场景进行了优化。相比原生实现,该方案在性能测试中显著提升了缩略图加载速度,内存占用减少约30%。相关技术细节可参考作者CSDN博客中对FFmp
2025-08-13 23:16:28
850
原创 Android报错java.lang.IllegalAccessException: Tried to access visual service WindowManager from,Java
Android开发中遇到java.lang.IllegalAccessException错误,提示无法从非可视化Context访问WindowManager服务。解决方案是:当Context异常时,通过DisplayManager创建DisplayContext来获取WindowManager;正常时直接获取。相关文章介绍了两种悬浮窗实现方法:一种是常规实现(需权限),另一种是巧妙利用TYPE_TOAST类型绕过权限限制。这些方法为开发者提供了解决WindowManager访问问题和实现悬浮窗功能的实用方案
2025-08-12 23:54:54
550
原创 Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin
本文介绍了一个基于Coil3的Android视频封面抽取实现方案。项目通过MediaStore获取设备视频列表,使用MediaMetadataRetriever提取视频首帧作为缩略图,并采用二级缓存(内存+磁盘)优化性能。核心功能包括:1)声明读写存储权限;2)RecyclerView网格布局展示;3)协程处理耗时操作;4)自定义ImageLoader配置缓存策略(最大2GB)。相比原生方案,该实现通过Coil的缓存机制提升了缩略图加载效率,同时处理了视频损坏等异常情况。相关技术细节可参考作者CSDN博客中
2025-08-11 23:13:19
699
原创 Android快速视频解码抽帧FFmpegMediaMetadataRetriever,Kotlin(2)
本文介绍了两种Android视频封面提取方案对比:1)原生MediaMetadataRetriever速度较慢;2)第三方FFmpegMediaMetadataRetriever(FFMMR)实现快速抽帧。详细说明了FFMMR的集成方法(添加依赖和权限),并提供了完整的Kotlin实现代码,包括视频列表读取、缓存管理、协程异步处理等核心功能。通过LruCache缓存缩略图提升性能,记录处理耗时和失败情况。相比前文介绍的原生方案,本文重点突出了FFMMR在解码效率和性能上的优势,为需要快速获取视频帧的场景提供
2025-08-10 23:12:58
640
原创 Android MediaMetadataRetriever取视频封面,Kotlin(1)
该Android项目实现了一个视频缩略图展示功能,主要包含以下内容:1)声明了读写存储权限;2)使用RecyclerView以9列网格布局展示视频;3)通过MediaMetadataRetriever获取视频首帧作为缩略图;4)采用协程处理耗时操作,避免阻塞主线程。项目包含MainActivity、MyAdapter和MyData三个核心类,分别负责UI初始化、数据适配和数据封装。遇到视频损坏或0字节文件时,会显示错误图标并记录日志。整体实现了高效读取设备视频并生成缩略图展示的功能。
2025-08-09 23:26:57
951
原创 Kotlin中String的==相等比较符
Kotlin中String的==和equals()比较结果相同,都会比较字符串内容。示例代码展示了字符串常量比较都返回true,因为Kotlin/Java会复用字符串常量池中的相同对象。当创建字符串时,若池中已存在相同值则直接返回引用,否则新建对象并缓存。这种机制优化了内存使用,使得相同字符串常量的比较更高效。
2025-08-07 23:14:51
411
原创 Android的UI View是如何最终绘制成一帧显示在手机屏幕上?
Android UI渲染流程主要涉及生产者和消费者的协作。生产者(App)通过View的onMeasure/onLayout/onDraw生成DisplayList绘制指令,在主线程完成构建后传递给RenderThread。消费者(SurfaceFlinger和HWC)通过BufferQueue获取图像数据进行合成显示。Choreographer通过VSYNC信号协调生产消费节奏,VSYNC-app触发应用绘制,VSYNC-sf触发帧合成。系统使用双缓冲机制管理BufferQueue,确保流畅显示的同时避免
2025-08-04 23:07:48
1112
原创 Kotlin单例模式懒汉模式:LazyThreadSafetyMode.SYNCHRONIZED(2)
摘要:Kotlin中可以通过object关键字实现单例模式,companion object则提供类似Java静态方法的功能。文章展示了两种实现方式:一种是使用lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED)的线程安全懒加载单例,另一种是通过object直接声明单例。前者在首次访问时初始化且线程安全,后者则自动保证单例特性。两种方式都避免了Java中繁琐的单例实现代码,体现了Kotlin在简化设计模式方面的优势。
2025-08-02 23:31:33
610
原创 Android动态获取当前应用占用的内存PSS,Java
摘要:Android内存监控中,PSS(按比例分配内存)比RSS(实际物理内存)更能准确反映内存占用情况。获取方式包括代码调用Debug.getMemoryInfo()或adb命令。内存分析可使用adbshell am dumpheap导出hprof文件,或通过perfetto工具捕获性能数据。系统层面,MemAvailable(估算可用内存)比MemFree(空闲内存)更能体现真实内存状态,当kswapd0进程高负载时可能导致卡顿。(135字)
2025-07-16 23:31:43
887
原创 Android adb命令抓取应用的内存hprof文件
摘要:本文介绍了两种Android调试方法:1)使用adb shell am dumpheap命令抓取应用内存hprof文件并导出;2)通过adb shell配合perfetto工具捕获systemtrace文件,用于性能分析和问题排查。文章详细说明了命令操作步骤及文件导出方法,并提供了相关博客链接供参考。(97字)
2025-07-15 23:04:24
344
原创 git status报红报错:Untracked files:nothing added to commit but untracked files present
Git常见问题解决方案摘要:针对Git使用中的常见报错,本文提供三种解决方案:1)当出现"Untracked files"提示时,使用git clean -f -d清除未跟踪文件,或用git reset撤销修改;2)合并分支推送时出现"Your branch is ahead"报错,建议使用git merge --no-ff保留提交历史或git reset --hard同步远程仓库;3)需要回退版本时,git reset --hard HEAD^可退回上一版本,HEA
2025-07-11 23:15:59
764
原创 Android Coil 3 data加载图的Bitmap或ByteArray数据类型,Kotlin
摘要:三篇技术文章主要探讨了Android开发中Coil3库的图像处理功能。第一篇展示了如何使用Coil3加载Bitmap和ByteArray数据到ImageView中;第二篇介绍了Bitmap与byte[]数组之间的转换方法;第三篇讨论了用Coil3批量拼接Bitmap生成宽图的实现,同时指出磁盘缓存未生效的问题。这些文章提供了Kotlin代码示例,涉及图像加载、转换和拼接等实用技术。
2025-07-10 23:06:50
796
原创 Kotlin数值计算Long型乘Float浮点型
本文摘要:Kotlin中进行数值运算时需要注意精度问题。当Long型与Float型相乘时(如1GB*1.25f),结果需通过toLong()转换但可能出现精度损失。文章还讨论了浮点数与整数的乘除运算精度问题,以及Java中NumberFormat处理百分比转换的方法。此外,介绍了Kotlin使用DecimalFormat截取Float小数点后数值的技巧,这些内容对金融等需要高精度计算的场景尤为重要。
2025-07-07 23:20:13
537
原创 Application的onLowMemory从Android API 34开始系统不再触发,从API 35开始废弃
Android系统从API 34开始不再触发Application的onLowMemory()回调,并在API 35中将其废弃。该功能现已被ComponentCallbacks2接口的onTrimMemory()取代,后者提供更细致的内存管理机制,包含TRIM_MEMORY_BACKGROUND等警戒水位线值。开发者应转向使用onTrimMemory()进行内存优化,并根据不同级别释放相应资源。同时需注意Application的onTerminate()方法并非应用退出的可靠回调。这些改动体现了Androi
2025-07-06 23:26:48
1079
原创 Android PNG/JPG图ARGB_8888/RGB_565解码形成Bitmap在物理内存占用大小的简单计算
Android Bitmap内存占用计算:像素数×每像素字节数。ARGB_8888格式(默认)每像素4字节,如350×350图片占用约478.5KB;RGB_565格式(无透明)每像素2字节,相同图片约239.3KB。内存占用与原始图片格式(PNG/JPG)无关,仅取决于解码后的像素数据。可通过BitmapFactory.decodeResource获取图片原始尺寸创建对应Bitmap。
2025-07-05 23:05:07
1058
原创 Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
Android的ComponentCallbacks2接口定义了内存警戒水位线值,用于在系统内存不足时通知应用释放资源。从API 34开始,仅保留TRIM_MEMORY_BACKGROUND(40)和TRIM_MEMORY_UI_HIDDEN(20)两个有效值,分别表示进程进入后台LRU列表和UI不再可见时应释放资源。开发者不应直接比较值大小,而应判断是否大于等于某个级别。如Glide框架会根据不同级别释放不同量的内存资源。该机制能有效帮助系统管理内存,延长应用进程存活时间。
2025-07-04 23:04:06
1193
原创 Android编译Kotlin警告:Kapt currently doesn‘t support language version 2.0+. Falling back to 1.9.
【Android开发常见问题解决方案】 Kotlin编译警告:Kapt不支持2.0+语言版本时,需在gradle.properties中添加kapt.use.k2=true降级至1.9。 R8混淆报错:遇到"Missing classes detected"错误,可暂时关闭混淆(minifyEnabled=false),或调整JVM版本(jvmTarget='1.8')。 NDK配置: 提供NDK下载地址及版本管理方法; 解决"Could not move temporary
2025-06-24 23:19:43
1162
原创 Android编译报错:Missing classes detected while running R8. Please add the missing classes
【摘要】Android开发中遇到R8混淆报错"Missing classes detected",可通过设置buildTypes中minifyEnabled为false临时解决。同时,针对JVM目标版本不一致问题(1.8 vs 21),需在build.gradle配置kotlinOptions {jvmTarget='1.8'}统一版本。文章还提供两个实用技巧:查询Gradle与AGP版本对应关系,以及迁移.gradle文件夹优化磁盘空间。这些方案涉及混淆配置、版本兼容性和开发环境优化。
2025-06-23 23:07:59
444
原创 Android Studio报错:Supertypes of the following classes cannot be resolved
【摘要】解决Android Studio常见编译问题的实用方案:1)针对类继承关系解析失败报错,建议通过File→Invalidate Caches清理缓存并重启;2)处理JVM目标版本不一致问题(如1.8与21冲突),需在build.gradle中配置kotlinOptions{jvmTarget='1.8'}强制统一。附开发技巧:查阅官方文档匹配Gradle版本,或迁移.gradle文件夹释放系统盘空间。这些方法涉及缓存清理、版本兼容配置和环境优化。(149字)
2025-06-22 23:19:01
996
原创 Android NDK下载链接及配置版本
本文汇总了Android NDK开发的相关内容:1)NDK下载地址与版本配置方法;2)解决"Could not move temporary workspace"报错的方案;3)NDK集成OpenCV库的详细步骤,包括.so文件配置和CMakeLists修改;4)JNI/NDK实现C++文件读写操作。这些内容涵盖NDK环境配置、常见错误处理、第三方库集成以及核心功能开发等关键技术点。(149字)
2025-06-21 23:23:43
1212
原创 Android Studio报错:Could not move temporary workspace () to immutable location
Android Studio报错"Could not move temporary workspace"的解决方案是执行Build菜单的Clean Project操作。文章还汇总了Android开发相关配置要点:1)Android Gradle插件与Gradle版本对应关系;2)迁移.gradle文件夹的方法;3)通过build.gradle实现版本号自动管理,包括按日期自增VersionCode和区分构建类型设置VersionName。这些内容涉及版本兼容性、环境配置和自动化构建等核心
2025-06-20 23:04:02
788
原创 Android Studio jacocoTestReport报错:Could not set unknown property ‘enabled‘ for Report xml / html
【摘要】Android Studio Jacoco报告配置报错"Could not set unknown property 'enabled'"源于Gradle版本更新导致属性变更,需将xml/html.enabled调整为xml/html.required。解决方案分两种:1) Groovy DSL使用required=true;2) Kotlin DSL采用required.set(true)。文中还提供了Gradle版本与Android插件对应关系参考链接,并附带解决JVM目标版
2025-06-19 23:04:27
624
原创 Android Studio报错:Inconsistent JVM-target compatibility detected for tasks ‘compileDebugJavaWithJavac
【摘要】遇到Kapt任务与Java编译JVM版本不一致报错(1.8 vs 21),需在build.gradle的android模块中添加kotlinOptions{jvmTarget='1.8'}强制统一版本。另提供两个相关开发技巧:1)通过官方文档查询Gradle与AGP版本对应关系;2)迁移.gradle文件夹位置解决系统盘空间问题,需在AndroidStudio设置中更新路径。这些方案涉及版本兼容性配置和开发环境优化。(149字)
2025-06-16 23:27:38
1146
原创 Grdle版本与Android Gradle Plugin版本, Android Studio对应关系
本文汇总了Android开发中关于Gradle配置的关键信息:1) Android Gradle插件(AGP)与Gradle版本的对应关系(可参考官方文档);2) AGP版本在Maven仓库的发布信息;3) 如何迁移.gradle文件夹位置以解决系统盘空间问题;4) 通过build.gradle实现自动版本号管理,包括按日期自增VersionCode和区分构建类型的VersionName配置。这些内容涉及版本兼容性、依赖管理、环境配置和自动化构建等核心开发场景。
2025-06-15 23:33:54
712
原创 git merge合并分支push报错:Your branch is ahead of ‘xxx‘ by xx commits.
摘要:Git合并分支push时出现"Your branch is ahead"报错可通过两种方式解决:1) 使用git merge --no-ff合并分支并提交message后正常push;2) 使用git reset --hard origin/branch强制同步本地与远程仓库。对于已推送的错误提交,可使用git reset --hard commit_id加git push --force强制覆盖。这两种方法适用于不同场景,前者保留提交历史,后者可撤销远程错误提交。(149字)
2025-06-12 23:39:47
859
原创 Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS的关系决定了显示流畅度。120Hz屏幕每秒刷新120次(8.33ms/次),而FPS指系统生成帧数。理想状态下FPS应与刷新率匹配,如120FPS对应120Hz。当FPS低于刷新率时会出现卡顿,高于则浪费资源。Android 12引入Surface.setFrameRate()API让应用指定帧率。系统通过BufferQueue管理帧缓冲,渲染完成数据通过queueBuffer传给SurfaceFlinger显示。VSync信号同步处理流程,确保CPU/GPU及时处理帧数据,
2025-06-09 23:06:11
1602
原创 Android apk装机编译类型: verify、speed-profile, speed与启动耗时
Android系统通过dex2oat工具将APK中的DEX文件编译为机器码,以提升应用运行效率。编译类型包括verify、speed-profile和speed等,不同模式在安装时间、存储占用和运行性能之间权衡。verify仅验证DEX文件;speed-profile基于热点函数优化;speed完全预编译以获得最佳性能。OAT文件由vdex、odex和art组成,其中odex可加快应用启动速度。通过调整compiler-filter参数可控制优化级别,speed模式适合中高端设备。ART还包含JIT编译器,
2025-06-04 23:24:51
1809
原创 git reset --hard HEAD~1与git reset --hard origin/xxx
文章摘要:多篇CSDN博客介绍了git reset --hard命令的用法,主要用于撤销提交和回退版本。该命令可将分支重置到指定状态,常见用法包括:回退到上一版本(HEAD~1)、同步远程分支(origin/xxx)以及解决"Your branch is ahead of origin"问题。文章还提到手动输入origin/xxx较繁琐时可用HEAD~1替代,并解释了HEAD的含义。这些方法适用于需要快速撤销错误提交或恢复干净分支状态的场景。
2025-05-29 23:31:31
716
原创 SurfaceFlinger及Android应用RenderThread角度观察Jank丢帧卡顿
在Android系统中,Jank(卡顿)问题主要涉及CPU、GPU和Display三个部分。CPU负责计算帧数据,GPU进行图形渲染,渲染后的数据存储在Buffer中,最后由Display呈现到屏幕。Google在Android 4.1中引入了Project Butter,通过Vsync信号优化了帧处理流程,确保CPU和GPU在收到Vsync信号后立即处理下一帧数据。应用在绘制前需从SurfaceFlinger管理的BufferQueue申请Buffer,渲染完成后通过queueBuffer将数据返回给Bu
2025-05-23 23:03:23
936
原创 git merge解冲突后,add、continue提交
在Git中,合并分支时若遇到冲突,需手动解决冲突后执行git add .命令,然后继续正常的代码提交流程,包括git commit和git push。对于仅需合并其他分支的个别文件到当前分支的情况,不应使用git merge,而应先将所需文件从目标分支检出到当前分支,再进行常规的git add、git commit和git push操作。这种方法适用于仅需合并特定文件的场景,避免了不必要的合并操作。
2025-05-22 23:45:41
531
原创 Android trace presentFence屏幕显示的帧
在Android系统中,presentFence是屏幕显示帧的关键信号,当帧成功显示时,presentFence会发出信号。FrameMissed、GpuFrameMissed和HwcFrameMissed表示上一次合成的结果,SurfaceFlinger在每次被Vsync-sf唤醒时会检查上一次合成的presentFence是否已发出信号,若未发出则认为是帧丢失。BufferTx在queueBuffer后增加,在SurfaceFlinger合成时减少,其内有可用Buffer时,SurfaceFlinger
2025-05-20 23:46:00
1049
原创 Android trace中CPU的RenderThread与GPU
在Android系统中,RenderThread是负责GPU渲染的关键线程,它通过dequeueBuffer和queueBuffer机制与GPU进行交互,执行图形图像的密集渲染任务。RenderThread的存在解耦了Android的UI主线程与GPU渲染,避免了UI线程的阻塞,同时充分利用了GPU的并行计算能力,减少了栅格化的耗时。在硬件加速开启的情况下,RenderThread与GPURenderThread协同工作,通过SurfaceFlinger进行图像合成和显示。如果应用关闭硬件加速,则只有UIT
2025-05-16 23:06:53
1288
1
原创 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
本文在之前的基础上,进一步优化了Android应用中Coil 3.2.0版本加载缩略图和正式图的实现。主要改进点在于,当正式图加载完成后,主动删除缓存中的缩略图,以节省内存资源。文章提供了相关的Kotlin代码示例,并指出尽管配置了磁盘缓存路径,但实际运行时缓存文件为空,表明磁盘缓存未生效。作者建议将缩略图和正图的内存缓存合并为单一缓存系统,以提升性能。此外,文章还列出了所需的权限声明和Coil库的依赖项,包括对GIF、视频和SVG格式的支持。更多细节可参考CSDN博客链接。
2025-05-15 23:10:18
596
原创 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(六)
本文介绍了在Android应用中使用Coil 3.2.0版本加载缩略图和正式图的实现方法,并提供了相关的Kotlin代码示例。文章提到,尽管配置了磁盘缓存路径,但实际运行时缓存文件为空,表明磁盘缓存未生效。此外,作者建议将缩略图和正图的内存缓存合并为单一缓存系统,以优化性能。文章还列出了所需的权限声明和Coil库的依赖项,包括对GIF、视频和SVG格式的支持。更多细节可参考CSDN博客链接。
2025-05-14 23:32:48
472
原创 Kotlin高阶函数多态场景条件判断与子逻辑
Kotlin高阶函数允许将函数作为参数传递,实现多态场景下的条件判断与子逻辑切换。在示例代码中,somefun是一个高阶函数,根据条件分别指向multi和add函数,分别实现乘法与加法操作。通过invoke方法调用函数,动态执行不同逻辑。这种设计在Android开发中尤为有用,例如将耗时操作从主线程切换到非主线程执行,处理完成后将结果返回主线程。Kotlin的高阶函数特性简化了复杂逻辑的实现,提升了代码的灵活性与可维护性。
2025-05-10 23:12:27
1111
原创 Android kernel日志中healthd关键词意义
在Android内核日志中,healthd关键词用于记录电池相关信息,包括电池温度、剩余电量、电压、电池健康和状态等。具体指标如level表示剩余电量,voltage为电压,temperature为电池温度,status表示电池状态(如充电或未充电),health表示电池健康状况(如良好或过热)。这些信息在系统源码的头文件中通过枚举定义,如BATTERY_STATUS_CHARGING和BATTERY_HEALTH_GOOD。此外,Android的JIT(即时编译)技术通过ART(Android Runti
2025-05-09 23:08:31
1046
原创 Android RecyclerView自带的OnFlingListener,Kotlin
文章浏览阅读338次。Android不用OnScrollListener采用GestureDetector结合OnTouchListener实现ListView下拉/上拉刷新通常Android的ListView的下拉/上拉刷新实现,使用OnScrollListener比较简单,比如如果要实现下拉见顶刷新,思路是在OnScrollListener判断当前ListView的滚动状态,如果滚动停止,则将此时Lis。文章浏览阅读428次。
2025-05-08 23:13:52
761
原创 Android RecyclerView横竖屏OnGlobalLayoutListener/OnPreDrawListener/onDraw/onMeasure/onLayout值变化,Kotlin
文章浏览阅读2.9k次。Android可收缩/扩展的TextView【1】在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容。这样的设计有一定的优越性,毕竟用户的时间有限,注意力和关注力也有限,在使用APP时候,用户需要在最短时间内尽可能快速浏览和查阅到更主要内容,_android 可扩展文本框。
2025-05-06 23:10:53
969
MaterialDesignLibrary_Code and Lib合集
2015-09-21
链家2020年9月二手房数据
2020-12-10
strava_com_sample_utf8.xls
2020-12-10
digital-7字体(LED数字样式字体)
2017-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人