提供额外的媒体资源(图形/声音)作为Google Play应用内结算项目

时间:2013-01-24 20:30:28

标签: android in-app-purchase in-app-billing

在我通过Google Play提供的Android应用中,我想提供可通过应用内结算方式购买的其他商品。

我想提供的项目类型是媒体内容,例如图形和声音,通常会进入应用的res文件夹。

问题是当然必须保护这些资源。在其documentation中,Google建议不要将内容存储在应用程序包中,而是在购买该项目后获取密钥,然后将密钥发送到检查密钥的远程服务器,如果成功,则图形/声音可供下载到应用程序。

从安全角度来看,这听起来不错。但是,如果我这样做,我就不能像使用正常访问资源那样容易地使用内容。例如,如果用户可以获得其他背景PNG,我不能使用R.drawable.new_background但必须以编程方式解码位图,对吧?

是否有通过应用内结算下载其他媒体内容的替代方案或最佳做法?

我想说,因为每个有足够决心的人都可以对代码进行逆向工程,无论如何,为什么不将内容存储在应用程序内部,而是根据用户可能会使用该内容进行强力检查。

4 个答案:

答案 0 :(得分:3)

答案在某种程度上取决于您的具体问题,从您的问题来看,这可能是下面的1或2:

1)我担心有人可以在我的应用中使用我的资源而无需支付,或

2)我担心一个用户( 一个已经付款的人,一个支付的人)将删除我的资源并使用外部我的应用程序。

另一种可能性,似乎没有通过你的问题表明(但其他人试图解决):

3)我担心由于下载大量资源而导致我的初始APK下载过大,只有部分资源会被用户决定使用。

如果您唯一关注的是第1项,那么您可以像往常一样存储资源,但在应用内部,拒绝加载/使用您尚未收到应用内付款的任何资源。这当然是最简单的方法。

如果您关注的是第2项,那么您可以在原始文件夹中加入您的APK加密二进制存档,并在该资源获得授权(例如,通过付款)时对其中的特定资源进行解码以供应用使用。正如其他人所指出的那样,就处理器负载而言,这并不是什么大问题,它确实提供了一些防止随意盗窃的保护。当然,如果你正在处理其中一个“创造性剽窃者”的矛盾,他们会破坏你的加密并且无论如何都会窃取你的资源。

如果您关心的是第3项,那么您将需要一个可从中检索项目的外部服务器。 在应用程序外部实施此类存储时,Google App Engine是托管的热门选择。您可能只想将已购买/下载的资源缓存在应用程序自己的外部文件文件夹中的加密存档中(由getExternalFilesDir()返回),然后按照上面的第2项读取和解密。卸载应用程序时,将自动删除此类文件。

答案 1 :(得分:2)

不在应用程序中存储其他内容的一个明显原因是应用程序的应用程序下载大小。如果您提供音频作为附加内容,它可以大大增加您的应用程序的大小。用户关心它。此外,它还可以更轻松地发布其他内容,因为您可以通过服务器端/开发人员控制台执行此操作,而无需发布应用更新。此外,如果您想提供高质量的图形,您将能够直接向设备提供适当版本的图像,而无需存储所有密度/屏幕尺寸版本。

如果您担心安全问题,您可以随时使用加密和签名来访问资源,并通过正确混淆代码(或者甚至将安全/解密相关代码移动到本机端)来使攻击者的生活更加艰难,这将使其更快)。

是的,这会产生一个缺点,你必须以编程方式解码它们,并且没有任何关于它的事情。老实说,我不明白为什么这么大的交易,相反,我认为你将有更多的数据驱动的资源访问是非常方便的。

作为总结,我并不认为这样做有任何标准,这取决于您的应用和内容类型。如果您提供固定的5-10张图像,那么将它们保存在本地是完全正常的,如果内容更丰富,更多项目,更重的资源,那么客户端服务器将更适合您。

答案 2 :(得分:1)

一种解决方案肯定是以下方法,其中包含两个共享相同用户ID的应用程序。但是,这并不像应用程序内购买那样优雅,显然有点黑客。

  1. android:sharedUserId
  2. 中创建两个具有相同AndroidManifest.xml的应用
  3. 将付费内容存储在第二个应用中,即从现在开始的库应用,仅包含这些图片(除必要的文件夹和清单外)
  4. 使用相同的密钥对两个APK进行签名
  5. 像往常一样免费提供第一个应用程序,并将第二个应用程序设为付费
  6. 在免费应用中,使用PackageManager检查是否已安装第二张APK
  7. 如果是,请使用createPackageContext()为第二个应用创建Context,然后用于从第一个应用访问第二个应用的资源

答案 3 :(得分:0)

Google Play提供可购买的扩展程序包。这些是大型扩展程序,可以在购买时下载,并且与您的应用程序分开。这是一种可能性。

http://developer.android.com/google/play/expansion-files.html

根据您的安全性和媒体大小,您可以使用密钥加密媒体,并将其与应用程序一起存储。它将随应用程序一起下载和安装,但无法访问。应用内购买完成后,您可以解密内容并将其提供给用户。您可以使用应用程序将密钥存储在源代码中以对其进行解密,也可以在自己的服务器上验证购买并从服务器检索密钥。