我有一个具有多种风格的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的 flavor 的.apk文件时,都对这些行进行注释。当然,有更好的方法来处理此问题。

我尝试创建不同的Application.java文件并将它们放置在app/src/{flavor}中(遵循不同口味的不同资源的相同逻辑),但是我无法构建该应用程序,因为Application类的每个引用都是“ flavor 独立的”。导入Appplication类的每个类仅具有以下一行:
import {package}.Application;
如果我在build.gradle上为每种口味指定了特定的实现,则换个 Angular 思考。

{flavor1}Implementation 'net.hockeyapp.android:HockeySDK:5.1.0'
{flavor2}Implementation 'net.hockeyapp.android:HockeySDK:5.1.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.
}

10-08 16:00