Project Overview
AndroidUtilCode is a Java utility library for Android that bundles several hundred helper methods across 200+ purpose-built utility classes. If you have ever written boilerplate to get screen density, check network connectivity, format a date, or hash a string, this library has already done it for you.
Blankj started the project in 2016, and it grew to 33,000+ stars, making it one of the most-starred Android utility collections on GitHub. As of mid-2026 the commit cadence has slowed, with most utility classes stable and only occasional additions. Treat it as a mature, low-churn dependency rather than a fast-moving framework. The license is Apache 2.0, so commercial use is unrestricted.
Key Challenges Addressed
Android development generates a lot of repeated low-level code. AndroidUtilCode targets the specific pain points:
- Context threading everywhere: Many Android APIs require a
Context. AndroidUtilCode'sUtils.init(app)registers the Application context once so every utility method can access it internally — you stop threadingContextthrough every call site. - Permission boilerplate: Checking and requesting runtime permissions across Android versions requires version guards and callback management.
PermissionUtilshandles the branching for you. - Inconsistent device APIs: Screen size, density, navigation bar height, and status bar height vary by device and OS version.
ScreenUtils,BarUtils, andDeviceUtilsencapsulate the correct detection logic per Android version. - Common but unsafe operations: File I/O, encryption, and shell execution have well-known failure modes — encoding mismatches, wrong key lengths, missing escaping. The utility classes address these consistently.
- Toast and Log management: Android's
ToastandLogAPIs need lifecycle awareness and thread-safety.ToastUtilsroutes to the main thread automatically;LogUtilsadds level filtering and output formatting.
Getting Started
Add the JitPack repository to your root build.gradle:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
Then add the dependency in your app module:
dependencies {
implementation 'com.blankj:utilcodex:1.31.1'
}
Initialize in your Application class:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Utils.init(this);
}
}
After that, every utility class is accessible without passing Context.
Sharp edges to know before you go further:
- If you call any utility before
Utils.init()completes, you get aNullPointerExceptiondeep inside the library with no message pointing to the missing initialization. Always initialize inApplication.onCreate(), not in an Activity or Fragment. - If you use R8 with aggressive shrinking, some reflection-dependent classes like
AppUtilsandPhoneUtilscan lose methods silently. Run your full test suite against a release build before shipping. ShellUtils.execCmd()runs arbitrary shell commands as the current user. Passing unsanitized user input to it is a command injection vulnerability. Never pass user-controlled strings to that method.
Features and Use Cases
AndroidUtilCode is organized by domain. Here are the categories worth knowing:
String and data
StringUtils, RegexUtils, EncodeUtils, EncryptUtils, and ConvertUtils cover encoding, symmetric and asymmetric encryption (AES, DES, RSA), hashing (MD5, SHA family), base64, and common string transformations. Useful for building local auth flows or display formatting without pulling in separate crypto libraries.
Files and storage
FileUtils, PathUtils, SDCardUtils, and CacheDiskStaticUtils handle reading, writing, copying, and deleting files across internal and external storage. The cache utilities implement a size-bounded disk cache backed by plain files — good for storing small blobs without introducing SQLite overhead.
UI helpers
KeyboardUtils, ScreenUtils, BarUtils, SizeUtils, and ViewUtils handle pixel/dp conversion and window insets that nearly every Android UI needs. Particularly useful when building layouts that must account for soft navigation bars across device generations.
App and device information
AppUtils exposes version name, version code, installed package info, and APK export. DeviceUtils gives manufacturer, model, and SDK version in a consistent format — handy for enriching crash reports.
Network and connectivity
NetworkUtils lets you check connection type (WiFi, mobile, offline) and test basic reachability. It is not an HTTP client — pair it with OkHttp or Retrofit for actual requests.
Threading
ThreadUtils provides named thread pools and a main-thread poster. It handles most scheduling needs without requiring RxJava.
Ecosystem and Dependencies
AndroidUtilCode has minimal mandatory dependencies. Most of the library is pure Java with Android SDK calls — there is no forced inclusion of OkHttp, Retrofit, or RxJava, so your APK does not bloat automatically.
In practice, projects using AndroidUtilCode also reach for:
- Glide for image loading — AndroidUtilCode's
ImageUtilscovers bitmap manipulation but not disk-cached async loading from URLs. - Timber alongside
LogUtilswhen you need structured log trees and pluggable backends like Crashlytics. - LeakCanary in debug builds for memory leak detection — nothing in AndroidUtilCode covers this.
If you are migrating to Kotlin, AndroidX KTX extension functions overlap significantly with AndroidUtilCode's UI and context utilities (dp.toPx(), Context.getColor(), etc.). On a greenfield Kotlin project, audit KTX coverage before adding AndroidUtilCode as a dependency.
Architectural Overview
The library uses a static-method, utility-class pattern throughout. Every class is a final class with a private constructor and only static methods. The shared Application context registered at Utils.init() is stored in a static field and accessed internally by all utility classes.
This design has two practical consequences:
No dependency injection required. You can call NetworkUtils.isConnected() from a ViewModel, a background service, or a broadcast receiver without constructor injection. Convenient, but it also means you cannot swap implementations for testing.
Unit testability is limited. The static design makes mocking Android APIs harder. If testability matters to your team, wrap the specific utilities you depend on behind an interface and inject that interface instead.
The library ships as a single AAR. There is no multi-module Gradle setup that lets you pull in only the file utilities or only the encryption classes. R8 and ProGuard will strip unused code at build time, but you accept the full transitive dependency footprint at the Gradle level.
Pros and Cons
Pros
- Covers an unusually wide range of Android utility needs in one dependency, reducing the number of small single-purpose libraries to track.
- Consistent API style across all utility classes: static methods, no configuration objects, predictable naming.
- Apache 2.0 license with no commercial restrictions.
- Inline Javadoc on every public method, with documentation available in both English and Chinese.
- Single initialization call — no per-utility setup.
Cons
- Static-method design makes unit testing difficult. Utility calls are not mockable without PowerMock or Mockito inline mocking, both of which add test build complexity.
- Commit cadence has slowed since 2023. Bug fixes land, but new Android API coverage — predictive back gestures, Android 15 permission models — may lag behind platform releases.
- Not Kotlin-first. The API works from Kotlin but offers no extension functions, coroutine-aware methods, or Flow integration. The static Java API feels out of place in idiomatic Kotlin codebases.
- No modular dependency — you take the whole library even if you use three utility classes. R8 mitigates this but the footprint is visible at dependency resolution time.
ShellUtilsandRootUtilsinclude shell execution helpers that introduce security risk if misused. There is no built-in input sanitization.
Comparison and Alternatives
GitHub stars
Weekly star gains
Full metrics details
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
AndroidUtilCode
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Issues opened
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
AndroidUtilCode
GitHub API observation. Historical values render only when the source provides a real observation for that day.
163 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub API observation. Historical values render only when the source provides a real observation for that day.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub API observation. Historical values render only when the source provides a real observation for that day.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub API observation. Historical values render only when the source provides a real observation for that day.
144 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub API observation. Historical values render only when the source provides a real observation for that day.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Issues closed
Weekly total
Full metrics details
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
AndroidUtilCode
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
163 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
144 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests opened
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
AndroidUtilCode
GitHub API observation. Historical values render only when the source provides a real observation for that day.
163 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub API observation. Historical values render only when the source provides a real observation for that day.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub API observation. Historical values render only when the source provides a real observation for that day.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub API observation. Historical values render only when the source provides a real observation for that day.
144 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub API observation. Historical values render only when the source provides a real observation for that day.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests closed
Weekly total
Full metrics details
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
AndroidUtilCode
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
163 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
144 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests merged
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
AndroidUtilCode
GitHub API observation. Historical values render only when the source provides a real observation for that day.
163 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub API observation. Historical values render only when the source provides a real observation for that day.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub API observation. Historical values render only when the source provides a real observation for that day.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub API observation. Historical values render only when the source provides a real observation for that day.
144 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub API observation. Historical values render only when the source provides a real observation for that day.
178 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Open/closed pull request ratio
Weekly average
Full metrics details
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
AndroidUtilCode
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Open/closed issues ratio
Weekly average
Full metrics details
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
AndroidUtilCode
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Releases
Weekly total
Full metrics details
GitHub release published_at events bucketed by UTC day; drafts are excluded.
AndroidUtilCode
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
google/guava
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Timber
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Glide
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
LeakCanary
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hotness score
Weekly average
Full metrics details
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
AndroidUtilCode
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
google/guava
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Timber
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Glide
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
LeakCanary
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Reliability score
Weekly average
Full metrics details
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
AndroidUtilCode
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
google/guava
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Timber
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Glide
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
LeakCanary
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
No single alternative covers AndroidUtilCode's full breadth, but these libraries overlap substantially and are worth evaluating before committing:
| Project | Repo | Hotness (~6mo) | PRs merged (~6mo) | Star growth (~6mo) |
|---|---|---|---|---|
| AndroidUtilCode | https://github.com/Blankj/AndroidUtilCode | 6.28 | 0 | 266 |
| Guava | https://github.com/google/guava | 86.54 | 336 | 928 |
| Timber | https://github.com/JakeWharton/timber | metrics pending | 0 | 10 |
| Glide | https://github.com/bumptech/glide | 6.65 | 47 | 342 |
| LeakCanary | https://github.com/square/leakcanary | 70.30 | 7 | 359 |
| PermissionsDispatcher | https://github.com/permissions-dispatcher/PermissionsDispatcher | metrics pending | 0 | metrics pending |
google/guava is the best overall alternative. It is actively maintained by Google, has comprehensive test coverage and well-known stability guarantees, and works across both Android and JVM targets — making it the safer long-term dependency even though it omits Android-specific helpers like BarUtils and ToastUtils.
Conclusion
AndroidUtilCode is the right choice for Java Android projects that need broad utility coverage without juggling a dozen single-purpose libraries. Java teams maintaining large existing codebases will find the most immediate return — the official repository documents every available method with inline Javadoc.
Do not call any utility method before Utils.init(this) runs in your Application class — the failure is a silent NullPointerException with no stack frame pointing at the missing initialization call. Start by adding Utils.init(this) to your Application, then validate it immediately by calling AppUtils.getAppVersionName() and checking the return value before building anything else on top.
