是否可以仅针对特定口味包括和初始化HockeyApp SDK?

时间:2019-06-05 16:59:49

标签: java android gradle hockeyapp

我有一个具有多种风格的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}中(遵循不同口味的不同资源的相同逻辑),但是由于无法引用{{ 1}}类是“与风味无关的”,例如。导入Application类的每个类都只包含以下行:

Appplication

反之亦然,如果我在import {package}.Application;中为每种口味指定了具体实现,例如。

build.gradle

然后我无法构建其他版本,因为它们的包装参考不存在。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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

另一种解决方案是添加一个compileOnly依赖关系,该依赖关系适用于所有口味,但仅对某些口味具有实际的implementation依赖关系,然后 try / catch 所有HockeyApp调用在catch子句中添加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.
}