检测应用程序是不是从 Android Market 下载

Posted

技术标签:

【中文标题】检测应用程序是不是从 Android Market 下载【英文标题】:Detect if app was downloaded from Android Market检测应用程序是否从 Android Market 下载 【发布时间】:2010-11-02 11:10:06 【问题描述】:

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

这是否可能让应用程序知道它来自哪里(市场或非市场?)我想人们可以检测到签名 JAR 文件的存在。

【问题讨论】:

您想知道应用程序是否已发布,或者最终用户从何处下载应用程序?例如,用户从市场加载应用程序,因此市场应用程序使用生产服务器,或者应用程序已发布,因此该应用程序的所有副本都成为生产应用程序。 格兰特,我正在寻找的差异确实是开发人员时间与生产时间,所以我确实希望开发人员副本保留在测试服务器上。我只希望“在野外”下载的任何应用程序都可以使用生产服务器。 创建另一个不执行任何操作的应用程序,然后测试它是否存在以指示调试版本?在开发手机上安装应用。 【参考方案1】:

是的,您可以为此使用签名。如果您在开发期间使用调试密钥对您的应用程序进行签名,并在将您的应用程序上传到市场时使用发布密钥,您可以检查应用程序的签名并基于该使用测试或生产服务器。 这是一段读取应用签名的小代码:

    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 中使用的包名称。 祝你好运

标记

【讨论】:

硬编码 YOUR_RELEASE_KEY 是个好主意吗?逆向工程会揭示这一点吗? 这可能会解决问题,但如果我是你,我绝对不会将我的完整私钥放入我的代码中。也许您可以只使用 20 个字符的密钥子集或其他东西就可以逃脱? 我认为在您的密钥上使用某种哈希并对其进行硬编码,然后对存储在包信息中的密钥进行哈希处理,然后检查是否会阻止任何人看到真正的密钥,如果它被逆向工程. 如果您测试的是调试密钥而不是发布密钥,您难道不能绕过安全漏洞吗? 您不想将签名与调试密钥进行比较。相反,您应该将签名的 X500 主体与您的调试密钥(或发布密钥或任何其他密钥)进行比较。见***.com/a/6203440/596599【参考方案2】:

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

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

要获取Android Market的包,this post可能会有所帮助。

【讨论】:

【参考方案3】:

据我所知,市场应用程序没有做任何事情来“标记”一个应用程序,说它是从市场上下载的。

我看到另一个 Android 库以不同的方式解决了这个问题。 AdMob Android SDK 可免费下载和使用,如on their wiki 所述。该库提供广告,因此他们同样希望能够确定当前正在运行的应用程序是否正在由开发人员测试,或者是否正在“野外”使用。他们的方法是要求开发人员在 XML 中设置“测试”属性,或者调用他们的库“setTesting(boolean)”函数让库知道要投放哪些广告。这显然更像是一种手动方法,依赖于开发人员在发布之前更改一行代码或 XML。

【讨论】:

是的,这是一种方法.. 问题是很难记住在发布时将其改回 :) 我一直在寻找一种自动的方法。哦,好吧。 您可以自定义build.xml Ant 构建脚本以在发布与调试构建之间交换变量。我这样做的方式是自动交换配置类(用于 Facebook 和 Twitter 键)和资源文件(用于 Google 地图)。【参考方案4】:

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

【讨论】:

【参考方案5】:

也许您可以为您的应用添加“开发者模式”设置。

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

【讨论】:

以上是关于检测应用程序是不是从 Android Market 下载的主要内容,如果未能解决你的问题,请参考以下文章

转发布android app到android market的方法

在模拟器 2.2 中安装 android market 应用程序

从 Android Market 安装应用后获取推荐人

如何为Android Market和App Store制作二维码[关闭]

怎样提交Android应用到google market上去?

怎么注册android market的 帐户