27

I'm new to Android dev and I'm almost ready to release a first version of my app :)

While testing the signed release apk on my phone, it refuse to install because the debug version is installed with the debug signature.

So I have to uninstall the debug version but it delete all my database (and it will do it to my friends who are testing it).

Is there a way to manage a debug and a release version of the same app without losing data?

4

6 回答 6

37

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

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}
于 2014-04-02T17:30:32.670 回答
4

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

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

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

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

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

于 2011-02-10T17:23:42.697 回答
3

感谢@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)");
}
于 2014-12-15T21:45:01.500 回答
2

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

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

于 2011-02-10T17:07:47.947 回答
1

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

<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>] 
于 2016-04-19T09:54:47.557 回答
1

配置应用程序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 服务器。


以下文章提供了有关此主题的更多信息:在同一设备上安装您的调试和发布变体

于 2021-06-28T01:28:58.583 回答