如何在Android设备上管理调试和发布版本?

时间:2011-02-10 17:02:50

标签: android device conflict signature

我是Android开发人员的新手,我几乎已准备好发布我的应用的第一个版本:)

在我的手机上测试签名版本apk时,它拒绝安装,因为调试版本随调试签名一起安装。

所以我必须卸载调试版本,但它会删除我的所有数据库(它会对我的朋友进行测试)。

有没有办法管理同一应用的调试和发布版本而不会丢失数据?

6 个答案:

答案 0 :(得分:33)

许多Android项目开始使用gradle构建系统(我们在开始使用Android Studio时转换到它)。幸运的是,gradle使得同时安装开发和发布版本非常简单,每个版本都有自己独立的数据。 Android docs涵盖了这一点,只需在调试版本类型中添加applicationIdSuffix,如下所示:

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

答案 1 :(得分:4)

我不知道有什么简单的方法来解决卸载/重新安装过程,所以你的选择包括......

  • 购买第二台设备进行测试(现在某些Android设备非常便宜,特别是在eBay上)
  • 使用模拟器进行测试

我看到同样的问题,但这是预料之中的,所以我将手机用于调试开发,并将平板电脑用于生产测试。当我接近发行版时,我会在设备和模拟器上测试生产版本。

对于您的测试人员,我建议您始终为他们提供发布版本,但您可以包含大量日志记录以帮助解决问题。然后,调试版本仅由您使用,并由它们发布版本。如果您为测试人员提供发布版本,他们使用并累积数据,当他们升级到下一版本时,可以保留(或更新,如果您更改架构)数据以迁移他们的数据。

我认为您的测试人员不需要使用debug&发布版本。

答案 2 :(得分:2)

为什么要卸载该应用?通常,安装相同应用程序的新版本(由包ID标识)会保留所有应用程序数据。

编辑:手动保留应用数据,将其从/data/data/my.package.name/...复制到安全的地方,然后在必要时恢复。

答案 3 :(得分:2)

感谢@Evan,您的解决方案非常完美:

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

要在调试模式下运行时将“(DEBUG)”附加到您的应用标题,请将此代码放在Activity的onCreate中:

PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    //The .debug specified in gradle
    if (pInfo.packageName.equals("YOUR_PACKAGE_NAME_HERE.debug")) {
        setTitle(getTitle() + " (DEBUG)");
}

答案 4 :(得分:1)

对我来说,我还需要添加:

for elt in w1:
    for el2 in w2:
        print(elt.tag, el2.tag)
    w2 = tree2.getiterator() # recreate iterator

否则,两者都将获得相同的C2D_MESSAGE权限,从而导致:

<permission                                                                               
      android:name="${applicationId}.permission.C2D_MESSAGE"                                
      android:protectionLevel="signature" />                                                

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 

答案 5 :(得分:0)

配置应用id后缀

在您的应用 build.gradle 上进行以下配置后,发布变体将使用 com.example.myapp applicationId,调试变体将使用 com.example.myapp.debug

android {
    defaultConfig {
        applicationId "com.example.myapp"
        ...
    }
    ...
}
buildTypes {
  debug {
    applicationIdSuffix ".debug"
    ...
  }
  release {
    ...
  }
  ...
}

配置多个 Firebase 帐户

如果您使用 Firebase,您将需要两个 Firebase 帐户,一个用于生产,另一个用于开发。 您必须在其自己的变体源集上为每个帐户配置 Google 服务 JSON:

  • 发布源集上的生产 google-services.json:app/src/release/google-services.json
  • 发布源集上的开发 google-services.json:app/src/debug/google-services.json

供应商当局

如果您在 AndroidManifest.xml 中定义了一个提供程序,现在如果发布和调试变体都使用相同的提供程序权限并且您在同一设备上安装了两个应用程序,则可能会发生冲突。为了避免这个问题,一个好的做法是使用 applicationId 作为权限后缀。

<provider
   android:name="androidx.core.content.FileProvider"
   android:authorities="${applicationId}.fileprovider"
   android:exported="false"
   android:grantUriPermissions="true">
</provider>

每个变体的自定义图标

如果您要在同一设备上安装多个变体,最好使用不同的应用图标,以便您可以在启动器上识别它们。 您只需要设计一个调试应用程序图标并在 src/debug/res/mipmap-xxhdpi-*

上找到它

配置 FCM

既然您使用了不同的 Firebase 帐户,如果您有 FCM(推送)服务器,则需要使用正确的凭据对其进行配置。 注册带有调试应用程序的设备时,FCM 服务器需要将注册令牌与调试构建类型相关联。因此,在发送推送时,将使用 Firebase 调试凭据的令牌。 因此,每次应用注册 FCM 令牌时,您都需要将构建类型发送到 FCM 服务器。


以下文章提供了有关此主题的更多信息:Install your debug & release variants on the same device