我有一个具有多种风格的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.
}