Skip to content

Commit 1fbfab3

Browse files
committed
backup: check if the given package can be backed up using ADB
If the package cannot be backed up using ADB, it falls back to "Internal data" and "External data". Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
1 parent 03342c5 commit 1fbfab3

7 files changed

Lines changed: 77 additions & 126 deletions

File tree

app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupItems.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package io.github.muntashirakon.AppManager.backup;
44

55
import static io.github.muntashirakon.AppManager.backup.BackupManager.KEYSTORE_PREFIX;
6-
import static io.github.muntashirakon.AppManager.backup.BackupManager.SOURCE_PREFIX;
76

87
import android.annotation.UserIdInt;
98

@@ -428,7 +427,8 @@ public Path getRulesFile() throws IOException {
428427
@NonNull
429428
public Path[] getSourceFiles() {
430429
String ext = CryptoUtils.getExtension(mCryptoMode);
431-
Path[] paths = getBackupPath().listFiles((dir, name) -> name.startsWith(SOURCE_PREFIX) && name.endsWith(ext));
430+
final String sourcePrefix = BackupUtils.getSourceFilePrefix(null);
431+
Path[] paths = getBackupPath().listFiles((dir, name) -> name.startsWith(sourcePrefix) && name.endsWith(ext));
432432
return Paths.getSortedPaths(paths);
433433
}
434434

app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import static io.github.muntashirakon.AppManager.backup.BackupManager.KEYSTORE_PLACEHOLDER;
77
import static io.github.muntashirakon.AppManager.backup.BackupManager.KEYSTORE_PREFIX;
88
import static io.github.muntashirakon.AppManager.backup.BackupManager.MASTER_KEY;
9-
import static io.github.muntashirakon.AppManager.backup.BackupManager.SOURCE_PREFIX;
109
import static io.github.muntashirakon.AppManager.backup.BackupManager.getExt;
1110
import static io.github.muntashirakon.AppManager.backup.BackupUtils.TAR_TYPES;
1211
import static io.github.muntashirakon.AppManager.compat.PackageManagerCompat.GET_SIGNING_CERTIFICATES;
@@ -246,18 +245,26 @@ public BackupMetadataV5 setupMetadataAndCrypto() throws CryptoException {
246245
metadata.versionName = mPackageInfo.versionName;
247246
metadata.versionCode = PackageInfoCompat.getLongVersionCode(mPackageInfo);
248247
metadata.apkName = new File(mApplicationInfo.sourceDir).getName();
249-
String[] dataDirs;
248+
String[] dataDirs = null;
250249
if (mBackupFlags.backupAdbData()) {
251-
mBackupFlags.removeFlag(BackupFlags.BACKUP_INT_DATA);
252-
mBackupFlags.removeFlag(BackupFlags.BACKUP_EXT_DATA);
253-
List<String> defaultDirs = BackupUtils.getDataDirectories(mApplicationInfo, false,
254-
false, mBackupFlags.backupMediaObb());
255-
dataDirs = new String[defaultDirs.size() + 1];
256-
for (int i = 0; i < defaultDirs.size(); ++i) {
257-
dataDirs[i] = defaultDirs.get(i);
250+
if (BackupCompat.isAppEligibleForBackupForUser(mUserId, mPackageName)) {
251+
mBackupFlags.removeFlag(BackupFlags.BACKUP_INT_DATA);
252+
mBackupFlags.removeFlag(BackupFlags.BACKUP_EXT_DATA);
253+
List<String> defaultDirs = BackupUtils.getDataDirectories(mApplicationInfo, false,
254+
false, mBackupFlags.backupMediaObb());
255+
dataDirs = new String[defaultDirs.size() + 1];
256+
for (int i = 0; i < defaultDirs.size(); ++i) {
257+
dataDirs[i] = defaultDirs.get(i);
258+
}
259+
dataDirs[defaultDirs.size()] = BackupManager.DATA_BACKUP_SPECIAL_ADB;
260+
} else {
261+
// ADB backup cannot be used.
262+
mBackupFlags.removeFlag(BackupFlags.BACKUP_ADB_DATA);
263+
mBackupFlags.addFlag(BackupFlags.BACKUP_INT_DATA);
264+
mBackupFlags.addFlag(BackupFlags.BACKUP_EXT_DATA);
258265
}
259-
dataDirs[defaultDirs.size()] = BackupManager.DATA_BACKUP_SPECIAL_ADB;
260-
} else {
266+
}
267+
if (dataDirs == null) {
261268
// Non-ADB backup: default
262269
dataDirs = BackupUtils.getDataDirectories(mApplicationInfo, mBackupFlags.backupInternalData(),
263270
mBackupFlags.backupExternalData(), mBackupFlags.backupMediaObb()).toArray(new String[0]);
@@ -304,7 +311,7 @@ private void backupIcon() {
304311

305312
private void backupApkFiles() throws BackupException {
306313
Path dataAppPath = OsEnvironment.getDataAppDirectory();
307-
final String sourceBackupFilePrefix = SOURCE_PREFIX + getExt(mMetadata.info.tarType);
314+
final String sourceBackupFilePrefix = BackupUtils.getSourceFilePrefix(getExt(mMetadata.info.tarType));
308315
Path sourceDir = Paths.get(PackageUtils.getSourceDir(mApplicationInfo));
309316
if (dataAppPath.equals(sourceDir)) {
310317
// APK located inside /data/app directory

app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ private static HashMap<String, List<BackupMetadataV5>> getAllMetadata() {
292292
return backupMetadata;
293293
}
294294

295+
@NonNull
296+
public static String getSourceFilePrefix(@Nullable String fullExtension) {
297+
if (fullExtension == null) {
298+
return BackupManager.SOURCE_PREFIX;
299+
}
300+
return BackupManager.SOURCE_PREFIX + fullExtension;
301+
}
302+
295303
@NonNull
296304
public static String getDataFilePrefix(int index, @Nullable String fullExtension) {
297305
if (fullExtension == null) {

app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,17 @@
33
package io.github.muntashirakon.AppManager.backup.convert;
44

55
import static io.github.muntashirakon.AppManager.backup.BackupManager.CERT_PREFIX;
6-
import static io.github.muntashirakon.AppManager.backup.BackupManager.SOURCE_PREFIX;
76
import static io.github.muntashirakon.AppManager.backup.BackupManager.getExt;
87
import static io.github.muntashirakon.AppManager.utils.TarUtils.DEFAULT_SPLIT_SIZE;
9-
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_BZIP2;
10-
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_GZIP;
11-
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_ZSTD;
128

139
import android.annotation.UserIdInt;
1410
import android.os.UserHandleHidden;
1511
import android.text.TextUtils;
1612

1713
import androidx.annotation.NonNull;
1814

19-
import com.github.luben.zstd.ZstdOutputStream;
20-
2115
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
2216
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
23-
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
24-
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
2517
import org.json.JSONException;
2618
import org.json.JSONObject;
2719

@@ -282,7 +274,7 @@ private void backupApkFile() throws BackupException {
282274
} catch (Exception ignore) {
283275
}
284276
// Backup APK file
285-
String sourceBackupFilePrefix = SOURCE_PREFIX + getExt(mDestMetadata.info.tarType);
277+
String sourceBackupFilePrefix = BackupUtils.getSourceFilePrefix(getExt(mDestMetadata.info.tarType));
286278
Path[] sourceFiles;
287279
try {
288280
sourceFiles = TarUtils.create(mDestMetadata.info.tarType, baseApkFile, mBackupItem.getUnencryptedBackupPath(), sourceBackupFilePrefix,
@@ -338,21 +330,8 @@ private void backupData() throws BackupException {
338330
String dataBackupFilePrefix = BackupUtils.getDataFilePrefix(i++, getExt(tarType));
339331
try (ZipInputStream zis = new ZipInputStream(new BufferedInputStream(files[0].openInputStream()));
340332
SplitOutputStream sos = new SplitOutputStream(mBackupItem.getUnencryptedBackupPath(), dataBackupFilePrefix, DEFAULT_SPLIT_SIZE);
341-
BufferedOutputStream bos = new BufferedOutputStream(sos)) {
342-
OutputStream os;
343-
switch (tarType) {
344-
case TAR_GZIP:
345-
os = new GzipCompressorOutputStream(bos);
346-
break;
347-
case TAR_BZIP2:
348-
os = new BZip2CompressorOutputStream(bos);
349-
break;
350-
case TAR_ZSTD:
351-
os = new ZstdOutputStream(bos);
352-
break;
353-
default:
354-
throw new BackupException("Invalid compression type: " + tarType);
355-
}
333+
BufferedOutputStream bos = new BufferedOutputStream(sos);
334+
OutputStream os = TarUtils.createCompressedStream(bos, tarType)) {
356335
try (TarArchiveOutputStream tos = new TarArchiveOutputStream(os)) {
357336
tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
358337
tos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);

app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
package io.github.muntashirakon.AppManager.backup.convert;
44

55
import static io.github.muntashirakon.AppManager.backup.BackupManager.CERT_PREFIX;
6-
import static io.github.muntashirakon.AppManager.backup.BackupManager.SOURCE_PREFIX;
76
import static io.github.muntashirakon.AppManager.backup.BackupManager.getExt;
87
import static io.github.muntashirakon.AppManager.utils.TarUtils.DEFAULT_SPLIT_SIZE;
9-
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_BZIP2;
10-
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_GZIP;
11-
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_ZSTD;
128

139
import android.annotation.SuppressLint;
1410
import android.annotation.UserIdInt;
@@ -22,12 +18,8 @@
2218
import androidx.annotation.NonNull;
2319
import androidx.core.content.pm.PackageInfoCompat;
2420

25-
import com.github.luben.zstd.ZstdOutputStream;
26-
2721
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
2822
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
29-
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
30-
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
3123

3224
import java.io.BufferedInputStream;
3325
import java.io.BufferedOutputStream;
@@ -187,7 +179,7 @@ private void backupApkFile() throws BackupException {
187179
}
188180
// Backup APK files
189181
String[] apkFiles = ArrayUtils.appendElement(String.class, mDestMetadata.metadata.splitConfigs, mDestMetadata.metadata.apkName);
190-
String sourceBackupFilePrefix = SOURCE_PREFIX + getExt(mDestMetadata.info.tarType);
182+
String sourceBackupFilePrefix = BackupUtils.getSourceFilePrefix(getExt(mDestMetadata.info.tarType));
191183
Path[] sourceFiles;
192184
try {
193185
// We have to specify APK files because the folder may contain many
@@ -227,22 +219,9 @@ private void backupData() throws BackupException {
227219
String dataBackupFilePrefix = BackupUtils.getDataFilePrefix(i++, getExt(tarType));
228220
try (ZipInputStream zis = new ZipInputStream(new BufferedInputStream(dataFile.openInputStream()));
229221
SplitOutputStream sos = new SplitOutputStream(mBackupItem.getUnencryptedBackupPath(), dataBackupFilePrefix, DEFAULT_SPLIT_SIZE);
230-
BufferedOutputStream bos = new BufferedOutputStream(sos)) {
222+
BufferedOutputStream bos = new BufferedOutputStream(sos);
223+
OutputStream os = TarUtils.createCompressedStream(bos, tarType)) {
231224
// TODO: 31/5/21 Check backup format (each zip file has a comment section which can be parsed as JSON)
232-
OutputStream os;
233-
switch (tarType) {
234-
case TAR_GZIP:
235-
os = new GzipCompressorOutputStream(bos);
236-
break;
237-
case TAR_BZIP2:
238-
os = new BZip2CompressorOutputStream(bos);
239-
break;
240-
case TAR_ZSTD:
241-
os = new ZstdOutputStream(bos);
242-
break;
243-
default:
244-
throw new BackupException("Invalid compression type: " + tarType);
245-
}
246225
try (TarArchiveOutputStream tos = new TarArchiveOutputStream(os)) {
247226
tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
248227
tos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);

app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/TBConverter.java

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package io.github.muntashirakon.AppManager.backup.convert;
44

55
import static io.github.muntashirakon.AppManager.backup.BackupManager.CERT_PREFIX;
6-
import static io.github.muntashirakon.AppManager.backup.BackupManager.SOURCE_PREFIX;
76
import static io.github.muntashirakon.AppManager.backup.BackupManager.getExt;
87
import static io.github.muntashirakon.AppManager.utils.TarUtils.DEFAULT_SPLIT_SIZE;
98
import static io.github.muntashirakon.AppManager.utils.TarUtils.TAR_BZIP2;
@@ -19,16 +18,12 @@
1918
import androidx.annotation.NonNull;
2019
import androidx.annotation.Nullable;
2120

22-
import com.github.luben.zstd.ZstdOutputStream;
23-
2421
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
2522
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
2623
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
2724
import org.apache.commons.compress.compressors.CompressorInputStream;
2825
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
29-
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
3026
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
31-
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
3227

3328
import java.io.BufferedInputStream;
3429
import java.io.BufferedOutputStream;
@@ -222,7 +217,7 @@ private void backupApkFile() throws BackupException {
222217
} catch (Exception ignore) {
223218
}
224219
// Backup APK file
225-
String sourceBackupFilePrefix = SOURCE_PREFIX + getExt(mDestMetadata.info.tarType);
220+
String sourceBackupFilePrefix = BackupUtils.getSourceFilePrefix(getExt(mDestMetadata.info.tarType));
226221
Path[] sourceFiles;
227222
try {
228223
sourceFiles = TarUtils.create(mDestMetadata.info.tarType, baseApkFile, mBackupItem.getUnencryptedBackupPath(), sourceBackupFilePrefix,
@@ -276,41 +271,15 @@ private void backupData() throws BackupException {
276271
if (intBackupFilePrefix != null) {
277272
intSos = new SplitOutputStream(mBackupItem.getUnencryptedBackupPath(), intBackupFilePrefix, DEFAULT_SPLIT_SIZE);
278273
BufferedOutputStream bos = new BufferedOutputStream(intSos);
279-
OutputStream cos;
280-
switch (tarType) {
281-
case TAR_GZIP:
282-
cos = new GzipCompressorOutputStream(bos);
283-
break;
284-
case TAR_BZIP2:
285-
cos = new BZip2CompressorOutputStream(bos);
286-
break;
287-
case TAR_ZSTD:
288-
cos = new ZstdOutputStream(bos);
289-
break;
290-
default:
291-
throw new BackupException("Invalid compression type: " + tarType);
292-
}
274+
OutputStream cos = TarUtils.createCompressedStream(bos, tarType);
293275
intTos = new TarArchiveOutputStream(cos);
294276
intTos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
295277
intTos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);
296278
}
297279
if (extBackupFilePrefix != null) {
298280
extSos = new SplitOutputStream(mBackupItem.getUnencryptedBackupPath(), extBackupFilePrefix, DEFAULT_SPLIT_SIZE);
299281
BufferedOutputStream bos = new BufferedOutputStream(extSos);
300-
OutputStream cos;
301-
switch (tarType) {
302-
case TAR_GZIP:
303-
cos = new GzipCompressorOutputStream(bos);
304-
break;
305-
case TAR_BZIP2:
306-
cos = new BZip2CompressorOutputStream(bos);
307-
break;
308-
case TAR_ZSTD:
309-
cos = new ZstdOutputStream(bos);
310-
break;
311-
default:
312-
throw new BackupException("Invalid compression type: " + tarType);
313-
}
282+
OutputStream cos = TarUtils.createCompressedStream(bos, tarType);
314283
extTos = new TarArchiveOutputStream(cos);
315284
extTos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
316285
extTos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);

0 commit comments

Comments
 (0)