iphone2android
iphone2android moves your data from an iPhone to an Android phone using an encrypted iPhone backup on your computer and adb to the new phone. It converts messages, call history, contacts, calendars and bookmarks into formats Android and Google import, copies photos and the media Google Photos does not keep, installs your apps, and rebuilds your iPhone home screen on the Android launcher.
Before you wipe the iPhone
Some things cannot be recovered from any backup, so move them while the iPhone still works.
- Authenticator apps. Export the accounts from the iPhone app (Google Authenticator has Transfer accounts) and scan them on Android.
- Passwords in the iCloud Keychain. A backup cannot decrypt them, because every item is also sealed with a key that never leaves the iPhone. Use a password manager or a Mac signed in to the same Apple ID to export them.
- Tickets and passes bound to the device (transit tickets, ski passes). Move them through the provider's account.
- Footage that exists only on the phone in apps such as action-camera apps.
Install
pip install iphone2android
You also need adb (brew install android-platform-tools on macOS) with USB debugging on in the phone's developer options.
1. Make an encrypted backup
In Finder (or iTunes on Windows) select the iPhone, choose "Back up all of the data on your iPhone to this Mac", tick "Encrypt local backup" and back up. Only an encrypted backup contains messages, call history and app data.
iphone2android backups # list the backups on this computer
iphone2android apps # the apps that were installed (no password needed)
On Windows, pass --backup-root "%APPDATA%\Apple Computer\MobileSync\Backup".
2. Extract and convert
iphone2android extract --inventory # asks for the backup password (or set IPHONE_BACKUP_PASSWORD)
iphone2android convert --out android-import
| File | Import it with |
|---|---|
sms_backup.xml, calls_backup.xml |
the SMS Backup & Restore app on the phone (Restore, then choose the file) |
contacts.vcf |
Google Contacts (Import) |
calendar.ics |
Google Calendar (Settings, Import & export) |
safari_bookmarks.html |
Chrome on a computer (Bookmarks, Import), then sync |
Apple sometimes saves the message database in the middle of a write, so the backup copy is shorter than its own header says and SQLite refuses to open it. convert corrects the header in a copy and reads what is there. If that is not enough and your sqlite3 has the .recover command, it uses that instead.
WhatsApp chats (ChatStorage.sqlite) need a dedicated iOS to Android WhatsApp migrator, and Apple Notes (NoteStore.sqlite) need an Apple Notes parser. extract copies both out for those tools.
3. Photos and media
iphone2android media camera-roll message-attachments photo-edits
Files are decrypted in batches, pushed to the phone and deleted, so the computer does not need room for the whole camera roll. If your photos are already in Google Photos, skip camera-roll. The other two are never in Google Photos (iMessage attachments, and the edited versions of photos).
4. Apps
Write a mapping from iPhone bundle ids to Android packages, using iphone2android apps for the list. label is the app's name in the Android app drawer.
{"net.whatsapp.WhatsApp": {"package": "com.whatsapp", "label": "WhatsApp"}}
Check every package before installing. Guessed package names are often wrong, because the Android package of a bank or a local app rarely matches its iOS bundle id.
iphone2android verify mapping.json
iphone2android install --mapping mapping.json
install opens each app's page in the Play Store app and presses Install, so it works for free apps only. Each app is checked as installed before the next one starts.
To remove preinstalled apps you do not want, list them in a file and run iphone2android debloat list.txt --keep-mapping mapping.json --dry-run, then again without --dry-run. Apps are removed for the current user only, and adb shell cmd package install-existing <package> brings one back.
5. Home screen
iphone2android extract # also copies IconState.plist
iphone2android layout extracted/IconState.plist --mapping mapping.json > layout.json
iphone2android build layout.json --state build.json --autofill
layout.json lists pages of apps and folders by their drawer name, which you can edit before building. The builder adds each app from the app drawer search, reads the screen again after every drop, and saves its progress so an interrupted build continues where it stopped. Then it puts each page in order one swap at a time, and finally turns the launcher's icon autofill on to close the gaps. Do not touch the phone while it runs.
Many launchers do not let adb change the layout directly (on ColorOS the launcher database and shortcut pinning are closed without root), so the builder moves icons through the screen the way a person does. It is tested on ColorOS 16 (OPPO Find X9 Pro). Other launchers name their menus differently and may need changes in android/launcher.py.
Limits
- Only an encrypted backup has messages and app data.
- Keychain passwords cannot be extracted (see above).
- Paid apps are not installed.
- The home screen builder is tested on one launcher.
Development
python -m venv .venv && .venv/bin/pip install -e '.[test]'
.venv/bin/pytest
The tests use synthetic databases, a fake decryptor, a fake adb and a simulated home screen, so they need no iPhone and no Android phone.
License
MIT. Backup decryption uses iOSbackup (LGPL).
Metadata
Release files for iphone2android 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| iphone2android-0.1.0.tar.gz | 29.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iphone2android-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.8 kB
Release files / iphone2android-0.1.0.tar.gz
| Download URL | iphone2android-0.1.0.tar.gz |
|---|---|
| Size | 29.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cae50a21a1c4bf1d60e98b48790ece193d5eb1de3003a3e0c573a5a58da3d462
|
|
BLAKE2b-256 checksum How to use checksums |
eee8e5d2aeaf64c4a8402630cf8cc7a5c8991b71da627e118c81ff83a507880f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency logRelease files / iphone2android-0.1.0-py3-none-any.whl
| Download URL | iphone2android-0.1.0-py3-none-any.whl |
|---|---|
| Size | 25.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ff431c13c71aff71274086bb089b14dea56f87d91a4da95af7b71ad2ccfdb5ba
|
|
BLAKE2b-256 checksum How to use checksums |
c60b0b9604fe5af5e52d9e351fdc156032f1be2cd6287737bba48d11f49b40ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency log