如何使用 Google 的 installreferrer 库测试安装 referrer?

How to test install referrer with Google's installreferrer library?

有很多示例如何测试 "default" 检测安装引荐来源网址的方法,但没有示例如何测试 com.android.installreferrer:installreferrer 库。

例如

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER 
                       -n your.package.name/path.to.receiver --es referrer
                       --es referrer "EXTRA_STRING_VALUE"

不起作用,因为我们不知道 receiver 路径。那么如何测试呢?

对于 InstallReferrerClientAndroidManifest.xml 中似乎没有任何 BroadcastReceiver 注册。该库仅绑定到系统的安装引用服务 ...

private static final String SERVICE_PACKAGE_NAME = "com.android.vending";
private static final String SERVICE_NAME = "com.google.android.finsky.externalreferrer.GetInstallReferrerService";
private static final String SERVICE_ACTION_NAME = "com.google.android.finsky.BIND_GET_INSTALL_REFERRER_SERVICE";

客户端在手动安装时收到引用 utm_source=google-play&utm_medium=organic。没有 BroadcastReceiver 暴露(但 InstallReferrerService 应该有)。

原始 Intent Bundle 的键是:install_referrerreferrer_click_timestamp_secondsinstall_begin_timestamp_seconds 如果您想尝试模拟它 - 但是 onInstallReferrerSetupFinished() 回调将间接传递结果。

文档还指出:

The install referrer information will be available for 90 days and won't change unless the application is reinstalled. To avoid unnecessary API calls in your app, you should invoke the API only once during the first execution after install. Your app can listen to the system broadcast Intent.ACTION_PACKAGE_FIRST_LAUNCH to identify the app's first execution.


所以这应该是 intent-filter for action Intent.ACTION_PACKAGE_FIRST_LAUNCH,随后将 InstallReferrerClient 连接到 InstallReferrerService。不能用 adb 触发 Intent.ACTION_PACKAGE_FIRST_LAUNCH,因为它会过滤 "protected broadcast action string",因此它可能只有在从 Play 商店安装时才会触发。

根据文档,实现可能类似于:

AndroidManifest.xml:

<receiver
    android:name=".receiver.PackageStatusReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_FIRST_LAUNCH"/>
    </intent-filter>
</receiver>

PackageStatusReceiver.java:

public class PackageStatusReceiver extends BroadcastReceiver implements InstallReferrerStateListener {

    protected static final String LOG_TAG = PackageStatusReceiver.class.getSimpleName();

    private InstallReferrerClient referrerClient;

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction() != null) {
            if(intent.getAction().equals(Intent.ACTION_PACKAGE_FIRST_LAUNCH)) {
                this.referrerClient = InstallReferrerClient.newBuilder(context).build();
                this.referrerClient.startConnection(this);
            }
        }
    }

    @Override
    public void onInstallReferrerSetupFinished(int responseCode) {
        switch (responseCode) {
            case InstallReferrerClient.InstallReferrerResponse.OK:
                Log.d(LOG_TAG, "InstallReferrer Response.OK");
                try {
                    ReferrerDetails response = referrerClient.getInstallReferrer();
                    String referrer = response.getInstallReferrer();
                    long clickTimestamp = response.getReferrerClickTimestampSeconds();
                    long installTimestamp = response.getInstallBeginTimestampSeconds();
                    Log.d(LOG_TAG, "InstallReferrer " + referrer);
                    referrerClient.endConnection();
                } catch (RemoteException e) {
                    Log.e(LOG_TAG, "" + e.getMessage());
                }
                break;
            case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED:
                Log.w(LOG_TAG, "InstallReferrer Response.FEATURE_NOT_SUPPORTED");
                break;
            case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE:
                Log.w(LOG_TAG, "InstallReferrer Response.SERVICE_UNAVAILABLE");
                break;
            case InstallReferrerClient.InstallReferrerResponse.SERVICE_DISCONNECTED:
                Log.w(LOG_TAG, "InstallReferrer Response.SERVICE_DISCONNECTED");
                break;
            case InstallReferrerClient.InstallReferrerResponse.DEVELOPER_ERROR:
                Log.w(LOG_TAG, "InstallReferrer Response.DEVELOPER_ERROR");
                break;
        }
    }

    @Override
    public void onInstallReferrerServiceDisconnected() {
        Log.w(LOG_TAG, "InstallReferrer onInstallReferrerServiceDisconnected()");
    }
}

要对此进行测试,您需要指向 Play 商店的引荐来源链接,然后通过它们安装软件包...否则只会记录默认引荐来源网址(此外,在正确实施客户)。

您可以通过在 Play Market 控制台中设置应用的内部测试版本来测试安装引荐来源网址。之后,使用来自 Play Market URL Builder 的修改后的 link。

我通过 USB 使用物理设备。

0 批准将应用程序放到 Play 商店

1 最重要的一步:在 e.g. I used only last value

上构建正确的 link

2 将 link 发送到 phone

上的电子邮件

3 将 Martin Zeitler 写的内容添加到主 activity。使用 Android Studio 应用启动。按 Home 关闭应用程序屏幕,然后按 Recent 按钮删除应用程序滑动

4 点击刚刚发来的link。它运行 Play 商店(不要从 Play 商店安装)

5 Play 商店“安装”按钮(现在)应显示为“打开” 点击按钮。现在你可以处理 response.getInstallReferrer() 例如在日志中查看