@@ -644,28 +644,38 @@ class AppsProvider with ChangeNotifier {
644
644
var somethingInstalled = false ;
645
645
try {
646
646
MultiAppMultiError errors = MultiAppMultiError ();
647
+ List <File > APKFiles = [];
647
648
for (var file in dir.extracted
648
649
.listSync (recursive: true , followLinks: false )
649
650
.whereType <File >()) {
650
651
if (file.path.toLowerCase ().endsWith ('.apk' )) {
651
- try {
652
- somethingInstalled = somethingInstalled ||
653
- await installApk (
654
- DownloadedApk (dir.appId, file), firstTimeWithContext,
655
- needsBGWorkaround: needsBGWorkaround,
656
- shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
657
- } catch (e) {
658
- logs.add (
659
- 'Could not install APK from XAPK \' ${file .path }\' : ${e .toString ()}' );
660
- errors.add (dir.appId, e, appName: apps[dir.appId]? .name);
661
- }
652
+ APKFiles .add (file);
662
653
} else if (file.path.toLowerCase ().endsWith ('.obb' )) {
663
654
await moveObbFile (file, dir.appId);
664
655
}
665
656
}
666
- if (somethingInstalled) {
657
+ APKFiles .sort ((a, b) {
658
+ if (a.uri.pathSegments.last.startsWith (dir.appId)) {
659
+ return - 1 ;
660
+ } else {
661
+ return 0 ;
662
+ }
663
+ });
664
+ try {
665
+ await installApk (
666
+ DownloadedApk (dir.appId, APKFiles [0 ]), firstTimeWithContext,
667
+ needsBGWorkaround: needsBGWorkaround,
668
+ shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
669
+ additionalAPKs: APKFiles .sublist (1 )
670
+ .map ((a) => DownloadedApk (dir.appId, a))
671
+ .toList ());
672
+ somethingInstalled = true ;
667
673
dir.file.delete (recursive: true );
668
- } else if (errors.idsByErrorString.isNotEmpty) {
674
+ } catch (e) {
675
+ logs.add ('Could not install APKs from XAPK: ${e .toString ()}' );
676
+ errors.add (dir.appId, e, appName: apps[dir.appId]? .name);
677
+ }
678
+ if (errors.idsByErrorString.isNotEmpty) {
669
679
throw errors;
670
680
}
671
681
} finally {
@@ -677,7 +687,8 @@ class AppsProvider with ChangeNotifier {
677
687
Future <bool > installApk (
678
688
DownloadedApk file, BuildContext ? firstTimeWithContext,
679
689
{bool needsBGWorkaround = false ,
680
- bool shizukuPretendToBeGooglePlay = false }) async {
690
+ bool shizukuPretendToBeGooglePlay = false ,
691
+ List <DownloadedApk > additionalAPKs = const []}) async {
681
692
if (firstTimeWithContext != null &&
682
693
settingsProvider.beforeNewInstallsShareToAppVerifier &&
683
694
(await getInstalledInfo ('dev.soupslurpr.appverifier' )) != null ) {
@@ -693,6 +704,7 @@ class AppsProvider with ChangeNotifier {
693
704
if (newInfo == null ) {
694
705
try {
695
706
file.file.deleteSync (recursive: true );
707
+ additionalAPKs.forEach ((a) => a.file.deleteSync (recursive: true ));
696
708
} catch (e) {
697
709
//
698
710
} finally {
@@ -720,8 +732,10 @@ class AppsProvider with ChangeNotifier {
720
732
}
721
733
int ? code;
722
734
if (! settingsProvider.useShizuku) {
723
- code =
724
- await AndroidPackageInstaller .installApk (apkFilePath: file.file.path);
735
+ var allAPKs = [file.file.path];
736
+ allAPKs.addAll (additionalAPKs.map ((a) => a.file.path));
737
+ code = await AndroidPackageInstaller .installApk (
738
+ apkFilePath: allAPKs.join (',' ));
725
739
} else {
726
740
code = await ShizukuApkInstaller .installAPK (file.file.uri.toString (),
727
741
shizukuPretendToBeGooglePlay ? "com.android.vending" : "" );
0 commit comments