01Location
- /data/system_ce/<userId>/accounts_ce.db
- /data/system_de/<userId>/accounts_de.db
- /data/system/users/<userId>/accounts.db (pre-N single database, migrated)
02Questions it answers
- Which accounts (e.g. email, cloud, messaging) were registered on the device?
- Were accounts added, removed or renamed recently, and by which caller UID?
- When was a password last entered for an account?
03Format and versions
| Format | SQLite databases managed by AccountsDb. CE: accounts (name, type, password), authtokens, extras. DE: accounts (_id, name, type, previous_name, last_password_entry_time_millis_epoch), grants, visibility, shared_accounts, meta and debug_table. |
|---|---|
| Applies to | Releases before Android N used a single accounts.db (PRE_N_DATABASE_VERSION 9); current code migrates it into the DE/CE pair. Credential-encrypted (CE) storage is available only after the user unlocks the device. |
04Key fields
| Field | What it tells you |
|---|---|
| accounts.name / accounts.type | Account identifier and authenticator type. |
| authtokens (CE) | Authentication tokens per account; treat as live credentials. |
| debug_table.action_type | Action string, e.g. action_account_add, action_account_remove, action_account_rename, action_set_password, action_sync_de_ce_accounts. |
| debug_table.caller_uid / table_name / _id | UID of the caller, affected table and row id. |
| accounts.previous_name (DE) | Earlier name of a renamed account. |
05Timestamps
| Field | Encoding | Note |
|---|---|---|
| last_password_entry_time_millis_epoch | Unix epoch, milliseconds | Last time a password was entered for the account. |
| debug_table.time | Text "yyyy-MM-dd HH:mm:ss", no time zone | Written with a SimpleDateFormat given no zone: a device wall-clock string. Report as text and state the assumed offset. |
Decode raw values with the Timestamp decoder and convert local wall-clock times with the Local time to UTC.
06Examination workflow
- Collect both DE and CE databases per user, plus any legacy accounts.db.
- List accounts from DE and CE and compare them.
- Order debug_table entries and map caller UIDs to packages.
- Interpret debug times as local wall-clock text, not UTC.
- Restrict and document handling of token and password columns.
07Interpretation pitfalls
- debug_table holds at most 64 rows and reuses the oldest slot, so older actions are overwritten.
- Debug rows can name account ids no longer in accounts; ALEAPP found 192 of 306 such rows across its test images.
- If only DE storage is available, CE-only tables (tokens, passwords) will be missing.
09Sources
- AOSP — AccountsDb.java Android Open Source Project (GitHub mirror) · checked 2026-10-14
- AOSP — AccountManagerService.java Android Open Source Project (GitHub mirror) · checked 2026-10-14
- AOSP — Environment.java Android Open Source Project (GitHub mirror) · checked 2026-10-14
- ALEAPP — scripts/artifacts/accounts_ce.py Alexis Brignoni et al. (GitHub) · checked 2026-10-14
- ALEAPP — scripts/artifacts/accounts_de.py Alexis Brignoni et al. (GitHub) · checked 2026-10-14
- Support Direct Boot mode Android Developers · checked 2026-10-14