Проблемы Настройка versionCode с подписанными сборками - PullRequest
0 голосов
/ 14 мая 2018

Приложение, над которым я работаю, отсутствует в 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 и увеличивая только имя версии, можно правильно установить обновление.

1 Ответ

0 голосов
/ 14 мая 2018

Вот что я думаю происходит.

Если у нас есть тестовый класс, таким образом:

public class MyClass {
    public static void main(String args[]) {
int anInt = '1';
        System.out.println("anInt  is = " + anInt);
    }
}
It runs with result `anInt  is = 49`

изменить «1» на «9»

It runs with result `anInt  is = 57`

изменить «9» на «10»

It fails (like your cast error): 

/MyClass.java:3: error: incompatible types: String cannot be converted to int
int anInt = "10";
            ^
1 error

Итак, если вы используете исправленный код ошибки с versionCode из 58 , то это должен работать.

вот snippet, так что вы можете попробовать сами в javascript:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html><head><script>
    $(function() {
      var anInt = ('1').charCodeAt(0);
      console.info("anInt is = " + anInt);
    });
  </script></head><body>
  function();
</body></html>
...