I have this peculiar situation where unpacking and repacking an Android backup tarball changes the entries in it, resulting in the backup file being unusable.

To make things simpler for the reader, here are the files in the tarballs

└── net.daylio
    ├── db
    │   └── entries.db
    ├── f
    │   └── .Fabric
    │       └── io.fabric.sdk.android:fabric
    │           └── com.crashlytics.settings.json
    └── sp
        └── net.daylio_preferences.xml

Now, tar -t on the original archive yields something like this.


However, the repackaged tarball represents the files in a different way:


(In reality there are more files in the tallballs but I'm not listing them all here. Here is the full output. I would have made a Minimal Reproducable tarball matching the original structure if I knew how to, hence I'm asking this question)

Note the differences:

  1. The re-archived tarball appends slashes to the end of directories
  2. The sorting order differs. The new tarball sorts alphabetically, the original one doesn't.
  3. The new archive has an individual entry for each level of the directory hierarchy. In contrary, the original archive omits seemingly randomly some of the directory entries. For example it has an explicit entry for directory apps/net.daylio/f/.Fabric but not for apps/net.daylio/db

The files in it are still the same and the two archives show up the same in an archive manager. However, it is a problem because the re-archived tarball cannot be restored back to the Android device, it won't work with the different directory structure, for whatever reason.

My personal goal is to get the re-archived tarball to work on my Android phone. For that, I think I need the new tarball to resemble the original tarball's structure as closely as possible;

  1. No trailing slashes for directories
  2. Individual directory entries only for apps/net.daylio/f/.Fabric and its subdirectories

Question: How do you create a tar archive in a way that respects these two criterias?

For 1) I tried adding --xform "s,/$,," argument to tar, thinking that it would match slashes at the end of a line and remove them, however, that xform parameter doesn't change anything. In an effort to get to 2) I also tried to remove every individual directory entry with --exclude "*/", though that didn't do anything either.

Sites I've looked at during my own research:

  • That looks like the differences between the output of different tar implementations, not that the contents are significantly different.
    – muru
    Commented Oct 11, 2019 at 7:14
  • Yes, I had that thought too. Android seems to depend on that specific tar format though, unfortunately. It won't accept my backup anymore if I extract and re-archive the contents.
    – kangalio
    Commented Oct 11, 2019 at 7:20
  • 2
    In that case you should examine how the original backup was made. Maybe you aren't preserving some attribute when you re-archive.
    – muru
    Commented Oct 11, 2019 at 7:22
  • 1
    That was a good tip, thank you. Turns out the order of the files is essential. Source: github.com/nelenkov/android-backup-extractor section "Packing tar archives". I should have RTFM of the tools I use ;)
    – kangalio
    Commented Oct 11, 2019 at 7:30
  • So now you can post an answer!
    – muru
    Commented Oct 11, 2019 at 7:49


You must log in to answer this question.

Browse other questions tagged .