为什么我不能调用只需要传递Context的FakeSplitInstallManagerFactory的create方法呢?

Why can't I call the create method of FakeSplitInstallManagerFactory that only requires Context to be passed?

新的 FakeSplitInstallManagerFactory 有一个采用 Contextcreate 方法,但是当我尝试从我的代码中使用它时,我只得到采用 Context 和a File 这是一个目录。如果我告诉 AS 显示 class 的定义,我可以看到两个 create 方法。它们都是 public 并且它们都是 static,但只能从我的代码中调用一个。我已经尝试过清洁,运行 gradle 等。我不明白可能是什么问题?

这是我得到的错误:

这是我在自动完成时得到的:

如果我按 control+b 我得到:

package com.google.android.play.core.splitinstall.testing;

import com.google.android.play.core.splitcompat.SplitCompat;
import com.google.android.play.core.splitinstall.SplitInstallManager;
import android.content.Context;

/** Creates instances of {@link com.google.android.play.core.splitinstall.testing.FakeSplitInstallManager FakeSplitInstallManager}. */

@SuppressWarnings({"unchecked", "deprecation", "all"})
public class FakeSplitInstallManagerFactory {

public FakeSplitInstallManagerFactory() { throw new RuntimeException("Stub!"); }

/**
 * Creates a fake implementation of the {@link com.google.android.play.core.splitinstall.SplitInstallManager SplitInstallManager}.
 *
 * <p>This implementation is self-contained and obtains splits from a specified directory, which
 * can be populated passing the --local-testing flag to bundletool build-apks and using bundletool
 * install-apks to install the app.
 *
 * <p>It is provided for testing, e.g. checking sequences of events when installing dynamic
 * features and additional languages. It is suitable for use in integration tests.
 *
 * <p>This fake supports just one install request at a time.
 *
 * <p>Network errors can be simulated using {@link com.google.android.play.core.splitinstall.testing.FakeSplitInstallManager#setShouldNetworkError(boolean) FakeSplitInstallManager#setShouldNetworkError(boolean)}.
 *
 * <p>{@link com.google.android.play.core.splitcompat.SplitCompat SplitCompat} must be installed appropriately to use this class.
 *
 * <p>This method will always return the same {@link com.google.android.play.core.splitinstall.testing.FakeSplitInstallManager FakeSplitInstallManager} instance.
 */

public static com.google.android.play.core.splitinstall.testing.FakeSplitInstallManager create(android.content.Context context) { throw new RuntimeException("Stub!"); }

/**
 * Alternative version of {@link #create(android.content.Context)} which allows for the splits directory to be set
 * explicitly.
 *
 * <p>The constructor receives the directory on the device where the split apks can be obtained.
 * The file name format is the same as the extracted output of bundletool build-apks. The apks in
 * the directory must be signed by the same certificate as the app. If this directory is missing,
 * install requests will fail with {@link
 * com.google.android.play.core.splitinstall.model.SplitInstallErrorCode#API_NOT_AVAILABLE}.
 *
 * <p>In general, all configuration splits for the module that are present in the folder will be
 * included. Thus, consider pre-filtering them for the device - e.g. using appropriate bundletool
 * build-apks argument. However, since languages can change over time on the device, there will be
 * additional filtering of language splits, whereby only appropriate languages will be included.
 *
 * <p>Prefer using {@link #create(android.content.Context)} and let bundletool populate the default directory,
 * unless there's a good reason to use a different directory or filter the delivered APKs by hand.
 *
 * <p>This method will always return the same {@link com.google.android.play.core.splitinstall.testing.FakeSplitInstallManager FakeSplitInstallManager} instance. It will
 * fail if called twice with different directories.
 */

public static synchronized com.google.android.play.core.splitinstall.testing.FakeSplitInstallManager create(android.content.Context context, java.io.File modulesDirectory) { throw new RuntimeException("Stub!"); }
}

其中清楚地显示了两个 create 方法。

我正在使用 play 核心库 1.6.5,这是一个新的清晰项目,没有其他任何东西。现在我从模板创建了一个新的干净项目,然后添加了 implementation "com.google.android.play:core:1.6.5" 并且它有完全相同的问题。那我做错了什么?

谢谢。

我知道这很奇怪,但是当您从 com.google.android.play:core AAR 检查 FakeSplitInstallManagerFactory.class 时,无论出于何种原因,他们似乎都遗漏了它?这就是为什么它不会让你使用 create(context).

public class FakeSplitInstallManagerFactory {
    private static FakeSplitInstallManager a = null;

    public FakeSplitInstallManagerFactory() {
    }

    public static synchronized FakeSplitInstallManager create(Context var0, File var1) {
        if (a == null) {
            try {
                a = new FakeSplitInstallManager(var0, var1);
            } catch (Exception var3) {
                throw new RuntimeException(var3);
            }
        } else if (!a.a().getAbsolutePath().equals(var1.getAbsolutePath())) {
            throw new RuntimeException(String.format("Different module directories used to initialize FakeSplitInstallManager: '%s' and '%s'", a.a().getAbsolutePath(), var1.getAbsolutePath()));
        }

        return a;
    }
}

也许他们稍后会添加它,因为文档 Locally test module installs: Simulate a network error 提到了缺少的方法(或者他们可能弃用它以支持 create(context, file) 但只是没有更新文档),我们会看到...

不过这里有一篇最近的medium/An easy way to test offline dynamic delivery讲了如何使用create(context, file)