- 博客(324)
- 资源 (97)
- 收藏
- 关注
原创 Android 12 权限与存储适配:蓝牙三分天下、MANAGE_EXTERNAL_STORAGE 被拒之后
权限声明≠实际可用,路径正确≠可写入。Android 12 起蓝牙与位置解耦,BLUETOOTH_SCAN/CONNECT 需单独申请且需加 neverForLocation 保证扫描完整;存储操作也因厂商定制、静默失败难排查。关键在于:运行时权限需动态校验,静态声明无法覆盖行为差异。
2026-10-21 19:52:33
266
原创 Android 两个查不出的故障:崩溃没有日志、回调第二次不触发
有些 Bug 不给你线索:App 闪退回桌面,用户说"每天一两次",可崩溃平台一条记录都没有;接上 logcat,满屏正常日志,连都没有。还有些 Bug 给你错误的线索:一个选择器,第一次点能正常返回,切到别的 tab 再切回来,点开、选完、页面正常关闭,回调就是不来了。两种故障的排查成本都很高,但高的原因不一样:第一种是信号被吞了,第二种是信号压根不存在。而脑子里都有同一个默认假设——“崩溃一定会进日志”、“注册一次就永久有效”。这句日志来自宿主模块。
2026-10-21 19:51:27
449
原创 Android APK 加固方案怎么落地:从加壳到校验的组合取舍
加固非简单加壳,而应按成本与收益分层布局:优先部署签名校验与dex完整性校验(P0),低成本阻断二次打包;核心逻辑下沉so防静态修改(P1);加壳与运行时检测仅作门槛提升,需权衡启动耗时与兼容性。混淆仅提高阅读难度,不可替代校验。关键在于“先堵住可被利用的链路”,再逐级抬高攻击成本,实现安全与体验的平衡。
2026-10-19 07:10:21
275
原创 Android 安全校验下沉到原生层:防 patch 与构建期自动化
将签名校验下沉至原生层,通过机器码实现核心判断,结合动态库加载、JNI绑定、签名证书纯原生解析与指纹混淆存储,构建多层防护体系。引入编译期符号隐藏、运行时反调试及dex与so互校机制,使攻击者难以定位、修改或绕过校验逻辑,彻底让patch无利可图。
2026-10-19 07:09:39
412
原创 Android 签名校验为什么能拦住二次打包:指纹与完整性校验
本文提出在Android应用加固中,利用“重签名”这一攻击链必经环节,构建运行时签名指纹校验防线。通过比对当前包签名证书的SHA-256指纹与官方指纹,可有效识别二次打包。针对v1签名方案粒度不足的问题,结合内容完整性校验形成双重防护。文章还详解了v2/v3签名机制对整包的强保护能力,并给出兼容新旧系统的签名读取实现及失败处理策略,强调安全与可用性平衡,最终实现“签名不变即未被篡改”的可信判断。
2026-10-17 17:21:45
314
原创 Android 混淆挡不住二次打包:一条完整的攻击链与突破口
混淆仅增加代码阅读成本,无法阻止篡改。攻击者可反编译、利用映射文件还原逻辑、修改关键行为,再重打包并重签名——其中重签名是绕不开的必经环节。该动作虽为必要,却也暴露了攻击痕迹。真正防线不在混淆,而在于对重签名行为的监控与校验,这是防御链上唯一不可绕行的“卡点”,也是安全加固的根本支点。
2026-10-17 17:20:52
532
原创 Android 地图上绘制 KML:解析、样式与渲染
本文系统解析 KML 从文档结构到地图渲染的完整链路:基于 OGC 规范,厘清命名空间、坐标顺序(lon,lat,alt)与颜色字节序(aabbggrr)等关键细节;采用 XmlPullParser 实现低内存拉取式解析,构建与 SDK 无关的数据模型;通过递归处理容器层级,精准提取点、线、面几何,并正确解析样式继承与 gx:Track 等扩展;最终实现从 KML 到地图图形的语义映射,解决位置偏移、样式失效等典型问题。
2026-10-16 19:30:35
416
原创 Android 地图渲染数据链:引擎插件化适配与 GDAL 栅格矢量
本文提出一种统一处理地图底图与数据源的架构:通过依赖倒置,将“底图是谁画的”与“数据从哪来”解耦,构建稳定地图内核。内核定义视图、坐标转换与引擎三组契约,支持第三方SDK(包装型)与自绘瓦片(引擎型)接入,并通过插件注册机制实现动态加载。同时引入GDAL作为统一数据源,兼容多种栅格与矢量格式,将复杂解析抽象为标准接口,使业务层只需关注“如何渲染”,彻底摆脱对具体底图和格式的依赖,实现高可扩展性与低维护成本。
2026-10-16 19:28:09
419
原创 Android 本地优先的三级语义理解降级链
本文提出语音助手意图识别的“本地优先三级降级链”:先硬匹配(全等+周边校验+最长匹配)、再正则抽参(缓存模式、防回溯)、最后才调用大模型兜底。通过文本归一化、子串边界处理、槽位提取与置信度控制,实现快速响应、低成本、高准确率。核心在于前两级规则设计决定系统成败,避免误判,真正实现“又快又省还兜底”。
2026-10-13 21:54:51
287
原创 Android 流式对话实现:分层门面与 SSE 手工解析
流式问答的痛点不在“流”,而在“流的分片该写进哪个气泡”和“如何保证流不被客户端截断”。通过分层门面,将taskId与msgId映射关系隔离在调度层,实现精准刷新;同时规避日志拦截器缓存整流、读取超时掐断连接等陷阱,确保SSE字节流稳定解析。核心是:上层只管刷新气泡,下层只管逐行读字节,传输细节彻底挡在业务之外。
2026-10-13 21:53:42
338
原创 Android 模块化三件套:轻量组件化、宿主插件双形态、AIDL 隔离
本文以“边界”为主线,剖析Android开发中模块、运行时、进程三类边界问题。通过轻量组件化(清单+接口路由)实现模块间依赖解耦;以运行时环境探测与门面封装应对插件与独立运行的差异;最终强调:边界应划在变化最剧烈处,用窄通道隔离细节,以间接调用或IPC守住系统稳定性。
2026-10-13 07:16:30
281
原创 Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
本文探讨工程中并存MVVM与MVP展示层模式的合理性,强调分层核心是“让变化只影响一层”:展示层按问题域选择模式(一次性操作用MVP,持续状态用MVVM),数据层则将网络框架彻底封装在仓储后,通过接口抽象隔离实现细节。关键在于清晰边界与约定,使换模式或换网络框架仅影响单层,提升可维护性。
2026-10-13 07:15:19
192
原创 Android 可插拔能力封装:策略模式接扫码、门面模式接语音
本文探讨了在移动应用中如何通过设计模式实现外部能力(如扫码、语音)的可替换性。核心思想是:业务层不应依赖具体实现,而应通过策略模式(扫码)和门面模式(语音)将差异封装在底层。扫码以统一接口抽象不同库的差异,语音则通过门面收敛多厂商接口并归一化错误码。关键在于“换一家”只需修改配置,业务代码一行不改,真正实现“变化关进稳定的抽象里”。
2026-10-11 15:52:31
452
原创 Android 后台任务:前台服务下载与 WorkManager 定时刷新
本文系统解析了安卓后台任务的两类核心场景:大文件下载与凭证刷新。前者依赖前台服务+任务持久化+断点续传,通过 startForeground 保活、序列化任务列表防丢失、Range 请求实现续传;后者则应交由 WorkManager 周期任务,避免常驻线程,确保省电、可重试、网络感知。关键区分在于:用户可见的长任务用前台服务,静默周期任务用 WorkManager。
2026-10-11 15:50:51
44
原创 Android 测绘数值基础:测量单位系统与七四参数、高程拟合
单位与坐标换算本质同源:内部统一标准值,出口集中换算并收口。通过全局单位注册表与格式化封装,实现“切换一处、全链路生效”;角度、长度、面积换算因子精确定义,进位与精度策略稳健处理。坐标转换依赖控制点反解七参数(三维刚体变换+尺度),强调参数求解前的数据规范与基准对齐,确保全系统可验证、可维护。
2026-10-11 15:48:55
214
原创 Android 软键盘与输入框对不齐?聊聊输入交互里的坐标问题
当软键盘弹起时,getGlobalVisibleRect 返回的输入框可见区域可能滞后于实际位置,导致点击外部却误判为在框内,键盘无法收起。根本原因是该方法返回的坐标与触摸事件的屏幕坐标(rawX/rawY)未同步。解决方法是结合 getLocationOnScreen 获取真实屏幕坐标,校准 rect 偏移,确保坐标系一致。核心教训:跨坐标系比较前,务必确认其一致性。
2026-10-07 15:05:20
178
原创 Android 设置页控件家族:把一堆“设置行“抽成可复用组件
本文提出一种统一设置页行控件的设计方案:通过基类SettingItemBar固定左侧标题,右侧以RowType枚举驱动,动态组合开关、输入框、箭头等控件,实现样式一致、代码复用。辅以CUSTOM插槽应对特殊需求,最终使设置页仅需“配置一行”即可完成添加,大幅提升可维护性与可读性。
2026-10-07 15:04:23
47
原创 Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
本文提出通过“固定骨架+内容插槽”模式统一Android弹窗风格:定义一份通用弹窗布局(标题栏、内容区、操作栏),子类只需提供内容布局,无需重复编写样式。所有弹窗共享同一套圆角、颜色、按钮样式,修改一处即全生效。结合回调机制复用确定/取消按钮逻辑,实现风格统一、开发高效。适用于底部选择器、确认框、输入框等各类弹窗,是模板模式在UI设计中的实用实践。
2026-09-30 20:22:42
627
原创 Android 自定义 View 实战:手写一个电量控件
本文以自定义电池图标为例,详解Android中自定义View的核心要点:通过TypedValue实现dp到像素的精准转换,利用TypedArray暴露可配置属性,绘制时注重圆角对齐与电量填充的视觉逻辑(按比例变宽、高度固定),并采用策略化颜色映射实现低电量变红。最后通过重写onMeasure支持wrap_content,确保在不同屏幕密度下显示一致、布局灵活。完整呈现了从测量、属性、绘制到适配的自定义View全流程。
2026-09-30 20:20:48
177
原创 Android ActivityResultContract:给页面跳转返回值加一层类型安全
通过 ActivityResultContract 将页面跳转封装为类型安全的契约,用 data class 代替魔数传参,实现输入输出强类型化。调用方仅需注册一次启动器,一行代码发起请求,自动处理结果解析,彻底消灭 startActivityForResult 的样板代码与散落的字符串键值,提升可维护性与安全性。
2026-09-30 20:20:14
161
原创 Android ViewBinding 泛型基类:三层体系把样板代码抽干
本文提出一种三层泛型基类设计,通过抽象横竖屏控制、状态栏适配、Loading超时关闭、防双击、统一Toast等通用能力,将重复代码下沉至基类。业务Activity仅需实现initViewBinding()和initViews(),代码量缩减至十几行,实现全链路复用与行为一致性,显著提升开发效率与维护性。
2026-09-29 22:06:10
343
原创 Android Fragment 状态管理踩坑合集:那些“回来就错乱“的场景
Fragment状态恢复常引发隐蔽崩溃:进程重启后因BundleClassLoader失效导致ClassCastException,需重置ClassLoader;onSaveInstanceState后调用commit()会抛异常,应改用commitAllowingStateLoss();屏幕旋转丢失定时器,可用保留实例的Fragment持任务,但需弱引用避免泄漏;对话框二次无法弹出,因mDismissed标记未重置,可反射修复或每次新建实例。核心在于理解状态保存机制的“边角料”陷阱。
2026-09-29 22:05:12
96
原创 Android 多列表联动表格:四个 RecyclerView 怎么滚动同步
一张表格拆分为四个独立滚动区域(角头、列头、行头、内容区)时,核心难点在于实现“永远对齐”。传统监听滚动并同步的方案易引发循环反馈、错位和控制权争夺。解决方案是引入“触发器机制”:仅允许一个列表为滚动源,其余跟随;通过滚动状态判断触发源,并在非源列表被拖动时强制停止其滚动并拦截触摸事件,确保唯一控制权。该方法有效解决多列表联动中的冲突问题,适用于表格、时间轴等复杂滚动场景。
2026-09-28 22:00:36
165
原创 Android 侧滑删除控件是怎么一步步做出来的
自定义侧滑菜单看似简单,实则陷阱重重。从事件分发的三层博弈到点击、长按、滑动的共存,再到回弹逻辑与多菜单互斥,每一步都需精细处理。核心在于:手势意图的精准识别、状态机的不可逆切换、全局展开项的管理及静态引用的及时释放。一个成熟的侧滑控件,是无数边界情况打磨出的产物。
2026-09-28 21:59:51
115
原创 Android 万级数据表格性能优化:几万行也能顺滑滚动
大数据表格卡顿主因并非渲染,而是“无脑刷新”。全量调用notifyDataSetChanged()会导致所有可见行重绑、重测布局,几万行几十列下瞬间卡死。优化关键:局部刷新——拖拽列宽时仅更新缓存的可见Holder宽度;选中高亮用payload机制,只改背景不重建单元格;列宽自适应通过Paint.measureText内存测量,避免视图创建。配合WeakReference缓存避免内存泄漏,滑动流畅如丝。核心原则:能局部就不全局,能轻量就不重建。
2026-09-27 19:48:17
345
原创 Android RecyclerView 泛型基类:Adapter 增删改查只写一次,payload 局部刷新
十个列表九份重复的Adapter代码?用泛型基类一键抽干!通过BaseAdapter<T, VH>接管增删改查与notify逻辑,业务只需定义“一行怎么绑数据”;结合BaseViewHolder<ViewBinding>消除findViewById样板;再引入payload局部刷新,仅更新变化字段,大幅提升性能。一套泛型基类+约定优于配置,彻底告别复制粘贴,让列表开发回归本质。#Android #RecyclerView #泛型基类 #Adapter #payload局部刷新 #ViewBinding #K
2026-09-27 19:47:36
140
原创 Android 上跑通 PROJ 9 坐标转换:从交叉编译到 EPSG 解析的 8 个坑
本文复盘了将 PROJ 9.8.1 与 PROJ-JNI 交叉编译为 Android arm64-v8a AAR 的全链路过程,揭示8个关键坑点:LTO链接失败、C++符号缺失、JNI路径误解析、so输出位置异常、宿主机路径硬编码、打包细节疏漏、CheckJNI兼容性问题及运行时崩溃。核心难点在于自包含AAR的构建——需确保so、EPSG数据库(proj.db)与Java API完全隔离宿主环境。最终通过修复DT_NEEDED、调整JNI签名、正确设置PROJ_DATA路径并静默处理异常,实现createF
2026-09-25 09:08:17
343
原创 Android 跨进程设备共享:用 AIDL 让多进程共用同一硬件连接
在工业级 Android 应用里,多进程架构其实很常见:主进程扛 UI 和设备连接,辅助进程跑后台同步、消息推送,甚至同厂商的另一个 App 也想读同一台设备的定位数据。核心矛盾很直接——硬件设备只有一个物理连接,但多个进程都要访问。再连一次?蓝牙只能一对一、串口互斥,根本行不通;写文件轮询?实时性和事件流都丢了。我在自研的这套 GIS/地图引擎里,用一套基于 AIDL 的跨进程设备共享服务把这个问题收了尾。
2026-09-25 08:22:56
340
原创 Android 多通道设备通信怎么统一:一套抽象打通蓝牙串口网络
在垂直行业Android应用中,多通道(蓝牙、串口、USB、TCP/UDP、NTRIP等)通信导致业务层需重复适配。本文提出三层抽象架构:底层为异步IO流抽象,统一字节流读写;中间层为设备抽象,封装连接状态机、自动重连与事件分发;上层业务接口对通道无感。通过依赖倒置与模板方法模式,将20+通道收敛为一套接口,显著降低代码冗余与维护成本,实现通信层的工程化统一。
2026-09-24 07:17:48
728
原创 Android 与硬件通信:异步 IO 流加解析管道拆解字节流
蓝牙串口返回无边界字节流,半帧、粘帧常见。本文提出“异步IO流+解析管道”架构:通过双线程模型分离读写,保障线程安全;采用责任链模式构建解析管道,分步完成帧分割、校验、协议解析,实现协议可扩展、逻辑解耦。新增协议仅需实现Parser接口,无需修改底层代码,有效解决字节流稳定拆帧难题。
2026-09-24 07:15:26
396
原创 Android 地图距离和实测对不上?格网与地面归算差在比例因子
图上距离与实测距离不符,源于投影变形与高程差异。核心在于“组合比例因子”——由比例因子(投影变形)与高程因子(地面高度压缩)相乘而成。不同投影类型(如高斯、兰勃特)需分别计算,参考点越近,换算越准。该归算确保放样精准、数据对齐,是测量工程中不可或缺的基础环节。
2026-09-23 21:34:51
131
原创 Android 一套代码扛几十种坐标系?投影类型到 proj 字符串翻译
本文剖析了坐标转换中“业务对象”与“PROJ引擎字符串”之间的映射难题。核心在于类型映射表需处理参数名差异、UTM带号自动对齐、兰勃特切/割圆锥区分等反直觉陷阱。通过适配器模式构建双向翻译机制,结合缓存句柄与命名规整,实现高效、可扩展的坐标系转换。关键启示:映射表不仅是拼接工具,更是解耦与兜底的关键工程设计。
2026-09-23 21:34:06
427
原创 Android 火星坐标反向换算无逆公式?二分逼近 GCJ02 转 WGS84
本文提出一种实用的反向坐标转换方法:当GCJ02→WGS84无解析公式时,可将正向变换视为单调黑盒,通过二分逼近法在经纬度区间内迭代求解。核心思想是利用正向函数的单调性,不断缩小候选范围直至偏差小于1e-9。该方法无需逆公式,仅依赖正向计算,收敛稳定且精度高(约0.1毫米),适用于测绘、定位等场景中“有正无逆”的非线性映射问题。
2026-09-22 07:08:34
348
原创 Android 地图多边形怎么切三角形?耳切法加 z-order 加速渲染
地图面要素在渲染前需通过三角化转换为三角形,GPU仅支持三角形光栅化。本文详解耳切法在处理凹多边形、带洞多边形时的核心逻辑:通过找“凸耳朵”逐步切割,并结合z-order哈希加速点内判断,实现O(n log n)效率;带洞情况通过“找桥焊入外环”统一处理;面对自相交等异常输入,采用过滤、修复、拆分三层兜底策略保障鲁棒性。该算法在性能与复杂度间取得平衡,是地图渲染的隐形功臣。
2026-09-22 07:07:46
275
原创 Android 地图海量 long 去重卡顿?裸数组哈希集合提速又省内存
在百万级 long 去重场景中,HashSet<Long> 因装箱产生大量对象,导致内存占用高、GC 压力大。采用裸 long[] 数组结合开放寻址与线性探测,通过 EMPTY 和 TOMBSTONE 哨兵值管理空位与删除,实现零装箱、零对象开销。配合右移异或哈希函数与动态扩容,内存仅需约 12MB,性能显著提升。适用于高频、海量基本类型操作的极致优化场景。
2026-09-21 12:00:00
326
原创 Android 地图符号绘制:用字符串 DSL 把规则从代码里抽离
将地图符号规则从代码中抽离,以分号分隔的字符串DSL描述,实现绘制逻辑与规则解耦。通过符号表索引、子规则嵌套与解释器执行,支持点、线、面符号的灵活配置,结合毫米到像素转换、坐标旋转与沿线定位,完成复杂制图需求。该方案使规则可外部配置、免发版更新,提升维护效率,是GIS领域“规则数据化”的高效实践。
2026-09-21 07:10:03
216
原创 Android 地图几万要素卡成幻灯片?顶点缓冲批上传与显存复用
移动端地图渲染的性能瓶颈不在数据量,而在GL调用次数。通过按批分组顶点、复用缓冲区、批量拷贝数据、仅更新变化批次,可将5万次调用降至数百次,显著提升帧率。核心原则:减少调用、复用资源、批量操作、部分更新。这套工程化方案是OpenGL性能优化的通用范式。
2026-09-19 15:47:34
307
原创 Android 地图渲染 float 存不下地理坐标:整数 + 小数的精度拆分方案
地图渲染中,浮点数精度不足导致坐标抖动。因 float 仅7位有效数字,大数值坐标(如几十万米)会丢失毫米级细节。解决方案是将坐标拆分为“整数部分(float)+ 四位小数(ushort)”两路存储,结合中心化渲染,使浮点运算仅处理数千米级偏移,显著提升精度。虽带宽增加2字节,但换来细腻线条,代价可控。该“分量拆分+范围缩小”策略可推广至时间戳、大ID等场景,是应对大数精度问题的通用解法。
2026-09-19 15:46:48
163
原创 Android 地图文字一放大就糊?SDF 距离场保住标注清晰度
本文详解SDF(有向距离场)文字渲染技术:通过预存字符到边缘的距离而非像素,实现任意缩放下边缘锐利。利用GPU实时计算平滑过渡,结合单通道图集与批量绘制,高效支持海量文字渲染,特别适用于地图标注等“大量、任意缩放、单色”场景,兼顾性能与清晰度。
2026-09-18 20:54:12
367
原创 Android 几何构造器的双栈机:链式 API 底层是怎么装配几何的
通过双栈机制(坐标栈与几何栈),链式几何构造器将嵌套结构的装配转化为压栈、弹栈的自然过程。points压入坐标,ring闭合后压入环,polygon按类型连续弹栈并反转顺序,自动实现外环在前、内环在后的正确组装。该设计巧妙利用栈的“先进后出”特性匹配几何嵌套层次,使代码优雅且不易出错,其思想可广泛应用于解析器、表达式求值等场景。
2026-09-18 20:53:29
299
android 代码主题背景
2017-01-22
android 开源库osmdroid绘制点线面(比例尺,缩小放大,导航图标等)
2017-04-26
android 模拟位置信息Location使用示例
2017-05-31
android 使用osmdroid 加载离线map格式数据以及地图网格
2017-02-25
android studio 编译aidl以及示例demo
2017-03-13
android asynctask的fragment更新UI(附线程管理)
2017-04-24
Android 水准仪(方向传感器)
2017-01-23
android osmdroid离线加载常用格式
2017-01-03
android usb转串口数据通信示例
2017-09-14
osmdroid 加载geopackage离线底图
2017-07-23
android Account账户管理完整代码
2017-08-16
android 使用zxing开源库生成二维码,扫描二维码
2016-09-03
pc端与android udp 通信实例
2016-12-18
android 使用服务读取串口数据实例
2017-01-08
android location 数据标准输出,原始输出和卫星状态的变化
2017-09-01
android studio gson插件自动生成实体类
2017-04-17
android location 数据标准输出,原始mnea输出和GpsStatus卫星状态的变化
2017-09-05
【移动应用开发】基于Android的披萨在线点餐App设计与实现
2025-08-10
基于Android的HealthPlan健康计划APP设计与实现
2025-08-10
为知笔记 Windows最新版本下载 (经典版)
2025-07-19
viewPageFragment(RadioGroup + viewpage + fragment 组合显示导航栏)
2025-03-19
Android 备忘录,记事本程序设计
2023-10-24
Android 自定义文件路径选择器
2018-08-19
arcgis for Android 100.2 常用测试项目
2018-06-16
android 使用Java库xstream示例
2017-10-09
proj4j库(Java版本)
2018-04-26
android studio 使用NDK和swig编译c++示例
2017-10-30
android swig编译工具下载
2017-10-31
android 生成wifi热点以及扫描连接wifi
2018-02-26
android activity生命周期示例代码
2017-09-21
osmdroid 在线加载谷歌瓦片
2017-12-22
android GreenDao3.2 版本示例程序
2017-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅