检测是否从Android M下载了应用

我有一个Android库,可将数据上传到测试服务器和生产服务器。 我希望开发人员使用该库在开发时使用测试服务器,并在从Android Market下载应用程序时使用生产服务器。

一个应用程序能否分辨出它来自哪里(市场还是非市场?),我想人们可以检测到签名的JAR文件的存在。

sehugg asked 2020-01-14T14:20:37Z
5个解决方案
37 votes

是的,您可以使用签名。 如果您在开发过程中使用调试密钥对应用程序进行签名,而在将应用程序上载至市场时使用发布密钥来进行签名,则可以根据使用测试或生产服务器来检查与应用程序签名的签名。这是阅读您的应用程序签名的一小段代码:

    try {
        PackageManager manager = context.getPackageManager(); 
        PackageInfo appInfo = manager.getPackageInfo(
            YOUR_PACKAGE_NAME, PackageManager.GET_SIGNATURES);

        // Now test if the first signature equals your debug key.
        boolean shouldUseTestServer = 
            appInfo.signatures[0].toCharsString().equals(YOUR_DEBUG_KEY);

    } catch (NameNotFoundException e) {
        // Expected exception that occurs if the package is not present.
    }

YOUR_PACKAGE_NAME必须类似于“ com.wsl.CardioTrainer”。 它必须是您在AndroidManifest.xml中使用的包名称。祝好运

标记

maximon answered 2020-01-14T14:21:11Z
10 votes

从API 5开始,可以使用PackageManager.getInstallerPackageName(String)。 从文档中:

检索安装软件包的应用程序的软件包名称。   这可以确定包装来自哪个市场。

要获取Android Market的软件包,这篇文章可能会有所帮助。

Phil answered 2020-01-14T14:21:41Z
3 votes

据我所知,市场应用程序并没有“标记”一个应用程序以说它是从市场下载的。

我已经看到另一个Android库以不同的方式处理了此问题。 AdMob Android SDK可以按照其Wiki所述免费下载和使用。 该库提供广告,因此他们具有相同的愿望,即能够确定开发人员正在测试当前正在运行的应用程序,还是正在“野蛮使用”该应用程序。 他们的方法是要求开发人员在XML中设置“测试”属性或调用其库的“ setTesting(boolean)”函数,以使该库知道要投放的广告。 显然,这更像是一种手动方法,它依靠开发人员在发布之前更改一行代码或XML。

snctln answered 2020-01-14T14:22:06Z
1 votes

您可以将配置默认为生产环境,并使用自定义Instrumentation将配置配置为测试环境。 在发布到android市场之前,应删除仪器。

Josef Pfleger answered 2020-01-14T14:22:27Z
0 votes

也许您可以在应用程序中为“开发人员模式”添加设置。

另一种可能性是,让它在SD卡上查找特殊文件或配置文件,然后将其关闭。

davenpcj answered 2020-01-14T14:22:52Z
translate from https://stackoverflow.com:/questions/986627/detect-if-app-was-downloaded-from-android-market