使用签名版本

时间:2018-05-14 15:37:26

标签: android android-gradle android-build android-build-flavors

我正在处理的应用不在Play商店中,它直接安装在用于特定项目的设备上。我们使用内部密钥库对应用程序进行签名。使用我们自己的Web服务将更新发送到设备,该服务下载更新的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'与class' java.lang.String' to class' java.lang.Integer'

这可以解决以下项目的问题。

productFlavors {
    SampleProject {
        dimension "project"
        applicationId "companyID.SampleProject"
        versionCode 2
        versionName "3.0.20180514.0"
        resValue "string", "app_name", "Sample Project"
    }
}

这可以按预期工作,让我们超越版本代码10。

问题是此更改不允许使用旧的错误方法构建的应用程序的先前版本进行更新。这样做时,安装几乎立即失败,只显示" App未安装。"

我已经测试过确保没有其他任何更改,使用相同的密钥库和资产仍然失败。我们一直在使用的修复方法是将版本代码留在" 9"并增加版本名称,但这不是理想的。

任何建议将不胜感激。这些项目往往寿命有限而且更新不多,所以这不是一个主要问题,但是为现有项目修复它会很好,所以我们可以继续增加两者。

修改的 尝试使用更正的构建变体安装已签名的APK时,Logcat中出现错误。

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 :(得分:0)

这就是我的想法。

如果我们有一个测试类:

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>
&#13;
&#13;
&#13;

相关问题