Skip to main content

ARFT (Android Robust File Transfer): robust resumable Android file transfer over ADB with atomic operations, resuming, cached discovery and progress reporting.

Project description

arft

arft stands for Android Robust File Transfer.

It provides robust Android file-by-file transfer over ADB with resumable behavior, atomic writes, lazy remote metadata fetching, cached remote file discovery, and tqdm progress reporting for checking, metadata prefetch, and transfer.

It was tested on Android 10 and Windows 11 Pro.

Features

  • atomic operations (ie, crashing in the middle of a file download ensures it will get redownloaded on resuming)
  • resumes safely and fast after interruption
  • resumes downloading even if provided with a partial download started with another app or manually (ie, can be used to incrementally update a backup, previously downloaded files will be checked and only newer/different files will be updated/added)
  • never exposes partial files as completed output
  • validates file size and optionally SHA-256
  • preserves timestamps as closely as Android exposes them
  • caches the discovered remote file list to speed up later restarts
  • can rebuild its local bookkeeping state from an already partially downloaded folder
  • supports --refresh-file-list to append newly discovered files without forcing full re-copy
  • supports --force-all to refresh discovery and re-copy everything
  • supports --skip-all-checks for the fastest possible resume when you trust already-downloaded files
  • supports --verbose to log every issued ADB command

Installation or updating

First you need to download and unzip the latest version of ADB (part of Google's Platform Tools).

Secondly you need a Python interpreter. Miniconda is awesome and small.

Thirdly you need to enable USB debugging = adb debugging on your Android phone (so you need to enable the Developer options).

Fourthly, you can then install arft using:

pip install --upgrade arft

Usage

As a module

python -m arft \
  --adb-path "C:\platform-tools\adb.exe" \
  --remote-root "/storage/emulated/0/DCIM" \
  --local-root "D:\AndroidBackup\DCIM"

As a console script

arft \
  --adb-path "C:\platform-tools\adb.exe" \
  --remote-root "/storage/emulated/0/DCIM" \
  --local-root "D:\AndroidBackup\DCIM"

Common options

  • --verbose: log every issued ADB command into the console and .arft.log
  • --verify-hash: enable SHA-256 verification after size verification
  • --refresh-file-list: refresh the cached remote file list but still skip already complete local files
  • --force-all: refresh the remote file list and re-copy all files
  • --check-all-files: strictly revalidate already-downloaded files against the phone before skipping them; if combined with --verify-hash, this also re-checks hashes for those files
  • --skip-all-checks: trust any already-present local file immediately and skip all existing-file validation checks; this takes precedence over --check-all-files and resume-time hash checking
  • --exclude REGEXP: exclude remote relative paths matching a Python regular expression before metadata prefetch, checking, dry-run output, and transfer planning
  • --dry-run: print planned files without copying them

Excluding subpaths with regular expressions

--exclude uses a regular expression that is applied to each remote relative path. This is useful for skipping generated media caches or app metadata folders anywhere under the chosen remote root.

Example:

arft \
  --adb-path "C:\platform-tools\adb.exe" \
  --remote-root "/storage/emulated/0" \
  --local-root "D:\AndroidBackup" \
  --exclude "(\.thumbnails|\.Gallery2)"

That example excludes any remote relative path containing either .thumbnails or .Gallery2.

Bookkeeping files created in --local-root

ARFT creates a few hidden bookkeeping files in the destination folder so it can resume safely and quickly:

  • .arft-local-sync-state.json: the local sync state manifest. It records which files were already completed successfully, along with the locally known size and timestamp metadata used for fast resume decisions.
  • .arft-remote-files-list.json: the cached recursive remote file list. It lets ARFT skip the expensive remote re-listing step on later runs unless you use --refresh-file-list or --force-all.
  • .arft-failed-files.tsv: a tab-separated list of files that failed during the run, together with the failure reason.
  • .arft.log: the persistent run log. With --verbose, it also contains every issued ADB command prefixed with ADB CMD:.

Resume and recovery behavior

  • Normal resume is fast by default: if .arft-local-sync-state.json says a file already finished successfully and the local file still matches the saved local size, ARFT skips it without querying the phone again.
  • --check-all-files restores a stricter mode where existing local files are revalidated against remote metadata before they are skipped.
  • --skip-all-checks is the fastest mode: any already-existing local file is trusted immediately.
  • If the destination folder already contains downloaded payload files but the local sync state file is missing, ARFT automatically rebuilds its state and behaves as if --check-all-files were enabled for that bootstrap run.

License

Published under the opensource MIT License.

Author

This project was developed by Stephen Karl Larroque with agentic AI (OpenCode + Oh-My-Openagent harness/agentic orchestration system with the model OpenAI ChatGPT Codex-5.3).

Alternatives

  • ADB Explorer which offers a much more features complete GUI, but it fails with large files/folders and is much slower (this is why this script was made).
  • better-adbsync, a rsync-like tool to synchronize files between Android and a desktop computer.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arft-0.6.0.tar.gz (20.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arft-0.6.0-py3-none-any.whl (17.7 kB view details)

Uploaded Python 3

File details

Details for the file arft-0.6.0.tar.gz.

File metadata

  • Download URL: arft-0.6.0.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for arft-0.6.0.tar.gz
Algorithm Hash digest
SHA256 08692be9568044bccc0f7d628242e207e6a2cdca47728338a7fc3c538867e5e6
MD5 4e4e91519c32bb0206f380fa02e035f6
BLAKE2b-256 969ac73d9a1e68bf1363b41708eec406fe1ae3e224db462c88066b0d07e63c59

See more details on using hashes here.

File details

Details for the file arft-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: arft-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 17.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for arft-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f80d98e542a7f815d8adb22a7f5d7eb07cdf1845685a4b43dad751bc44096514
MD5 d2a6bcf7b1b9eb43cdaa0b4adf33fbbb
BLAKE2b-256 37b5d25e92d0276f32ea2d055e8192982e87bdf0192b6a33a3efc578304684d1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page