AndroidUtilCode 详解:33k Star 的 Android 工具类库
做 Android 开发,几乎每个项目都要重复写一遍尺寸换算、吐司、日志、SP 存取、权限申请、文件读写、加解密等"样板代码"。AndroidUtilCode(作者 Blankj)正是为消灭这些重复劳动而生——它把 Android 开发里最常用的功能封装成一个个工具类,并配有完整 demo 与单元测试,是目前 GitHub 上最受欢迎的 Android 工具类库之一。本文从依赖初始化、工具类全景、常用 API 示例到工程亮点,系统拆解它的用法。
1、项目概述
AndroidUtilCode 的自我定位是:encapsulates the functions that commonly used in Android development which have complete demo and unit test——把常用功能封装成工具类,且每个都附带 demo 演示与单元测试。截至快照,仓库已有 33.6k Star、10.6k Fork,采用 Apache 2.0 协议,最低支持 API 14+。
两大模块:
- utilcode(主线,现已演进为 utilcodex):开发中高频使用的核心工具类
- subutil:使用频率较低,但仍能简化开发的补充工具类
覆盖范围(灰色列表,节选):
- Activity / Fragment 管理、状态栏、吐司、Snackbar、Spannable 文本
- 尺寸换算、屏幕信息、亮度、屏幕适配
- 文件 IO、SD 卡、Zip、缓存(内存 / 磁盘 / 双层)
- 加解密、编码、正则、时间、字符串、集合、反射
- 线程池、事件总线、运行时权限、网络、设备信息、键盘、震动、手电筒
2、依赖与初始化
新项目(AndroidX)应使用主线 utilcodex;老的非 AndroidX 版本 utilcode 仅维护到 1.30.7,已停止更新,不建议再用。
在模块的 build.gradle 中引入依赖:
// build.gradle(AndroidX 项目使用 utilcodex)
implementation 'com.blankj:utilcodex:1.31.1'
// 旧版非 AndroidX,已停止维护,新项目勿用
// implementation 'com.blankj:utilcode:1.30.7'
然后在自定义 Application 的 onCreate 里全局初始化:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Utils.init(this); // 全局初始化,工具类内部据此获取 ApplicationContext
}
} 上手步骤:
1. 在模块 build.gradle 引入 utilcodex 依赖并同步
2. 写一个继承 Application 的类,在 onCreate 调用 Utils.init(this)
3. 在 AndroidManifest.xml 的 application 标签配置 android:name 指向该类
4. 之后即可在任意位置直接调用各 XxxUtils,无需再传 Context
3、工具类全景
utilcodex 提供 70 余个工具类,按领域可大致归为以下几组。
UI 与视图:
- ActivityUtils、FragmentUtils、BarUtils、ToastUtils、SnackbarUtils、SpanUtils、ShadowUtils、ViewUtils、ColorUtils
尺寸与屏幕:
- SizeUtils、ConvertUtils、ScreenUtils、AdaptScreenUtils、BrightnessUtils
设备与系统:
- DeviceUtils、PhoneUtils、VibrateUtils、FlashlightUtils、VolumeUtils、NotificationUtils、RomUtils
文件与 IO:
- FileUtils、FileIOUtils、PathUtils、SDCardUtils、ZipUtils、CloseUtils、ResourceUtils
数据与存储:
- SPUtils(实例)/ SPStaticUtils(静态)、CacheMemoryUtils / CacheDiskUtils / CacheDoubleUtils(及对应 Static 版)、GsonUtils
时间、字符串与数值:
- TimeUtils、StringUtils、RegexUtils、NumberUtils
安全、编码与并发:
- EncryptUtils(MD5 / SHA / AES / RSA / DES 等)、EncodeUtils、ThreadUtils、BusUtils、UiMessageUtils
反射、权限与其他:
- ReflectUtils、CloneUtils、ObjectUtils、CollectionUtils、PermissionUtils、IntentUtils、UriUtils、ShellUtils、ImageUtils、CrashUtils、ApiUtils 等
4、常用 API 示例:UI 与存储
这一组覆盖日常最高频的吐司、SP、日志、尺寸与时间需求。
// Toast:免传 Context,直接弹
ToastUtils.showShort("Hello, AndroidUtilCode!");
ToastUtils.showLong("长 Toast");
// SharedPreferences:按文件名取实例,链式存取
SPUtils.getInstance("my_sp").put("username", "blankj");
String name = SPUtils.getInstance("my_sp").getString("username");
// 日志:可设全局 tag,自动格式化对象 / JSON
LogUtils.getConfig().setGlobalTag("MyApp");
LogUtils.d("debug message");
// 尺寸换算:dp / sp 转 px
int px = ConvertUtils.dp2px(16);
int spPx = ConvertUtils.sp2px(14);
// 时间:毫秒转字符串、判断是否今天
String now = TimeUtils.millis2String(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss");
boolean today = TimeUtils.isToday(System.currentTimeMillis()); 要点:
1. ToastUtils.showShort / showLong 无需 Context,一行弹出
2. SPUtils.getInstance(name) 按文件名隔离存储,put / get 链式调用
3. LogUtils 通过 getConfig() 设全局 tag,并支持对象、JSON 的格式化输出
4. ConvertUtils.dp2px / sp2px 做尺寸换算(旧版 SizeUtils 同名方法等价)
5. TimeUtils 提供毫秒与字符串互转、今天判断、时区转换等一整套时间工具
5、常用 API 示例:设备、网络与权限
这一组聚焦与系统打交道的权限、网络与软键盘。
// 运行时权限:链式声明 + 回调
PermissionUtils.permission(PermissionConstants.CAMERA, PermissionConstants.STORAGE)
.callback(new PermissionUtils.SimpleCallback() {
@Override
public void onGranted() { /* 全部授权 */ }
@Override
public void onDenied() { /* 有权限被拒 */ }
})
.request();
// 网络:是否联网、是否 Wi-Fi
boolean connected = NetworkUtils.isConnected();
boolean isWifi = NetworkUtils.isWifiConnected();
// 软键盘:对指定 EditText 弹出 / 对 Activity 收起
KeyboardUtils.showSoftInput(editText);
KeyboardUtils.hideSoftInput(activity); 要点:
1. PermissionUtils.permission(...) 声明所需权限,链式 callback + request 发起申请
2. 回调里按 onGranted / onDenied 分别处理授权与拒绝分支
3. NetworkUtils 一行判断联网状态与是否 Wi-Fi,省去手写 ConnectivityManager
4. KeyboardUtils 直接对 EditText / Activity 控制软键盘显隐
5. 配合 DeviceUtils、ScreenUtils、RomUtils 可获取设备型号、屏幕参数与厂商 ROM 判断
6、设计哲学与工程亮点
AndroidUtilCode 能长期保持高人气,靠的不只是"全",更是几条贯穿始终的工程纪律。
工程亮点:
- 完整 demo + 单元测试:每个工具类都附演示与单测,行为可复现、质量可控
- 静态与实例双版本:如 SPUtils(实例)与 SPStaticUtils(静态),按需取舍
- 缓存四件套:内存 / 磁盘 / 双层 × 静态 / 实例,覆盖不同缓存语义
- 统一 Utils.init 初始化:工具类内部自取 ApplicationContext,调用处免传 Context
- ApiUtils:以注解 + 抽象方法的形式统一管理网络接口,便于规范请求层
- AndroidX 演进:主线迁至 utilcodex,旧 utilcode 仅作历史维护
7、使用建议与注意事项
使用建议:
- 新项目直接用 utilcodex(AndroidX),不要再引入已停维的 utilcode
- 用 LogUtils.getConfig() 关闭 release 日志、设置全局 tag,避免线上信息泄漏
- 权限、文件、网络等敏感操作仍需自行处理失败分支与用户提示
- 优先查文档复用现成工具类,避免重复造轮子
注意事项:
- 部分工具(如 ShellUtils、某些设备信息)依赖特定权限或 root,使用前确认
- ProGuard / R8 混淆时,反射类与 ApiUtils 生成的类需按需补充 keep 规则
- 整体引入会增加方法数与包体,对体积极敏感的场景可按需裁剪
- 关注 CHANGELOG,跨大版本升级时偶有 API 变更
8、总结
AndroidUtilCode 以 33.6k Star 成为 Android 生态最受欢迎的工具类库之一。它用 70 余个工具类覆盖 UI、尺寸、设备、文件、存储、安全、线程、权限等领域,通过统一的 Utils.init 初始化让调用处免传 Context,每个类都配有 demo 与单元测试,并把主线演进到 AndroidX 版的 utilcodex。
对于 Android 开发者,把它当作项目的"标准件库"——引入 utilcodex、在 Application 完成初始化,日常开发优先查阅它的 API 而非重复造轮子;同时遵循日志开关、权限失败分支、混淆规则等注意事项,是提升开发效率与代码质量的必要基建。