Приложение, над которым я работаю, отсутствует в Play Store, оно устанавливается непосредственно на устройства, используемые для конкретных проектов. Мы подписываем приложения, используя собственное хранилище ключей. Обновления отправляются на устройства с помощью наших собственных веб-служб, которые загружают обновленный APK и предлагают пользователю установить обновление, как показано ниже.
Uri packageURI = Uri.parse("package:" + this.getPackageName());
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, packageURI);
intent.setDataAndType(Uri.fromFile(new File(downloadPath + "/" + package_name)),
"application/vnd.android.package-archive");
this.startActivity(intent);
Когда мы начали использовать варианты сборки Gradle для простой замены ресурсов, она была настроена неправильно, как показано ниже:
productFlavors {
SampleProject {
dimension "project"
applicationId "companyID.SampleProject"
versionCode = "2"
versionName = "3.0.20180514.0"
resValue "string", "app_name", "Sample Project"
}
}
Обратите внимание на неправильное назначение кода и имени версии и тот факт, что код версии является строкой.
На самом деле это работало как есть, пока мы не получили код версии больше 9 (двойные цифры). Это привело к (ожидаемой) ошибке ниже.
Невозможно привести объект '10' с классом 'java.lang.String' к классу 'java.lang.Integer'
Это привело к устранению проблемы для проектов, как показано ниже.
productFlavors {
SampleProject {
dimension "project"
applicationId "companyID.SampleProject"
versionCode 2
versionName "3.0.20180514.0"
resValue "string", "app_name", "Sample Project"
}
}
Это работает, как и ожидалось, и позволяет перейти выше кода версии 10.
Проблема в том, что это изменение НЕ позволяет устанавливать обновления поверх предыдущих версий приложения, созданного с использованием старого неправильного метода. При этом установка почти сразу завершается неудачно и просто отображает «Приложение не установлено».
Я проверил, чтобы убедиться, что больше ничего не изменилось, используя то же хранилище ключей и ресурсы, которые все еще не работают. Мы использовали исправление, чтобы оставить код версии на «9» и увеличить имя версии, но это не идеально.
Любые предложения будут оценены. Эти проекты, как правило, имеют ограниченный срок службы и не так много обновлений, так что это не является серьезной проблемой, но было бы неплохо исправить их для существующих проектов, чтобы мы могли продолжать увеличивать оба.
EDIT
Вот ошибка в Logcat при попытке установить подписанный APK с исправленным вариантом сборки.
05-14 12:00:51.785 3958-5291/? E/Parcel: Class not found when unmarshalling: com.android.packageinstaller.InstallFlowAnalytics
java.lang.ClassNotFoundException: com.android.packageinstaller.InstallFlowAnalytics
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:324)
at android.os.Parcel.readParcelableCreator(Parcel.java:2404)
at android.os.Parcel.readParcelable(Parcel.java:2358)
at android.os.Parcel.readValue(Parcel.java:2264)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2614)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.BaseBundle.getString(BaseBundle.java:920)
at android.content.Intent.getStringExtra(Intent.java:6200)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:2752)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:2209)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6401)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6173)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:170)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4028)
at android.os.Binder.execTransact(Binder.java:453)
Caused by: java.lang.ClassNotFoundException: com.android.packageinstaller.InstallFlowAnalytics
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:324)
at android.os.Parcel.readParcelableCreator(Parcel.java:2404)
at android.os.Parcel.readParcelable(Parcel.java:2358)
at android.os.Parcel.readValue(Parcel.java:2264)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2614)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.BaseBundle.getString(BaseBundle.java:920)
at android.content.Intent.getStringExtra(Intent.java:6200)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:2752)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:2209)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6401)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6173)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:170)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4028)
at android.os.Binder.execTransact(Binder.java:453)
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
Основываясь на исследовании этой ошибки, предыдущая версия, которую я пытаюсь установить поверх, была построена несколько дней назад с использованием Android Studio без каких-либо серьезных изменений или обновлений между ними, и использует только сигнатуры V1, как это было в предыдущей сборке. , Возвращаясь к неправильному способу, устанавливая код на 9 и увеличивая только имя версии, можно правильно установить обновление.