我刚开始学习 Android 开发,现在准备发布我的第一个应用程序 :)
当我在手机上测试签名后的发布版本 apk 时,它拒绝安装,因为带有调试签名的调试版本已经安装了。
所以我必须卸载调试版本,但是这将删除所有我的数据库(并且也会删除我的朋友正在测试的数据库)。
是否有一种方法可以管理相同应用程序的调试版本和发布版本而不会丢失数据?
许多 Android 项目正在开始使用 gradle 构建系统(我们在开始使用 Android Studio 时就转换到它了)。幸运的是,gradle 让同时安装开发和发布版本变得非常简单,每个版本都有自己独立的数据。 Android 文档 对此进行了介绍,只需在您的调试构建类型中添加 applicationIdSuffix
即可:
android {
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
我不知道有没有简单的方法来避免卸载/重新安装过程,所以你的选择包括...
我也遇到了同样的问题,但这是可以预料的,因此我使用手机进行调试开发,使用平板进行生产测试。当我接近发布时,我会在两个设备和模拟器上测试生产版本。
对于你的测试人员,我建议你总是给他们发布版本,但你可以包含详细的日志来帮助解决问题。调试版本仅由你使用,发布版本由他们使用。如果你向测试人员提供发布版本,他们使用并积累数据,当他们升级到下一个版本时,数据可以被保留(或更新,如果你更改了架构)以迁移他们的数据。
我认为你的测试人员没有必要使用调试版本和发布版本。
android {
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
//The .debug specified in gradle
if (pInfo.packageName.equals("YOUR_PACKAGE_NAME_HERE.debug")) {
setTitle(getTitle() + " (DEBUG)");
}
配置应用程序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 Services JSON:
app/src/release/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 服务器。
以下文章提供有关此主题的更多信息:在同一设备上安装您的调试和发布变体
为什么要卸载应用程序?通常情况下,安装相同应用程序的新版本(通过包ID标识)会保留所有应用程序数据。
编辑:若要手动保留应用程序数据,请将其从/data/data/my.package.name/...
复制到安全位置,然后在必要时进行恢复。
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=<your applicationId>.permission.C2D_MESSAGE pkg=<your applicationId>]