检测是否从Android电子市场下载了应用

seh*_*ugg 52 android

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

这可能是一个应用程序告诉它来自哪里(市场或非市场?)我想象一个人可以检测到签名的JAR文件的存在.

max*_*mon 37

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

    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.
    }
Run Code Online (Sandbox Code Playgroud)

YOUR_PACKAGE_NAME必须是'com.wsl.CardioTrainer'.它必须是您在AndroidManifest.xml中使用的包名称.祝好运

标记

  • 如果您测试了调试密钥而不是发布密钥,您是不是可以解决安全问题? (8认同)
  • 我想在你的密钥和硬编码上使用某种哈希,然后哈希存储在包信息中的密钥,然后检查这会阻止任何人看到真正的密钥,如果它是逆向工程的. (5认同)
  • 这可能会解决问题,但如果我是你,我肯定不会把我的完整私钥放入我的代码中.也许你可以通过使用密钥或其他东西的20个字符子集来逃脱? (4认同)

Phi*_*hil 10

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

检索安装包的应用程序的包名称.这确定了包裹来自哪个市场.

要获得Android电子市场的套餐,这篇文章可能有所帮助.