The below function works fine, but I’m encountering issues when updating the app. Specifically, if I already have a non-split APK release version installed and then try to update to the latest version, the device checks its ABI and downloads the appropriate APK. However, during installation, I get the error “App not installed” due to incompatible APK formats. For example, having a full APK and then downloading a split APK causes this error. This issue affects all APK/ABI scenarios, making this feature impractical.
Here is my code:
/**
* Checks for updates of the app and shows a dialog to update if a new version is available.
*
*
*
* Example:
* ```dart
* checkForUpdates(context);
* ```
*/
Future<void> checkForUpdates(BuildContext context) async {
// Get the current app version
String currentAppVersion = await getCurrentAppVersion();
print("the current package version: $currentAppVersion");
// Get the list of supported ABIs (Application Binary Interfaces) of the device
List<String> supportedAbis = await getDeviceABIs();
// Create an instance of the FeatureService
final FeatureService featureService = FeatureService();
// Fetch the app update content from the server
List<AppUpdate> appUpdateContent = await featureService.fetchAppUpdate(context);
// Initialize variables to store the latest version and APK URL
String apkUrl = '';
String latestVersion = '';
// Iterate through the app update content
for (AppUpdate appUpdateInfo in appUpdateContent) {
print("the latest package version: ${appUpdateInfo.appVersion}");
// Check if the app update is the latest version and is newer than the current version
if (appUpdateInfo.isLatest && appUpdateInfo.appVersion.compareTo(currentAppVersion) > 0) {
// Update the latest version and APK URL based on the device's ABI
latestVersion = appUpdateInfo.appVersion;
if (supportedAbis.contains("arm64-v8a")) {
// Use the arm64-v8a APK URL
apkUrl = appUpdateInfo.arm64_v8a;
} else if (supportedAbis.contains("armeabi-v7a")) {
// Use the armeabi-v7a APK URL
apkUrl = appUpdateInfo.armeabi_v7a;
} else if (supportedAbis.contains("x86_64")) {
// Use the x86_64 APK URL
apkUrl = appUpdateInfo.x86_64;
} else {
// Use the release APK URL as a fallback
apkUrl = appUpdateInfo.release;
return; // Exit the function early
}
}
}
// Check if a new version is available
if (latestVersion.compareTo(currentAppVersion) > 0) {
// Show the update dialog and handle the download process
showUpdateDialog(apkUrl, latestVersion);
}
}
Is there a way to determine the type of APK already installed, such as release, split ABI, or debug, so I can provide the correct APK URL? For instance, if the armeabi-v7a APK is installed, the latest update should also be the armeabi-v7a APK.
Sunny is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.