测试Google Play安装推荐库

83

我想要从监听Play商店的INSTALL_REFERRER意图,转而使用新的Google Play安装引荐库

我正在努力寻找一种测试这个新库的方法,而不必先将我的应用程序添加到Play商店。当通过BroadcastReceiver监听INSTALL_REFERRER意图时,我可以通过Activity Manager手动发送广播来模拟行为并进行测试。也就是说,我可以按照Google提供的步骤进行测试。

是否存在一种无需将我的应用程序首先放入Play商店即可测试此新库的方法?


18
加一票支持这个。我还需要一种测试这个的方法。 - Niraj Gupta
你解决了问题吗?你有一些可用的代码吗?你从哪里开始跟踪你的第一个安装?你添加了广播接收器来监听 Intent.ACTION_PACKAGE_FIRST_LAUNCH 还是只在 MainActivity 中编写了代码? - yozhik
@NirajGupta 您可以尝试使用我下面的解决方案。 - yozhik
发现这个类似问题的答案非常有帮助:https://dev59.com/llUM5IYBdhLWcg3wOeTz#58621059 - Marcin Koziński
6个回答

60

有一个旧技巧可以测试这个。

步骤:

  1. 使用广告系列链接在设备上启动Google Play,例如:https://play.google.com/store/apps/details?id=com.test.test_project&referrer=utm_source%3Dtest_source%26utm_medium%3Dtest_medium%26utm_term%3Dtest-term%26utm_content%3Dtest_content%26utm_campaign%3Dtest_name (您可以使用Google Play生成器:https://developers.google.com/analytics/devguides/collection/android/v3/campaigns#google-play-url-builder

  2. 不要点击安装按钮

  3. 使用adb安装您的测试构建。adb install -r app-debug.apk

现在Google Play将返回您的测试广告系列。


1
是的,它正在工作,但要小心utm_source会给你(not%20set),如果您的链接没有直接重定向到Google Play应用程序。 - Islam Ahmed
8
安装完毕后,您应该看到“安装”按钮变为“打开”按钮。您必须通过该按钮打开应用程序(而不是使用adb am),以获取UTM有效载荷。如果您没有看到按钮文本更改,则说明已安装的应用程序的应用程序ID与Play商店中的ID不同。如果您发布了一个“prod”(生产)版本的应用程序,但正在使用“debug”(调试)版本,则很可能会出现这种情况。暂时更改调试应用程序的应用程序ID,然后上述操作应该可以正常工作! - Kevin Barron
是的,这可以工作,但为什么要从adb安装? - Bipin Bharti
1
从AS UI构建+安装会创建一个带有android:testOnly标志的APK,无法在这方面进行测试。只有使用gradle的assembleDebug任务然后手动使用adb安装才有效(至少对我而言)。 - Shlomi Katriel
无法让我进行编辑,所以这是更新后的Google Play URL生成器链接:https://ga-dev-tools.google/ga4/campaign-url-builder/play/ - undefined
显示剩余5条评论

7

这是我的测试总结:

  1. 原先的广播方式可以进行测试,但它已过时且目前不再支持。
  2. 您可以通过使用adb安装参考库,并获取像从Google Play直接下载一样的utm_source = google-play&utm_medium = organic。但是我们无法获得更多信息,它只能测试您的库设置是否正确。
  3. https://dev59.com/S1UM5IYBdhLWcg3wSexQ#60342463由@Quickern提供。老实说, 按照这些提示好使
  4. 使用Google Play提供的Beta测试:https://dev59.com/llUM5IYBdhLWcg3wOeTz#49750758。毫无疑问,它好使
  5. 使用模拟器:https://dev59.com/S1UM5IYBdhLWcg3wSexQ#59744213@Marilia。我没有测试过这一点,因为带有Google Play商店的模拟器就像真实设备一样。回答中指出的条件是上传应用程序到Google Play商店,因此我认为它就像第4篇文章所述的一样。

2

我能够使用模拟器测试Play安装引荐库。卸载应用程序并再次运行将启动连接,并在onInstallReferrerSetupFinished中给出预期的responseCode


为了测试当Play商店被禁用时的情况,您可以在设置中禁用Google Play商店。转到“设置”>点击“应用和通知”。选择Google Play商店(或先点击“查看所有应用程序”或“应用程序信息”以找到它)。点击“禁用”选项。如果Google Play商店被禁用,则会收到InstallReferrerResponse.FEATURE_NOT_SUPPORTED作为responseCode - Marilia
1
顺便问一下,您是否尝试模拟应用程序从广告中安装的过程,然后在从Play商店打开应用程序后,能否监视installReferrerUrl参数,例如utm_sourceutm_medium - Mohanakrrishna
我没有尝试从广告中安装,但是从Play商店安装会在“referrerUrl”中给我这些参数,例如:utm_source=google-play&utm_medium=organic - Marilia
从Play商店安装意味着您已将应用程序上传或更新到Play商店? - Mohanakrrishna
是的,从有机源安装或在模拟器上构建应用程序应该返回我提到的那些参数和值。 - Marilia
显示剩余2条评论

2

第一步

测试网址
https://play.google.com/store/apps/details?id=com.test.test_project&referrer=utm_source%3Dtest_source%26utm_medium%3Dtest_medium%26utm_term%3Dtest-term%26utm_content%3Dtest_content%26utm_campaign%3Dtest_name

第二步 点击上面的链接。打开Play商店 (不要从Play商店安装)

第三步Android studio中安装。 您将得到结果。 现在,如果您检查另一个链接,则需要按照上述方式遵循相同的步骤,因为,

注意: 注意:安装引荐信息将在90天内提供,并且除非重新安装应用程序,否则不会更改。为避免在应用程序中进行不必要的API调用,您应该仅在首次执行后调用API一次。

(从这里)

注意: 我的应用程序目前是Alpha版本(在Play商店中)


2
阅读完https://developers.google.com/analytics/solutions/testing-play-campaigns中的必要步骤后,我发现可以使用ADB工具在发布到Play Store之前测试应用安装referrer库。

请注意-以下测试使用已弃用的广播接收器,而不是新的 Play Install Referrer API。(感谢Peter Keefe指出)。

确保应用程序未运行,并在终端/CMD中运行此shell代码(同时设备连接到adb)以触发安装意图:

 echo 'am broadcast \
-a com.android.vending.INSTALL_REFERRER \
-n "your.package.name/path.to.receiver" \
--es "referrer" \
  "utm_source=test_source&utm_medium=test_medium&utm_term=test_term&utm_content=test_content&utm_campaign=test_name"; \
exit' | ./adb shell

将包名和接收器路径替换为:

your.package.name/path.to.receiver

此外,不要忘记替换UTM URL参数以跟踪不同的安装来源:

utm_source=test_source&utm_medium=test_medium&utm_term=test_term&utm_content=test_content&utm_campaign=test_name


2
这是使用已弃用的广播接收器进行测试,而不是使用新的Play安装引荐API。 - Peter Keefe
你能帮忙测试这个库吗? - Darshan Pania
唯一测试的方法应该是使用Play Store控制台中的Beta发布功能。将Beta测试启动到您的设备上,并使用Beta链接注入推荐参数。 我使用Firebase分析记录推荐数据作为自定义事件,因此您可以使用Firebase Analytics调试仪表板检查数据是否正确接收。 - weizenberg

-5
也许有些人会需要这个。我创建了一个测试应用程序,这里是仅包含一个所需活动的源代码。 关于如何添加Play安装引荐库:https://developer.android.com/google/play/installreferrer/library 此外,这里还有一个很好的描述:https://android-developers.googleblog.com/2017/11/google-play-referrer-api-track-and.html
package com.cat.red.rsamazingapp;

import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.android.installreferrer.api.InstallReferrerClient;
import com.android.installreferrer.api.InstallReferrerStateListener;
import com.android.installreferrer.api.ReferrerDetails;

import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;

public class MainActivity extends AppCompatActivity implements InstallReferrerStateListener {

    private static final String TAG = "RSD";
    InstallReferrerClient mReferrerClient;
    TextView txtBody;
    StringBuilder stringBuilder;

    private int attemps = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtBody = (TextView) this.findViewById(R.id.txt_body);
        stringBuilder = new StringBuilder();
        stringBuilder.append("\nonCreate");

        mReferrerClient = InstallReferrerClient.newBuilder(this).build();
        stringBuilder.append("\n1. onCreate.isReady == " + mReferrerClient.isReady());
        mReferrerClient.startConnection(this);
        stringBuilder.append("\nstartConnection");
        stringBuilder.append("\n2. onCreate.isReady == " + mReferrerClient.isReady());
    }

    @Override
    public void onInstallReferrerSetupFinished(int responseCode) {
        stringBuilder.append("\nonInstallReferrerSetupFinished");

        switch (responseCode) {
            case InstallReferrerClient.InstallReferrerResponse.OK:
                // Connection established
                stringBuilder.append("\nonInstallReferrerSetupFinished. InstallReferrer conneceted. Success");
                stringBuilder.append("\nisReady == " + mReferrerClient.isReady());

                try {
                    ReferrerDetails installReferrerDetails = mReferrerClient.getInstallReferrer();
                    if (installReferrerDetails == null) {
                        stringBuilder.append("\ninstallReferrerDetails == NULL");
                    }

                    if (installReferrerDetails != null) {
                        stringBuilder.append("\ngetInstallReferrer = " + installReferrerDetails.getInstallReferrer());
                        stringBuilder.append("\ngetInstallBeginTimestampSeconds = " + installReferrerDetails.getInstallBeginTimestampSeconds());
                        stringBuilder.append("\ngetReferrerClickTimestampSeconds = " + installReferrerDetails.getReferrerClickTimestampSeconds());
                    }
                } catch (RemoteException e) {
                    stringBuilder.append("\nonInstallReferrerSetupFinished. exception: " + e.getMessage());
                    txtBody.setText(stringBuilder.toString());
                    e.printStackTrace();
                }
                break;
            case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED:
                stringBuilder.append("\nonInstallReferrerSetupFinished. Install Referrer API not supported by the installed Play Store app.");
                stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
                break;
            case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE:
                // Connection could not be established
                stringBuilder.append("\nonInstallReferrerSetupFinished. Could not initiate connection to the Install Referrer service.");
                stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
                break;
            case InstallReferrerClient.InstallReferrerResponse.SERVICE_DISCONNECTED:
                stringBuilder.append("\nonInstallReferrerSetupFinished. Play Store service is not connected now - potentially transient state");
                stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
                break;
            case InstallReferrerClient.InstallReferrerResponse.DEVELOPER_ERROR:
                stringBuilder.append("\nonInstallReferrerSetupFinished. General errors caused by incorrect usage.");
                stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
                break;
            default:
                stringBuilder.append("\nonInstallReferrerSetupFinished. responseCode not found. code = " + responseCode);
                stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
        }

        stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
        mReferrerClient.endConnection();
        stringBuilder.append("\nendConnection");
        stringBuilder.append("\nisReady == " + mReferrerClient.isReady());

        txtBody.setText(stringBuilder.toString());
    }

    @Override
    public void onInstallReferrerServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
        stringBuilder.append("\nonInstallReferrerServiceDisconnected. attemptCount = " + attemps);
        stringBuilder.append("\nisReady == " + mReferrerClient.isReady());

        if (attemps < 3) {
            attemps++;
            stringBuilder.append("\nonInstallReferrerServiceDisconnected. RE-startConnection");
            mReferrerClient.startConnection(this);
        } else {
            stringBuilder.append("\nonInstallReferrerServiceDisconnected. endConnection");
            stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
            mReferrerClient.endConnection();
            stringBuilder.append("\nendConnection");
            stringBuilder.append("\nisReady == " + mReferrerClient.isReady());
        }

        txtBody.setText(stringBuilder.toString());
    }

    @Override
    protected void onResume() {
        super.onResume();
        stringBuilder.append("\nonResume. isReady == "+ mReferrerClient.isReady());
    }

    public static String format(GregorianCalendar calendar){
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        fmt.setCalendar(calendar);
        String dateFormatted = fmt.format(calendar.getTime());
        return dateFormatted;
    }
}

4
以上只是一个“示例”代码,但并未展示如何在上传到应用商店之前测试该应用程序。 - Yingbo Miao
1
@YingboMiao 是的,不过如果你有上传到Play Store的可能性,你知道你能测试所有轨道(内部、Alpha、Beta、生产)还是只能测试一些吗? - riper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接