首页 > 解决方案 > 是否可以仅针对特定口味包含和初始化 HockeyApp SDK?

问题描述

我有一个具有多种风格的 Android 应用程序,每种风格都适用于不同的环境。我希望指定 HockeyApp SDK 在这些风格中的哪一种上被导入和初始化(或者至少能够在除一种风格之外的所有风格中使用它)。

目前我在文件上有这一行build.gradle

dependencies {
...
        implementation 'net.hockeyapp.android:HockeySDK:5.1.0'
...
}

在主Application.java文件中,导入并初始化 HockeyApp SDK:

import net.hockeyapp.android.CrashManager;

@Override
public void onCreate(){
        super.onCreate();

        CrashManager.register(this);
...
}

当前的解决方法是每次我需要为我不想包含 HockeyApp SDK 的风格构建和/或生成 .apk 文件时注释这些行。当然有更好的方法来处理这个问题。

我尝试创建不同的 Application.java 文件并将它们放在其中app/src/{flavor}(遵循不同资源的相同逻辑以获取不同的风格),但我无法构建应用程序,因为Application该类的每个引用都是“独立于风格的”,例如。导入该类的每个类Appplication都只有一行:

import {package}.Application;

反过来想,如果我指定build.gradle每种口味的具体实现,例如。

{flavor1}Implementation 'net.hockeyapp.android:HockeySDK:5.1.0'
{flavor2}Implementation 'net.hockeyapp.android:HockeySDK:5.1.0'

然后我无法构建其他口味,因为它们不存在包引用。

我希望我能够解释我的问题。如果您需要有关当前应用程序实现的进一步解释或详细信息,我很乐意为您提供。

提前致谢。

标签: javaandroidgradlehockeyapp

解决方案


一种始终有效但并不理想的解决方案是在访问 HockeyApp API 并捕获异常时使用反射。

另一种解决方案是添加一个compileOnly依赖于所有风格但implementation仅对某些风格具有实际依赖关系的依赖项,然后在 catch 子句中尝试/捕获所有 HockeyApp 调用,LinkageError以便在运行时缺少 HockeyApp SDK 时应用程序不会崩溃。

就像是:

compileOnly 'net.hockeyapp.android:HockeySDK:5.1.0' // all flavours
{flavor1}Implementation 'net.hockeyapp.android:HockeySDK:5.1.0' // only flavor1 has HockeyApp available at runtime and in binaries.
try {
   CrashManager.register(this);
} catch (LinkageError e) {

   // HockeyApp not available in this flavor.
}

推荐阅读