【问题标题】:how to manage debug and release version on android device?如何在安卓设备上管理调试和发布版本?
【发布时间】:2011-06-25 00:26:46
【问题描述】:

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

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

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

有没有办法在不丢失数据的情况下管理同一个应用的调试版本和发布版本?

【问题讨论】:

  • 我也对这个解决方案非常感兴趣。但是,我相当肯定,如果不更改包名称,这是不可能的。 ://

标签: android device conflict signature


【解决方案1】:

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

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

【讨论】:

  • 同一个应用程序将在保留数据的同时覆盖旧应用程序,是的,但是您不能像@Geobert 那样安装具有相同包但签名不同的第二个应用程序。这就是发生的事情。
  • 我没有更改包 ID,但它没有安装。我已经卸载了调试版本,然后安装了发行版。然后,当我尝试从 Eclipse 以调试模式启动时,它说:
  • [2011-02-10 18:11:24 - radis] 将 radis.apk 上传到设备 '10006609c6cb' [2011-02-10 18:11:24 - radis] 安装 radis.apk。 .. [2011-02-10 18:11:25 - radis] 由于应用程序签名不同,重新安装失败。 [2011-02-10 18:11:25 - radis] 您必须完全卸载应用程序。警告:这将删除应用程序数据! [2011-02-10 18:11:25 - radis] 请在 shell 中执行“adb uninstall fr.geobert.Radis”。 [2011-02-10 18:11:25 - radis] 发射取消!
  • 我认为这是一个糟糕的解决方案 - 您应该将生产 APK 发送给您的测试人员和客户,否则他们可以提供反馈,一切正常,然后您发布生产版本并发现问题。您的测试人员应该测试尽可能接近您最终发布的版本。
  • 我有点同意;在我的例子中,测试版是由 prod 密钥签名的,并且调试功能被很好地隐藏(由一个输入字段中的作弊码激活)。只是回答问题。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 这是因为我提供了一个调试菜单,其中一些高级操作仅在应用程序签名时可用 希望调试签名
  • 在这种情况下,我建议您在构建中添加一个布尔标志,以确定是否包含该菜单,并将其放入您的生产构建中。另一种选择是在 UI 中“隐藏”它,也许是长按应用程序徽标,大多数人不会这样做,但如果您希望特定的人可以访问它,他们可以。然后,当测试完成后,您会进行适当的生产发布并将其删除。
  • @Geobert 我认为将调试版本发送给测试人员是个坏主意,最好将其发送给生产版本。它使他们获得更接近最终结果的体验,例如例如,确保他们正在测试使用生产 MapView 密钥的版本。调试版本适合您,生产适合您的测试人员和最终用户
【解决方案3】:

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

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

【讨论】:

  • 我对 gradle 还不是很熟悉,但至少根据我目前所读到的内容,我认为这应该是公认的答案,因为它是 OP 的最佳解决方案问题。
【解决方案4】:

感谢@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)");
}

【讨论】:

    【解决方案5】:

    对我来说,我还需要补充:

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

    否则,两者都会收到相同的 C2D_MESSAGE 权限,从而导致:

    Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=<your applicationId>.permission.C2D_MESSAGE pkg=<your applicationId>] 
    

    【讨论】:

      【解决方案6】:

      配置应用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

      【讨论】:

        猜你喜欢
        • 2017-01-03
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        相关资源
        最近更新 更多