Add Samsung Bixby Routines Support for Samsung Android - #1157
Conversation
|
Test data is now included for every changed artifact module. Thank you! |
|
Test data has been provided for the artifact module along with fixture. |
|
Thanks for this, and thanks for including the test fixtures and a real run rather than a mock harness. Reviewed at 3d04d69. The three artifacts run clean, the case files pass the gate, lint and the claim language checker are clean, and the icons all resolve. Excluding A few things to fix before this goes in. The module reads each database once per storage spelling, not once per Android user. A full file system extraction carries the same app directory under
Swapping
The WAL note is backwards. Measured on your fixture:
The bare file has more rows, not fewer. On forensic value, the tables you skipped are where the value is. Everything parsed here had rows on your device, and everything with real evidentiary weight was empty, which makes sense because that device had no routines configured. But empty is a reason to report a checked absence, not to leave the table out:
Two smaller notes. One thing worth keeping in the notes because it is good corroboration: I have a patch with all of the above plus the four extra artifacts, baselines re-recorded and the gate green at 7 of 7. Happy to send it over or push it to a branch, whichever is easier for you. Good work on this, the hard part is already done. |
|
Feel free to push it to the branch. I appreciate your help with this. Thank you. |
…bles Reads each routine.db once per Android user instead of once per storage spelling. The glob matches data/data, data/user/<n> and the data_mirror views of the same directory, so on a full file system extraction the rows were reported two or three times. Measured on a tree holding the three user 0 spellings plus a second Android user: the Service Log reported 190 rows where 90 is correct, and App Preferences 55 where 25 is correct. Source paths now name every container the rows came from, and a Source Path column is added when more than one container contributed, so a row on a multi-user device can be attributed to its user profile. Adds four artifacts for tables the module did not read: - Routine Run History (routine_running_history): a routine name and id against a timestamp. - Routine Conditions (condition_instance) and Routine Actions (action_instance): the per-routine trigger and action wiring, joined to routine on routine_id. - Saved Places (location_history): coordinates with address, locality and keyword, with KML output. All four hold no rows in the tested extraction, so their sample_data records a checked absence and their notes say the column meanings come from the table definition rather than from decoded rows. Corrects two statements in the artifact metadata. routine_extra is a TEXT column of the routine table, not a separate table, and the trigger and action wiring is in condition_instance and action_instance. The service log notes now state that routine_history is a rolling buffer, that the window it covers is set by service write volume rather than by the acquisition period, and that reading the database without its write-ahead log yields a different row set rather than a smaller one. Undocumented integers are reported as stored. Test cases and baselines re-recorded for all seven artifacts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
I went ahead and pushed the patch to this branch as a8e2c32 rather than send it separately, so it is all in one place. Your commit is untouched underneath it. It does the storage view collapse, joins the source paths and adds a Source Path column for multi-user devices, corrects the Author fields now read Thanks again, this was a good find and a well-put-together first pass. |
Summary
Adds a new ALEAPP module,
samsungBixbyRoutines.py, coveringcom.samsung.android.app.routines/databases/routine.db(Samsung's BixbyRoutines automation app). No existing parser touches this database.
The module registers three artifacts, all under a new "Bixby Routines"
category:
routinetable,the only table that holds user-authored automations (name, icon, favorite/
notification flags, toggle time). Empty on the device this was tested
against, but the module still runs and reports 0 rows rather than being
silently absent, since a device with actively used Routines would have
real data here.
routine_history, aninternal timestamped log kept by the Routines background service (job
scheduling, metaloader/catalog-update events, widget callbacks). LEFT
JOINs against
routineto resolve a routine name ifroutine_ideverpoints to a real row; on the tested device every row carried
routine_id = -1; so this resolves to blank there. Documented in the artifact notesas service telemetry, not evidence of a specific automation firing.
preferencekey/value table. A fixed set of keys confirmed (by inspection) to hold
epoch-millisecond timestamps (
init_time,latest_time,sleep_expired_time,update_noti_time) are additionally decoded into aConverted Timestamp column; every other key is reported as stored, not
guessed at.
The sibling
conditionandactiontables were deliberately excluded —they're Samsung's static, app-shipped catalog of available trigger/action
building blocks (same row shape on every device running the same app
build), not user data.
Testing
Verified end-to-end against a real Samsung Galaxy S21 Ultra (Android 11)
full filesystem extraction: installed ALEAPP's own requirements, ran the
unmodified
aleapp.pyCLI (-t fs) against the extractedroutine.db,and confirmed clean output with no errors — 0 user routines, 50 service
log rows, 15 preference rows, with timestamp columns converting correctly
(e.g.
init_time→ 2023-12-12 17:54:05 UTC).Note for reviewers: this database ships with a
routine.db-walfile inreal extractions.
open_sqlite_db_readonly'smode=roconnection alreadymerges it correctly (confirmed the row counts match a manual
.db + .db-walmerge) — no special handling was needed in the module, but it's worth
keeping in mind if anyone spot-checks this artifact against a bare copy of
just the
.dbfile, which will undercount.Co-authored-by: Claude Sonnet 5 (Anthropic)