adb.adb commands once. - An Android phone with a working USB cable and a computer with Android Platform Tools (adb) installed.
- F-Droid installed on the phone (F-Droid is a free, open-source app store that distributes APK builds without Google Play).
- A Google account you can still log into from a browser, to export contacts (.vcf) and calendar (.ics).
- Free local storage for the APK set and the export files.
- The exact minimum Android version for each app: check it on the app's F-Droid page — do not guess.

adb on the computer. Check with adb version — any recent Platform Tools release works.adb devices
adb shell pm list packages | grep -i google > google-packages-before.txt
adb devices must list your serial number followed by device — if it says unauthorized, unlock the phone and accept the "Allow USB debugging?" dialog.
Why: the package list is your rollback map. If you disable something and an app starts crashing, you re-enable exactly that package name instead of reinstalling the ROM.
How to check: cat google-packages-before.txt returns lines such as package:com.google.android.apps.photos. An empty file means the phone was not connected — fix the cable or the authorization before continuing.

What to do: open F-Droid, search for Fossify, and install the apps you want to replace. If the search returns nothing, open F-Droid → Settings → Repositories and add the Fossify repository using the URL published on the Fossify project site — copy it from the official page, never type it from memory.
Fossify apps are local-first by design: Gallery, File Manager, Notes, Clock and Music Player read files and media stored on the device, so they have nothing to talk to Google about. Contacts, Phone, Messages and Calendar hold Android roles — system-level assignments that tell Android which app handles calls, SMS, and so on.
Example: install the APKs manually over adb instead of tapping through the store:
adb install -r FossifyGallery.apk
adb install -r FossifyContacts.apk
adb install -r FossifyPhone.apk
adb install -r FossifyMessages.apk
adb install -r FossifyCalendar.apk
Expected output for each: Success. The -r flag means "replace an existing install, keep its data".
Why: installing through F-Droid gives you builds signed by the project and automatic update notifications. Manual adb install is the fallback when the phone has no store access at all — the same technique used for any private APK, see How to Publish a Private App on Google Play and Install It on Android.
How to check: list what actually landed on the device:
adb shell pm list packages | grep -i fossify
Expected output (order varies):
package:org.fossify.calendar
package:org.fossify.contacts
package:org.fossify.gallery
package:org.fossify.messages
package:org.fossify.phone
Package IDs follow the org.fossify.<app> pattern — confirm the exact string from this command before you use an ID in any later command.
| Google app | Fossify replacement | Typical package ID | What it does without Google |
|---|---|---|---|
| Google Photos | Fossify Gallery | `org.fossify.gallery` | Browses, edits and deletes local photos and videos |
| Google Contacts | Fossify Contacts | `org.fossify.contacts` | Reads contacts from the phone's local store; import from `.vcf` |
| Google Phone | Fossify Phone | `org.fossify.phone` | Places and answers calls, holds the DIALER role |
| Google Messages | Fossify Messages | `org.fossify.messages` | Sends and receives SMS/MMS, holds the SMS role |
| Google Calendar | Fossify Calendar | `org.fossify.calendar` | Local events; `.ics` import |
| Google Keep | Fossify Notes | `org.fossify.notes` | Plain local notes |
| Files by Google | Fossify File Manager | `org.fossify.filemanager` | Local file browsing, copy, rename |
| Google Clock | Fossify Clock | `org.fossify.clock` | Alarms, timers, they fire offline |
What to do: Android only lets one app be the default dialer and one be the default SMS app, so you must hand those roles over explicitly.
On the phone, the GUI path is Settings → Apps → Default apps → Phone app / SMS app. The equivalent commands:
adb shell cmd role add-role-holder android.app.role.DIALER org.fossify.phone
adb shell cmd role add-role-holder android.app.role.SMS org.fossify.messages
Then move the data:
1. Google Contacts (web) → Export → download contacts.vcf → push it to the phone with adb push contacts.vcf /sdcard/Download/ → in Fossify Contacts open the menu and choose the import option.
2. Google Calendar (web) → Settings → Export → download the .ics → adb push calendar.ics /sdcard/Download/ → import it in Fossify Calendar.
3. Photos and files stay where they are; Fossify Gallery and File Manager read the same /sdcard/DCIM and /sdcard/Download folders.
Why: a role is not a preference — until the SMS role is assigned, incoming messages are handled by the previous app, or by nothing at all if you already disabled it. Export/import works because .vcf and .ics are plain text formats that any contact or calendar app can read, with no account involved.
Example: disable the Google apps you have replaced, one at a time:
adb shell pm disable-user --user 0 com.google.android.apps.photos
adb shell pm disable-user --user 0 com.google.android.apps.messaging
Expected output: Package com.google.android.apps.photos new state: disabled-user. To undo, run the identical command with pm enable instead of pm disable-user.
How to check: print the disabled set and look for the packages you just turned off:
adb shell pm list packages -d | grep -i google
If a package you disabled is missing from the output, the command failed — read the message it returned before continuing. Do not disable packages with google in the name that you cannot identify; core framework packages can break the launcher.

What to do: run the phone in airplane mode for the whole check, so no Google service can silently fill in for a missing feature.
adb shell cmd role get-role-holders android.app.role.SMS
adb shell cmd role get-role-holders android.app.role.DIALER
Why: these commands report what Android itself thinks the default apps are — not what the settings screen claims. Airplane mode proves the app stores data locally instead of pulling it from an account.
Example: expected output is a single line per role, for example:
org.fossify.messages
org.fossify.phone
If the output lists a Google package or is empty, re-run the add-role-holder command from Step 2.
How to check — final acceptance list:
What still needs Google or an account: anything that reads a Google account directly — account sync, Play Store purchases, Play Services push notifications, and apps built on Google's location or maps SDKs. Those apps either refuse to start or show a message such as Google Play services not available. Fossify apps do not replace Maps, YouTube or the Play Store itself; for those you need a different tool, and calendar/contact sync to a server needs a CalDAV/CardDAV client (check the Fossify documentation for the supported import and sync options).
Problem. Reinstall fails on an app you already had from another source
Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package org.fossify.contacts signatures do not match previously installed version; ignoring!]adb uninstall org.fossify.contacts
adb install -r FossifyContacts.apk
Problem. adb install is rejected the moment the phone screen is unlocked
adb: failed to install FossifyGallery.apk: Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]adb install -r FossifyGallery.apk.Problem. APK installed from a file manager is refused
Blocked by Play Protect — the dialog offers "Install anyway" only after you expand the details.You now have a working local-first app set with the dialer and SMS roles assigned, contacts and calendar imported from export files, and Google packages disabled with a rollback list saved in google-packages-before.txt. From here, extend the same pattern offline — for example with How to Run an AI Model Locally on Android: Apps and Setup — and keep updates flowing through F-Droid instead of the Play Store.
Does Fossify work without Google Play at all?
Yes. Fossify apps are distributed as APKs through F-Droid, install without a Google account, and their local features (gallery, files, notes, clock, calls, SMS) run with no Play Services installed.
Do I need root to remove Google apps?
No. pm disable-user --user 0 <package> disables an app for the current user over adb without root. Root is only needed to delete system packages from the system partition, which is not required for this guide.
Will I lose my Google contacts and calendar events?
Not if you export first. Contacts export to .vcf and calendar to .ics from the web interface, and both files import into the Fossify apps; keep the exports until you have confirmed the data on the phone.
How do I get updates without the Play Store?
Through F-Droid: it checks its repositories and notifies you about new builds of the apps you installed from it, and you install them with the same signature so existing data stays in place.