- 博客(396)
- 资源 (10)
- 收藏
- 关注
原创 Android之View.post() 获取 View 宽高的原理和消息同步屏障
在Android中,**onCreate()和onStart()无法获取View的宽高是因为此时View还未完成测量和布局流程。View的宽高测量是在onResume()之后通过ViewRootImpl的performTraversals()触发的。而view.post(Runnable)**能获取宽高的原因是: 消息队列机制: 若View未Attach到窗口,Runnable会暂存到RunQueue 在ViewRootImpl设置AttachInfo时,Runnable被投递到主线程消息队列 由于Chor
2025-11-13 11:28:19
887
原创 Android垃圾回收算法详解
本文系统介绍了Android垃圾回收机制。重点分析了四种常见GC算法:标记-清除会产生内存碎片,标记-整理能消除碎片但耗时,复制算法高效但浪费空间,分代收集算法根据对象生命周期采用不同策略,最适合Android应用场景。现代Android采用并发复制GC,结合分代收集和压缩整理,实现短暂停时间(<10ms)和高内存利用率。文章还对比了Dalvik和ART的GC差异,并提供了减少GC影响的优化建议,如对象池、内存泄漏检测等。理解这些GC机制对开发高性能Android应用至关重要。
2025-11-12 14:32:56
887
原创 android StateFlow和sharedflow
Android中的StateFlow与SharedFlow对比及使用场景 StateFlow和SharedFlow都是Kotlin中处理数据流的工具,但特性不同。StateFlow始终有当前值,只保留最新值,适用于UI状态管理、配置设置等需要"当前状态"的场景。SharedFlow可配置缓存多个值,适用于一次性事件、多播场景和需要保留历史值的场合。选择指南:管理状态用StateFlow,处理事件用SharedFlow;需要立即获取当前值用StateFlow,不希望错过任何发射值则配置Sh
2025-11-11 17:52:10
299
原创 Android 协程间通信
Kotlin协程通信机制摘要:本文介绍了Kotlin协程的5种主要通信方式。1) Channel类似于阻塞队列,支持无缓冲、有缓冲、无限容量等类型,适合生产者-消费者模式;2) Flow是冷流,StateFlow和SharedFlow分别用于状态管理和事件总线;3) Deferred用于异步获取单个结果;4) CompletableDeferred可手动完成延迟值;5) Actor模式封装Channel用于状态管理。每种机制都有特定适用场景,如Channel适合顺序通信,Flow适合数据流,Deferred
2025-11-11 16:54:59
199
原创 Vite构建适配低版本WebView
本文介绍了如何启动Web项目并配置VITE_BASE_URL环境变量。启动命令需添加--host参数(pnpm run dev -- --host),会输出本地和网络访问地址。配置VITE_BASE_URL有三种方式:1)创建.env文件设置;2)命令行传参;3)在vite.config.js中设置默认值。其中最简单的方式是直接在运行时传参。配置完成后需重新启动项目。网络地址192.168.x.x用于移动端本地调试。
2025-10-20 11:10:01
332
原创 web vue之状态管理Pinia
Pinia是Vue官方推荐的状态管理库,作为Vuex的替代方案,具有更简洁的语法、TypeScript支持和更好的性能。安装Pinia后,在main.js中注册即可使用。通过defineStore创建store,包含state、getters和actions。在组件中通过useStore导入并使用store数据和方法。Pinia适用于全局状态共享、多组件数据共享、请求缓存等场景。还可按业务拆分成多个store模块,如单独的用户store模块。相比Vuex,Pinia提供了更直观的状态管理方式,是Vue3项目
2025-10-15 16:42:33
403
原创 web之Router
本文详细介绍了在Vue 3项目中配置Vue Router的完整流程。主要内容包括:创建Vite项目并安装vue-router;建立路由配置文件并定义路由规则;创建视图组件;在main.js中注册路由;修改App.vue添加导航链接和视图容器;以及运行验证路由功能。最后还简要提及了编程式导航、动态路由、路由参数获取和路由守卫等进阶功能。按照这9个步骤,开发者可以快速在Vue 3项目中实现基本的路由功能,为单页应用开发奠定基础。
2025-10-15 16:28:37
305
原创 Android之cubism数字人
文章摘要:本文介绍了在Android项目中集成Live2D Cubism库时遇到的典型问题及解决方案。主要包括将Demo中的Activity改造成Fragment进行整合,处理了模型参数调试和多个页面切换时的空指针异常问题。特别解决了数字人视图层级问题,通过使用透明Activity覆盖方案,并发现preserveEGLContextOnPause参数可以防止SurfaceView在透明Activity切换时黑屏。最终通过全面排查解决了资源管理不当导致的空指针问题,实现了数字人视图在复杂场景下的稳定运行。
2025-09-26 14:10:21
649
原创 Jetpack Compose 中 remember、rememberSaveable、rememberUpdatedState 的使用场景与区别
Jetpack Compose 提供三种状态管理 API:remember 用于临时 UI 状态(如输入框焦点),生命周期与组合一致;rememberSaveable 扩展功能,通过 Bundle 系统在配置变更时保持数据,适合表单等需持久化的简单状态;rememberUpdatedState 专门解决异步操作中的状态过期问题,保持对最新值的引用。选择时需考虑生命周期需求:默认用 remember,持久化用 rememberSaveable,异步场景用 rememberUpdatedState,同时注意避免
2025-08-28 15:00:18
735
原创 Jetpack Compose 副作用处理详解与最佳实践
本文介绍了Jetpack Compose中常用的副作用API,包括LaunchedEffect、rememberCoroutineScope、DisposableEffect、produceState和derivedStateOf。这些API帮助开发者在声明式UI中执行副作用操作,如网络请求、资源管理等。文章详细说明了每个API的用法、适用场景,并通过对比表格总结其特点,最后给出了最佳实践建议。这些API作为连接声明式UI与命令式逻辑的桥梁,能帮助开发者编写高效、可维护的Compose代码。
2025-08-28 14:54:52
1009
原创 android开发之androidautosize的坑
使用了androidautosize后,如果遇到图片剪裁或者做一些位置变换时,位置一直不对,那么就是androidautosize导致的。
2025-06-10 14:14:12
238
原创 android 签名安全
在 GitLab 项目或 Group 的 Settings → CI/CD → Variables 中添加以下内容:KEYSTORE_BASE64:将 .keystore 文件转成 base64 字符串后存储KEY_ALIAS⚠️:这些变量需要设置为 “Protected” 且 “Masked”,确保不会被打印在日志中。你可以使用命令行工具将 .keystore 文件转换成 base64 字符串,非常简单。以下是在 Windows、macOS、Linux 下的操作方法。
2025-05-19 10:52:49
794
原创 GitLab Runner配置并行执行多个任务
打开 Runner 的配置文件(通常位于 /etc/gitlab-runner/config.toml 或 ~/.gitlab-runner/config.toml)。如果发现 limit 被设置为 1,可以重新注册 Runner 或修改 config.toml 删除该限制。如果使用 docker executor,可以调整 concurrent 并确保 Docker 有足够资源。如果使用 shell executor,确保 Runner 所在机器的 CPU 和内存足够支持多个任务。
2025-04-23 11:03:48
1023
原创 android Could not isolate value org.jetbrains.kotlin.gradle.plugin.statistics.BuildF
最近在死磕 Gitlab CI/CD,遇到的问题实在是多,还好现在都有各种 AI 了,不然真是难顶。
2025-04-15 17:35:17
640
原创 android 何如查找内网设备 IP
因为设备是采购的,也无法修改设备固件。所以最后只能通过 WiFi 路由器扫描局域网设备,对扫描到的 ip 发送抓包获取到的接口,如果有数据就保存起来。如果需要端口的接口,则需要通过抓包的方式,先把设备的相关接口抓取,这个时候就能知道不同接口对应的端口号了。不过依赖别人的固件不是个靠谱的事,设备更新固件接口后,我等也无能为力了。
2025-03-28 13:47:48
658
原创 Android持续集成之自动化上传库到maven私服
随着模块化集成度越来越高,公司的 App 产品越来越多,为了避免不断的复制粘贴代码,有必要将一些功能模块集成起来,直接引入到需要的模块中,减少代码的维护成本。我们可以通过在 GitLab CI 中,使用 CI/CD 任务,在创建 tag 版本时自动上传 Android Library 到 Maven 私有仓库。
2025-03-19 10:51:14
951
原创 Android之Sentry接入
在Android应用中接入Sentry可以帮助你捕获和监控应用中的错误和异常。Sentry 是一个开源的错误跟踪工具,支持多种平台,包括 Android。特别是能够私有化部署。
2025-03-14 10:05:03
945
原创 android 签名MD5值和公钥
最近又是申请其他第三方 SDK 的 API ,需要使用到签名的 MD5值。没想到以前好好的命令,现在又不行了。
2025-02-08 10:33:54
402
原创 Compose 之 State
当您的状态或键的变化超出您想要更新 UI 的范围时,应使用。有点类似于 flow 的 distinctUntilChanged 功能,只是这个转换后是个 State。总而言之,请记住,当您的状态或键的变化超出您想要更新 UI 的范围时,请使用派生状态。如果输入量与输出量没有差异,则不需要使用它。
2025-01-15 10:32:52
265
原创 Android持续集成之Spotless
各个 IDE 不是都有格式化工具吗?为什么要使用 Spotless 呢?开发团队中,成员可能有不同的编码习惯,例如缩进方式、空格数量、行尾格式等。这会导致代码风格不统一,影响代码的可读性和维护性。Spotless 提供了一种自动化的方式,统一格式化代码,避免手动调整。通过 Spotless,可以根据团队规范强制执行一致的代码风格,减少代码审查中的无关问题。手动格式化代码会浪费开发时间,尤其是当团队规模较大时。Spotless 在构建或提交代码时自动运行格式化规则,无需开发者手动调整。
2025-01-15 10:18:16
243
原创 android 启用lint检查
通过配置 lint.xml 文件,你可以自定义 Lint 的检查规则,并使其适应项目的需求。常见的 Lint 规则包括资源检查(未使用的资源、硬编码文本)、安全问题(不安全的 Intent)以及性能问题(日志记录等)。根据项目的具体需求,合理启用或禁用这些规则有助于提升代码质量。
2025-01-13 17:28:25
772
原创 android 开发中的 SPI模式
在设计 SPI 架构时,确保接口足够抽象和通用,能够适应未来的扩展。接口应该包含基本的功能声明,但避免过于复杂或具体的实现细节。SPI 架构可以为 Android 应用带来良好的插件化和可扩展性,尤其适用于模块化的开发。通过定义接口、提供不同的实现类,并使用服务发现机制,可以实现灵活的服务切换和扩展。使用 SPI 时要关注接口设计、服务发现机制、性能和内存管理等方面,以确保系统的高效和稳定。
2025-01-03 11:56:24
1142
原创 RecyclerView的缓存复用机制
RecyclerView,顾名思义,它会回收其列表项视图以供重用。具体而言,当一个列表项被移出屏幕后,RecyclerView并不会销毁其视图,而是会缓存起来,以提供给新进入屏幕的列表项重用,这种重用可以:避免重复创建不必要的视图避免重复执行昂贵的findViewById从而达到的改善性能、提升应用响应能力、降低功耗的效果。而要了解其中的工作原理,我们还得回到RecyclerView是如何构建动态列表的这一步。
2024-12-26 17:47:49
862
原创 如何分析 System Trace 数据
通过 System Trace,你可以获得以下关键的性能数据:CPU 使用情况线程的执行与调度状态每一帧的渲染时间I/O 操作的耗时内存管理(GC)的效率通过分析这些数据,你可以定位性能瓶颈,找出高 CPU 消耗、UI 卡顿、线程阻塞等问题,并基于数据提出优化方案。
2024-12-24 15:19:20
1538
原创 android 混淆
很久没用过混淆功能了,因为之前的包都使用第三方加固了,而且项目开发好几年了,突然要混淆也很麻烦。换了家公司后,感觉还是得混淆代码才行,不然直接暴露源码也太不行了。
2024-12-18 14:52:12
1230
原创 android 适应CA证书
要使 Android 应用适应和信任自签名 CA 证书,尤其是在开发、测试或内部网络中,有几种常见的方式可以配置应用使其信任自定义 CA 证书。通常这涉及到为应用定义网络安全配置或调整系统设置。
2024-11-10 21:39:06
2763
原创 OkHttp Interceptor日志上报
网络的埋点切入口,很容易就想到了 Interceptor,用起来了才觉得 Interceptor 是真的香,以前还只是觉得这个设计模式是真好。用到了才感觉是太香了。网络请求上报是带上了URL,现在的Retrofit 的URL 在其他地方是真的不好拿,这 Interceptor 确实方便的很。
2024-09-10 15:56:15
787
原创 android studio 同时支持http和https
这个问题是由于 Gradle 无法下载某些依赖项文件,这可能是因为服务器与客户端之间的 TLS 协议不兼容。问题出在 Android Studio 构建时尝试通过 HTTPS 下载某些文件,但由于协议版本问题(例如,服务器不支持 TLS 1.2 或 1.3),导致握手失败。在你的 build.gradle 文件中,更改所有依赖的仓库 URL 以使用 http 而不是 https。意思是华为这个库对于TLS protocol versions: (TLSv1.2, TLSv1.3)不支持。
2024-08-28 11:41:06
882
1
原创 Jetpack Compose 阻尼动画效果之SplineBasedDecay
SplineBasedDecay是 Jetpack Compose 中的一个函数,用于创建一个基于曲线衰减的动画效果。它通常用于创建平滑的动画效果,比如惯性滚动或惯性拖动的动画效果。
2024-04-12 14:49:45
705
原创 HarmonyOS首次尝试-HelloWorld
通过在鸿蒙社区查找解决办法,发现可能是API版本设置问题,还有创建时我选的是stage,导致无法使用更低的API 版本,所以又重新创建了个demo, 选择FA模式,API7。但是运行 hdc -c shell命令一直报错找不到设备就很离谱,明明studio都已经显示找到了,也能运行了。插上后,studio能显示连接上了手机设备,创建的demo使用的是API9,也就是当前的最新版本。3.0.0我猜的是API7吧,一运行又是报错,找不到设备。如果你没有配置 环境变量,会报错找不到命令,去配置就行。
2023-12-12 09:50:55
1637
原创 Ubuntu中Gitlab + Gitlab-CI + Docker + Fastlane完成Android自动化编译和打包
Android开发过程中持续集成是一项非常重要和必要的工作。持续集成指的是通过自动化的方式将开发、测试和部署过程整合在一起,实现代码的自动构建和测试,并快速反馈给开发人员,从而加快软件开发周期,提高软件质量和稳定性。以下是持续集成的重要性和必要性:提高开发效率和质量:持续集成可以自动构建和测试代码,快速检测出问题,并及时反馈给开发人员,这样可以减少手动测试的工作量,提高效率和质量。降低错误率:持续集成可以避免由于手动构建和测试过程中的疏忽而引入错误,保证了代码的准确性和可靠性,降低了错误率。
2023-06-02 14:29:49
1383
设计师测量文本行距
2016-06-23
Hello-jni-ndk
2017-03-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅