Open Source / ALEAPP #1783

Samsung Smart Switch transfer history

When someone moves to a new Samsung phone, Smart Switch copies their contents across and keeps notes about the transfer. Those notes say what kind of device sent the data, which categories moved and when. ALEAPP did not read them. Eight artifacts now do, and this post gives the counts we saw and the images where we saw nothing.

  • Daniel Addai, SectraTEK Lab
  • Merged
  • Merged 25 October 2026
  • CC BY 4.0

Summary

This contribution adds one module, samsungSmartSwitch.py, with eight artifacts for Samsung Smart Switch (com.sec.android.easyMover): transfer sessions, transferred data categories, the other device's app and category list, its accounts, its message and contact counts, the transferred history list, and the backup media index. It produces one set of rows per Android user and reads the duplicate storage views of one file once.

On four Android 16 images the numbers were uneven: 2, 0, 1 and 1 sessions. One image held the app but no history folder. Among the other research images, ten Samsung images carry some Smart Switch data and none holds a history folder, a transfer list or a backup media database, so all eight artifacts report no rows on them. The rows described here come from Android 16 only.

  • 8New artifacts
  • 5Source file kinds
  • +1,594Lines added in 21 files
  • 8New synthetic test cases

The issue

A phone that arrived by transfer rather than by a fresh set-up raises a question: where did its contents come from? Samsung's Smart Switch is the app that moves data between phones, and it keeps notes about each session in its own data folder. ALEAPP had no artifact for them, so a report said nothing either way.

The notes are not hard to open by hand, but there are many of them: one folder per session with up to three JSON files, a list of transferred entries, and a database with thousands of rows. Reading raw JSON for categories, counts and peer fields is slow, and two properties make it error-prone. Newer files drop keys that older files held, so a reader written against one image shows blank columns on another. And a phone with more than one Android user holds a copy of the app data per user.

There is also a trap on the empty side. The app was present on some phones without any history at all, so an absent folder is not evidence that no transfer took place. Figure 1 shows where the records sit and which artifact reads which file.

Where Samsung Smart Switch keeps its records and which artifact reads each fileStorage layout. Five files in the Smart Switch data folder feed eight artifacts: mainDataModel.json to Transfer Sessions; peerDeviceInfo.json to the device description and four peer lists; objItems.json to Transferred Data Categories; List.json to Transferred History; backup_media.db to the Backup Media Table.Files in com.sec.android.easyMoverArtifactsfiles/History/<id>/mainDataModel.jsonsession state of one transferTransfer Sessionsone row per history folderfiles/History/<id>/peerDeviceInfo.jsonthe other device: model, apps, accounts, countsDevice description and listsPeer App Categories, Peer Accounts,Peer Message Counts,Peer Contact Accountsfiles/History/<id>/objItems.jsondata categories, status, counts, sizesTransferred Data Categoriesone row per categoryfiles/TransferredHistory/List.jsonentries with an identifier and a timeTransferred Historyone row per entryfiles/SmartSwitch/SmartSwitchBackup/backup_media.dbtable bkmedia, a media indexBackup Media Tableone row per bkmedia rowEach History folder is one session; its name is a number that reads as epoch milliseconds. Diagram, no values.
Show this figure as a table
Figure 1 as a table
FileArtifact or artifacts
files/History//mainDataModel.jsonTransfer Sessions
files/History//peerDeviceInfo.jsonTransfer Sessions (device fields), Peer App Categories, Peer Accounts, Peer Message Counts, Peer Contact Accounts
files/History//objItems.jsonTransferred Data Categories (and Item Count in Transfer Sessions)
files/TransferredHistory/List.jsonTransferred History
files/SmartSwitch/SmartSwitchBackup/backup_media.dbBackup Media Table
Figure 1The storage layout of the app, from file to artifact. One folder per transfer session; one list; one database. Source: ALEAPP pull request 1783, scripts/artifacts/samsungSmartSwitch.py (paths and artifact list; diagram, no values).

The essence

The module reads each Smart Switch file into its own artifact and keeps the values as stored. A session is one history folder, identified by the Android user and the folder name, which is a number that reads as epoch milliseconds and is shown as UTC. The other device's description, its lists of apps and accounts, and its message and contact counts come from the peer file in the same folder, exactly as that file wrote them. They are not checked against the other device.

The eight artifacts
ArtifactSource in the app folderOne row perNotable fields
Transfer Sessionsthe three JSON files of a history folderhistory foldersession state values as stored; peer device description; account and item counts
Transferred Data CategoriesobjItems.json, ItemListdata categorystatus, view and content counts, sizes, restore and backup results
Peer App CategoriespeerDeviceInfo.json, CategoryInfoExtralisted app or componentpackage, version, last time used in UTC, runtime permission count
Peer AccountspeerDeviceInfo.json, AccountInfosaccount entrytype and name as stored
Peer Message CountspeerDeviceInfo.json, MessagePeriodsperiodSMS, MMS and RCS counts and sizes as stored
Peer Contact AccountspeerDeviceInfo.json, two contact listscontact accountaccount, type, counts and sizes
Transferred HistoryTransferredHistory/List.jsonentryidentifier, display name, time in UTC
Backup Media Tablebackup_media.db, table bkmediarowname, file path, backup file path, size, unique id, count

Our methodology

We began by mapping the files. Across the Android 16 images that held data, the same JSON files carried different keys: Connect Type, Product Code, Predicted Backup Time, Restore Step, Backup Result, Backup Step, Backup Error and, on one image, the message counts were absent from newer files. So the parser treats every key as optional and reads a missing one as blank. A folder that lacks one of its three files is still reported, with that file's columns empty.

Keys were next. A session is the pair of Android user and History ID. The user comes from the path: data/data counts as user 0, and the user, user_de and mirror forms carry their own numbers. Duplicate storage views of one file are read once. Times are converted from milliseconds to UTC and blank when absent or zero, and the time columns are moved to the front of each report.

Checking took five forms. An independent script, with no ALEAPP code, parsed the JSON files and counted the bkmedia rows and gave the same numbers as the artifacts. Figures in the notes, such as 32 and 11 categories in two sessions, 29 with a status of COMPLETED and 3 with NODATA, 118 apps, 8 accounts and 6 message periods per session, were re-derived from the raw JSON. The tool's output checker found columns that held one value on every row, for example Android User on a single-user image, and Restore Error and Backup Error that were identical because the file stores the same text in both objects. We wrote these into the notes instead of leaving the reader to wonder. A synthetic tree built by a fixture script, with invented values, an all-zero IMEI and a placeholder identifier, covers user 0, its mirror and user 10, with six new unit tests that pass. And a doubling test on a tree built from the real files read all eight artifacts exactly double.

One check failed, and we kept it. On the synthetic tree, seven of eight artifacts doubled, but Transfer Sessions went from 3 rows to 4 instead of 6, because the fixture already holds a user 10 folder with the same History ID, so the restaged copy lands on it. The pull request records this as a known failure with the arithmetic. The suite otherwise passed 140 cases with no failure.

We also left things out on purpose. Galaxy Wearable data was examined and not built, because its databases were empty. Newer images carry result fields that this module does not report, and the notes say so. Figure 2 shows the steps; Figure 3 shows the counts per image.

How the Smart Switch files are read, from file to report columnsFour steps: find the history files, list and backup database; set the Android user and the History ID from the path, reading duplicate storage views once; read defensively so absent keys read blank; report with time columns first.Find the filesHistory JSON files,List.json andbackup_media.dbSet the keysAndroid user from path;data/data is user 0;duplicate views read oncesession = user + folderRead defensivelya key absent from anewer file reads blank;a folder missing oneof three files is keptReporttime columns first,milliseconds to UTC,booleans as Yes or No,values as storedMeanings of the stored values are not decoded; the notes say so for each field.Diagram of the parser steps in samsungSmartSwitch.py; no values are shown.
Show this figure as a table
Figure 2 as a table
StepWhat the parser does
Find the filesmainDataModel.json, peerDeviceInfo.json, objItems.json, List.json, backup_media.db
Set the keysAndroid user from the path; data/data is user 0; a session is a user and a History ID; duplicate views are read once
Read defensivelyabsent keys read blank; a folder missing a file is still reported
Reporttime columns first; milliseconds to UTC; booleans as Yes or No
Figure 2From file to report. Defensive reading is what lets one parser work on images whose files carry different keys. Source: ALEAPP pull request 1783, scripts/artifacts/samsungSmartSwitch.py (diagram of the steps).
Rows per artifact on four Android 16 research imagesCoverage matrix of row counts. Transfer Sessions 2, 0, 1, 1; Transferred Data Categories 43, 0, 92, 65; Peer App Categories 236, 0, 97, 66; Peer Accounts 16, 0, 7, 10; Peer Message Counts 12, 0, 6, 6; Peer Contact Accounts 12, 0, 0, 6; Transferred History 1, 0, 1, 1; Backup Media Table 5,169, 0, 0, 0.Android 16 images, rows per imageImage 1Image 2Image 3Image 4Transfer Sessions2011Transferred Data Categories4309265Peer App Categories23609766Peer Accounts160710Peer Message Counts12066Peer Contact Accounts12006Transferred History1011Backup Media Table5,169000Image 2 holds the appbut no History folder,so every artifactreports no rows.Ten other Samsungimages, Android 10 to 15:seven with the app folder,three with only theAgent package. None hasa History folder.rows were readno rowsMessage and contact figures are rows (periods and accounts), not messages or contacts. Real aggregate counts.
Show this figure as a table
Figure 3 as a table
ArtifactImage 1Image 2Image 3Image 4
Transfer Sessions2011
Transferred Data Categories4309265
Peer App Categories23609766
Peer Accounts160710
Peer Message Counts (rows)12066
Peer Contact Accounts (rows)12006
Transferred History1011
Backup Media Table5,169000
Figure 3Row counts per artifact and image. Backup Media Table is the only artifact with thousands of rows, and it held rows on one image only. Source: ALEAPP pull request 1783 body (counts confirmed with an independent script) and artifact notes; real aggregate counts, not synthetic.

The value

For an examiner the module turns a folder tree into answers to concrete questions. Was a Smart Switch session recorded on this phone, and how many? Which data categories did it list, with what status and counts? What did the other device describe itself as, and which apps and accounts did it list? Is there a media index, and how large? A session folder is an indicator that the app recorded a transfer session. It does not prove that a category moved in full, and a category missing from the list is not evidence that its data was absent from the other device.

The records carry personal identifiers, including an identifier, a display name, an account and a device number. The Lab publishes the structure and the counts, never a value. Figure 4 shows, with invented times, how an examiner can line up a folder name with the transferred list entry; on one real image the later folder name fell within one second of the entry's time. The parser does not make that match, and what event a folder name marks is not established.

A synthetic timeline: two Smart Switch history folders and a TransferredHistory entryTimeline with invented times. Folder one at 09:12:40, folder two at 10:41:02.9, and a TransferredHistory entry at 10:41:03.4, half a second after folder two. The parser reports each separately and does not make the match.timeHistory folder 1name reads as 09:12:40(synthetic time)History folder 2name reads as 10:41:02.9(synthetic time)TransferredHistory entryTime 10:41:03.4 (synthetic)same identifier as in both peer files0.5 s apart in this exampleTimes and identifier are invented. In the real image the later folder name was within one second of the entry's Time.
Show this figure as a table
Figure 4 as a table
RecordTime (synthetic)
History folder 109:12:40
History folder 210:41:02.9
TransferredHistory entry10:41:03.4
Figure 4How a reader can line up the three records. The parser reports each artifact on its own; the match is the examiner's step. Source: synthetic example with invented times; the one-second observation is from the notes of smartswitch_sessions and smartswitch_transferred_history in the diff.

Where this sits in the Lab's research

No Lab report is devoted to this store; the method above comes from the pull request. It is one of five case studies in Lab Technical Report LAB-TR-0006, Section 7.1 and Table 8, which gives the same counts per image (sessions 2, 0, 1, 1; categories 43, 0, 92, 65; backup media 5,169, 0, 0, 0) and lists as not verified the One UI versions before 7. That report also describes the doubling test used here.

Cite as: Addai, D. (2026). Empty Is Not Absent: Silent Failure Modes in Open-Source Mobile Forensic Parsers on iOS 26 and Android 16. LAB-TR-0006, version 1.0, preprint. doi:10.5281/zenodo.23717929.

Sources

Every number and claim on this page, and where it comes from. Figures marked synthetic example use invented values.

Sources for the numbers and claims in this post
Number or claimWhere it comes from
Merged 25 October 2026; 21 files, +1,594 and -1 linesPull request 1783 metadata (mergedAt, files, additions, deletions)
Eight artifacts, five source file kindsPR body, What this changes; diff, __artifacts_v2__ in samsungSmartSwitch.py
Sessions 2 / 0 / 1 / 1; categories 43 / 0 / 92 / 65; peer apps 236 / 0 / 97 / 66; accounts 16 / 0 / 7 / 10; message rows 12 / 0 / 6 / 6; contact rows 12 / 0 / 0 / 6; history 1 / 0 / 1 / 1; backup media 5,169 / 0 / 0 / 0PR body, first checklist item; LAB-TR-0006 Table 8
Image 2 holds the app but no History folderPR body, first checklist item
Seven Samsung images with the app folder (Android 10, 13, 14, 15), three with only the Agent package (Android 11, 13); none has History, List.json or backup_media.dbDiff, notes of smartswitch_sessions
One UI versions before 7 not verifiedPR body, first checklist item; LAB-TR-0006 Table 8
Keys absent from newer files: Connect Type, Product Code, Predicted Backup Time, Restore Step, Backup Result, Backup Step, Backup ErrorPR body, second checklist item; diff notes
32 and 11 categories, 29 COMPLETED and 3 NODATA, 118 apps, 8 accounts, 6 periods per session, re-derived from raw JSONPR body, fourth checklist item; diff notes
Independent script gives the same counts; doubling test reads all eight artifacts exactly doublePR body, first and third checklist items
Synthetic tree: invented values, all-zero IMEI, placeholder UUID; user 0, mirror, user 10; six new testsPR body, Anything reviewers should know and test record
Sessions 3 rows to 4 instead of 6 on the synthetic tree; KNOWN_FAIL=4; PASS=140, upstream 132, eight new casesPR body, test record table
Later folder name within one second of the TransferredHistory entry on the tested imageDiff, notes of smartswitch_sessions and smartswitch_transferred_history
Galaxy Wearable databases empty and not built; ContentBnrResult fields not reportedPR body, fourth checklist item and Anything reviewers should know
Figure 4 times and identifierSynthetic example, invented for illustration