检测应用程序是否从Android市场下载

53

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

应用程序可以判断自己来自哪里(市场或非市场)吗?我想可以检测签名的JAR文件是否存在。


你想知道应用程序是否已发布,或者最终用户从哪里下载了应用程序吗?例如,用户是从市场加载应用程序,因此市场应用程序使用生产服务器,还是该应用程序已发布,因此该应用程序的所有副本都成为生产应用程序。 - Grant
授权,我真正寻找的区别是开发人员时间与生产时间,所以我希望开发人员副本仍留在测试服务器上。我只希望任何在“野外”下载的应用程序都使用生产服务器。 - sehugg
创建另一个不执行任何操作的应用程序,然后测试其存在以指示调试构建?在开发手机上安装应用程序。 - OJW
5个回答

38

可以使用签名来实现这一点。在开发过程中,您可以使用调试密钥对应用程序进行签名,并在将应用程序上传到市场时使用发布密钥进行签名,然后根据用于签名的签名检查应用程序并基于此使用测试或生产服务器。 以下是一个读取应用程序签名的小代码片段:

    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 中使用的包名。

祝你好运


1
硬编码YOUR_RELEASE_KEY是个好主意吗? 逆向工程会揭示这个吗? - Thushan
4
如果是我,我肯定不会在代码中放入完整的私钥,这样做可能会解决问题。也许你可以只使用私钥的20个字符子集之类的方式来规避风险? - Declan Shanaghy
5
我认为可以在密钥上使用某种哈希算法并进行硬编码,然后对存储在软件包信息中的密钥进行哈希处理,并检查它是否与编码后的密钥相匹配,这样可以防止密钥被反向工程破解。 - Austyn Mahoney
8
如果你测试调试密钥而不是发布密钥,那么你不就可以解决安全风险问题了吗? - Rob Kent
我们可以将密钥存储在位于资产文件夹中的配置文件中。 - Hitesh Sahu
显示剩余3条评论

10

3
据我所知,市场应用程序没有任何方式来“标记”应用程序以表明它是从市场下载的。
我看到另一个Android库以不同的方式处理了这个问题。 AdMob Android SDK可以免费下载和使用,如他们的wiki所述。 该库提供广告,因此他们希望能够确定当前运行的应用程序是否由开发人员测试或在实际使用中。他们的方法是要求开发人员在XML中设置“testing”属性或调用其库的“setTesting(boolean)”函数,以让库知道要提供哪些广告。 这显然是一种更手动的方法,依赖于开发人员在发布之前更改一行代码或XML。

1
是的,那是一种方法..问题是在发布时很难记得改回来 :) 我正在寻找一种自动的方法。哦,好吧。 - sehugg
1
您可以自定义 build.xml Ant 构建脚本,以在发布和调试构建之间交换变量。我已经以这样的方式完成了配置类(用于 Facebook 和 Twitter 密钥)和资源文件(用于 Google 地图)的自动交换。 - Paul Lammertsma

1

你可以将配置默认为生产环境,并使用一个自定义的仪器,将配置设置为测试环境。发布到 Android 市场之前应该删除仪器。


0
也许您可以在您的应用程序中添加“开发者模式”的设置。 另一种可能性是,让它在SD卡上查找特殊的文件或配置文件,并以此为依据。

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