mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-15 03:18:09 +02:00
Improved XAPK Support (#682)
This commit is contained in:
@@ -105,11 +105,7 @@ class APKPure extends AppSource {
|
|||||||
.map((e) => e.text.trim())
|
.map((e) => e.text.trim())
|
||||||
.map((t) => t == 'APKs' ? 'APK' : t) ??
|
.map((t) => t == 'APKs' ? 'APK' : t) ??
|
||||||
[];
|
[];
|
||||||
String type = types.isEmpty
|
String type = types.isEmpty ? 'APK' : types.first;
|
||||||
? 'APK'
|
|
||||||
: types.length == 1
|
|
||||||
? types.first
|
|
||||||
: types.last;
|
|
||||||
String? dateString = apkInfo
|
String? dateString = apkInfo
|
||||||
?.querySelector('div.info-bottom span.time')
|
?.querySelector('div.info-bottom span.time')
|
||||||
?.text
|
?.text
|
||||||
|
@@ -644,28 +644,38 @@ class AppsProvider with ChangeNotifier {
|
|||||||
var somethingInstalled = false;
|
var somethingInstalled = false;
|
||||||
try {
|
try {
|
||||||
MultiAppMultiError errors = MultiAppMultiError();
|
MultiAppMultiError errors = MultiAppMultiError();
|
||||||
|
List<File> APKFiles = [];
|
||||||
for (var file in dir.extracted
|
for (var file in dir.extracted
|
||||||
.listSync(recursive: true, followLinks: false)
|
.listSync(recursive: true, followLinks: false)
|
||||||
.whereType<File>()) {
|
.whereType<File>()) {
|
||||||
if (file.path.toLowerCase().endsWith('.apk')) {
|
if (file.path.toLowerCase().endsWith('.apk')) {
|
||||||
try {
|
APKFiles.add(file);
|
||||||
somethingInstalled = somethingInstalled ||
|
|
||||||
await installApk(
|
|
||||||
DownloadedApk(dir.appId, file), firstTimeWithContext,
|
|
||||||
needsBGWorkaround: needsBGWorkaround,
|
|
||||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
|
||||||
} catch (e) {
|
|
||||||
logs.add(
|
|
||||||
'Could not install APK from XAPK \'${file.path}\': ${e.toString()}');
|
|
||||||
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
|
||||||
}
|
|
||||||
} else if (file.path.toLowerCase().endsWith('.obb')) {
|
} else if (file.path.toLowerCase().endsWith('.obb')) {
|
||||||
await moveObbFile(file, dir.appId);
|
await moveObbFile(file, dir.appId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (somethingInstalled) {
|
APKFiles.sort((a, b) {
|
||||||
|
if (a.uri.pathSegments.last.startsWith(dir.appId)) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
await installApk(
|
||||||
|
DownloadedApk(dir.appId, APKFiles[0]), firstTimeWithContext,
|
||||||
|
needsBGWorkaround: needsBGWorkaround,
|
||||||
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
|
||||||
|
additionalAPKs: APKFiles.sublist(1)
|
||||||
|
.map((a) => DownloadedApk(dir.appId, a))
|
||||||
|
.toList());
|
||||||
|
somethingInstalled = true;
|
||||||
dir.file.delete(recursive: true);
|
dir.file.delete(recursive: true);
|
||||||
} else if (errors.idsByErrorString.isNotEmpty) {
|
} catch (e) {
|
||||||
|
logs.add('Could not install APKs from XAPK: ${e.toString()}');
|
||||||
|
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
||||||
|
}
|
||||||
|
if (errors.idsByErrorString.isNotEmpty) {
|
||||||
throw errors;
|
throw errors;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -677,7 +687,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
Future<bool> installApk(
|
Future<bool> installApk(
|
||||||
DownloadedApk file, BuildContext? firstTimeWithContext,
|
DownloadedApk file, BuildContext? firstTimeWithContext,
|
||||||
{bool needsBGWorkaround = false,
|
{bool needsBGWorkaround = false,
|
||||||
bool shizukuPretendToBeGooglePlay = false}) async {
|
bool shizukuPretendToBeGooglePlay = false,
|
||||||
|
List<DownloadedApk> additionalAPKs = const []}) async {
|
||||||
if (firstTimeWithContext != null &&
|
if (firstTimeWithContext != null &&
|
||||||
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
||||||
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
||||||
@@ -693,6 +704,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (newInfo == null) {
|
if (newInfo == null) {
|
||||||
try {
|
try {
|
||||||
file.file.deleteSync(recursive: true);
|
file.file.deleteSync(recursive: true);
|
||||||
|
additionalAPKs.forEach((a) => a.file.deleteSync(recursive: true));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//
|
//
|
||||||
} finally {
|
} finally {
|
||||||
@@ -720,8 +732,10 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
int? code;
|
int? code;
|
||||||
if (!settingsProvider.useShizuku) {
|
if (!settingsProvider.useShizuku) {
|
||||||
code =
|
var allAPKs = [file.file.path];
|
||||||
await AndroidPackageInstaller.installApk(apkFilePath: file.file.path);
|
allAPKs.addAll(additionalAPKs.map((a) => a.file.path));
|
||||||
|
code = await AndroidPackageInstaller.installApk(
|
||||||
|
apkFilePath: allAPKs.join(','));
|
||||||
} else {
|
} else {
|
||||||
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
||||||
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
||||||
|
22
pubspec.lock
22
pubspec.lock
@@ -14,7 +14,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: main
|
ref: main
|
||||||
resolved-ref: ba2aa7a11edc2649d1d80c25ed9291521262f714
|
resolved-ref: bcad19e964d377da8816718032e5dbf6dd16ba3a
|
||||||
url: "https://github.com/ImranR98/android_package_installer"
|
url: "https://github.com/ImranR98/android_package_installer"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
@@ -449,10 +449,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_markdown
|
name: flutter_markdown
|
||||||
sha256: f0e599ba89c9946c8e051780f0ec99aba4ba15895e0380a7ab68f420046fc44e
|
sha256: "999a4e3cb3e1532a971c86d6c73a480264f6a687959d4887cb4e2990821827e4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.4+1"
|
version: "0.7.4+2"
|
||||||
flutter_plugin_android_lifecycle:
|
flutter_plugin_android_lifecycle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -731,10 +731,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_html
|
name: permission_handler_html
|
||||||
sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
|
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.3+2"
|
version: "0.1.3+5"
|
||||||
permission_handler_platform_interface:
|
permission_handler_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -945,10 +945,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_common
|
name: sqflite_common
|
||||||
sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490"
|
sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.4+5"
|
version: "2.5.4+6"
|
||||||
sqflite_darwin:
|
sqflite_darwin:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1145,10 +1145,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: "86c2d01c37c4578ee46560109cf2e18fb271f0d080a796f09188d0952352e057"
|
sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.1.0"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1161,10 +1161,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30"
|
sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.16.2"
|
version: "3.16.3"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
Reference in New Issue
Block a user