Skip to content

AndroidUtil

CILicenseAPIKotlinJava

把现代 Android 开发里真正反复用到的工具,收成可依赖、默认可上架的库。

Kotlin 优先 · Java 可直接调用 · 按模块引入 · 私有存储 / 脱敏 / 无 IMEI·MAC · 面向 API 36

English · 迁移指南 · 架构边界 · 参与贡献

AndroidUtil 示例应用预览


一句话定位

你得到的你不会得到的
日志、崩溃落盘、权限、轻量 HTTP、剪贴板、键盘、网络状态、屏幕密度、触感、电池、存储、Uri、通知渠道、防抖、编解码…又一套 Retrofit / Coil / 支付 / 埋点 / 大而全 UI 框架
可测、可注入、结果类型明确隐藏 API、Hook、公共目录写密钥
复制即用的 Kotlin / Java 示例「私人片段仓库」式无法编译的源码堆

安装

./gradlew publishToMavenLocal
dependencies {
implementation("io.github.cheng2016:androidutil-core:1.0.0-SNAPSHOT")
implementation("io.github.cheng2016:androidutil-network:1.0.0-SNAPSHOT")
implementation("io.github.cheng2016:androidutil-permissions:1.0.0-SNAPSHOT")
}
模块何时引入
core几乎所有 App:日志、崩溃、设备/屏幕/存储/剪贴板/…
network需要轻量 OkHttp 胶水,又不想上完整 Retrofit 时
permissions运行时权限 + Android 13+ 通知/媒体权限组

环境:minSdk 23 · compileSdk 36 · 构建需 JDK 17


能力全景(按场景选工具)

1. 稳定性与可观测

一句话亮点
AndroidUtilLogger线程安全日志文件默认关;开启后写入 {filesDir}/logs/
RedactingSanitizer日志脱敏自动遮盖 password / token / Authorization / Cookie
CrashHandler本地崩溃落盘显式 install{filesDir}/logs/crash/;链式系统处理器
AndroidUtilLogger.init(this, AndroidUtilLogger.Config(fileEnabled =true))
AndroidUtilLogger.setSanitizer(RedactingSanitizer)
CrashHandler.install(applicationContext)

2. 权限(androidutil-permissions

一句话亮点
PermissionRequesterActivity Result 权限无需转发 onRequestPermissionsResult
PermissionGroups按 SDK 展开权限组notifications() / images() / mediaAll()
PermissionStatus授权结果折叠Granted / Denied / PermanentlyDenied
privateval permissions =PermissionRequester.register(this)
permissions.request(*PermissionGroups.notifications()) { result ->when (result.status) {
PermissionStatus.Granted->UnitisPermissionStatus.Denied-> explain(it.permissions)
isPermissionStatus.PermanentlyDenied->Intents.appDetailsSettings(this)
}
}

3. 网络(androidutil-network + core 状态)

一句话亮点
AndroidHttpClient可取消 OkHttp 胶水suspend + Java *Async;可注入客户端
HttpResult四种明确结果Success / HttpFailure / NetworkFailure / Cancelled
RedactingLoggingInterceptor诊断日志默认 NONE;脱敏头与 token 字段
NetworkStatus连通性快照/监听NetworkCapabilities;不读 SSID/MAC
val client =AndroidHttpClient()
when (val r = client.get("https://example.com")) {
isHttpResult.Success-> r.body
isHttpResult.HttpFailure->"HTTP ${r.code}"isHttpResult.NetworkFailure-> r.cause.message
HttpResult.Cancelled->null
}
val sub =NetworkStatus.observe(this) { snap ->// snap.online / validated / wifi / cellular / vpn
}
// onDestroy: sub.close()

4. 系统交互与 UI 胶水

一句话亮点
ClipboardHelper剪贴板API 33+ isSensitive 弱化预览
SoftInput软键盘显隐show / hide / toggle
Toasts轻提示Application Context;可 cancel 上一条
Haptics触感震动VibrationEffect,兼容新旧 API
TextSpans富文本拼接链式 bold / color / size
Intents常用系统跳转分享、设置页、浏览器、拨号、邮件;失败返回 false
NotificationChannels通知渠道API 26+ ensure 一键创建
ClipboardHelper.setText(this, token, isSensitive =true)
SoftInput.hide(this)
Toasts.short(this, "已复制")
Haptics.tick(this)
Intents.shareText(this, "试试 AndroidUtil")
NotificationChannels.ensure(this, "msg", "消息")

5. 屏幕 / 设备 / 进程 / 电源 / 存储

一句话亮点
ScreenMetricsdp/sp/px · 屏宽高 · 深色模式Context.dp() 扩展
DeviceProfile机型摘要 IMEI/MAC/广告 ID
ProcessInfo主进程判断多进程初始化时常用
BatteryStatus电量/充电快照USB / AC / 无线
StorageSpace可用空间internal / externalApp
AppInfo包名/版本/应用名只读宿主元数据
val pad = dp(16)
if (ScreenMetrics.isDarkMode(this)) { /* ... */ }
if (ProcessInfo.isMainProcess(this)) CrashHandler.install(this)
val space =StorageSpace.internal(this)
Toasts.short(this, ByteSize.format(space.freeBytes) +" 可用")

6. 存储与配置

一句话亮点
PreferencesSharedPreferences 薄封装一律 apply();可 wrap
ResourceReaderassets / raw自动关流;Properties 便捷读取
UriFilescontent Uri显示名/大小/MIME;拷贝到 cache

7. 文本 / 校验 / 摘要 / 编解码 / 时间

一句话亮点
RegexUtils / RegexConstants手机号·邮箱·身份证…匹配 / 提取 / 替换
DigestUtilsSHA-256 / MD5MD5 仅非安全场景
EncodingUtilsBase64 / HexURL_SAFE 可选
ByteSize1.5 MB人类可读
TimeFormats相对时间 · 时长「3分钟前」/ mm:ss
VersionUtils版本比较isAtLeast("2.1.0", "2.0.0")
LunarDate公历→农历生肖 / 干支 / 闰月

8. 并发与交互节奏

一句话亮点
MainThread主线程投递run / post / postDelayed / Executor
Debouncer防抖按钮连点杀手
Throttler节流滑动/传感器场景
val debounce =Debouncer(600)
button.setOnClickListener {
if (debounce.tryAcquire()) submit()
}
MainThread.postDelayed(300) { refresh() }

Java 一样好用

CrashHandler.install(context);
Preferencesprefs = Preferences.of(context);
ClipboardHelper.setText(context, "secret", "token", true);
Stringdig = DigestUtils.sha256Hex("AndroidUtil");
client.getAsync(url, result -> { /* OkHttp 线程回调 */ });

完整互操作见 JavaExamples.java,可运行演示见 :sample


设计原则(为什么值得信赖)

  1. 默认可上架:私有目录、敏感剪贴板标记、日志脱敏、无隐藏 API。
  2. UI 归属宿主:工具层不抢 Activity 生命周期;Toast 仅轻提示。
  3. 可测试:网络可注入;纯函数工具有单测;公开 API 有 binary-compatibility 门禁。
  4. 不重复造轮子:图片用 Coil/Glide,列表网络用 Retrofit,崩溃云端用 Crashlytics/Sentry——本库与之并存,不替代。

详见 架构与边界。从旧 util/ 片段迁移见 迁移指南

构建

./gradlew spotlessCheck check apiCheck assembleRelease

许可证

Copyright 2018–2026 Cheng Zhenjia · Apache License 2.0

About

android 私人工具类集合

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages