繁体   English   中英

Android:在我们的应用程序的预安装版本中寻找一种解锁隐藏功能的方法

[英]Android: Looking for a method to unlock hidden features in pre-installed version of our app

恐怕这个问题有点开放,但我希望这是有道理的,因为情况有点不寻常......

我们想要达到的目标

我们的一款应用程序将预装在即将由移动运营商分发的 Android 手机上。 但是,在该预安装的应用程序中,应该解锁一些原本不可用的功能(对于从 Google Play 商店安装应用程序的用户)。 例如,为新的付费订阅延长免费试用期。

到目前为止我们已经提出了什么

一种选择当然是应用程序的特殊构建,通过某些功能切换启用隐藏功能。 然而,这个特殊的构建可能会在用户打开应用程序之前被 Play 商店的自动更新覆盖。

所以到目前为止,我们最好的猜测是预安装我们的主应用程序的正常版本和其他一些没有或只有极少 UI 的应用程序。 然后,主应用程序将检测到其他关键应用程序的存在(通过 package 管理器)并基于此解锁隐藏的功能。

AFAICT 这是在 Google In App Purchases 支持非消耗性一次性产品之前处理付费应用程序免费试用的方式。 只要两个应用程序都使用相同的密钥签名,它也应该仍然有效,并且从 Android 11 开始,主应用程序在AndroidManifest.xml中声明密钥。

到目前为止正确吗?

但...

理想情况下,每个设备只能使用一次隐藏的功能,即用户应该只能为一个新订阅申请延长免费试用期,而不是为他们的邻居和他们的狗申请额外的免费试用期。

这不是一个非常强的要求,因此我们正在考虑在应用程序和关键应用程序之间添加一些通信,并且关键应用程序将存储之前已声明该好处的事实。 当然,这可能可以通过删除关键应用程序的应用程序数据来规避,但总比没有好......

所以,问题:

  • 有没有办法大部分/完全隐藏用户的关键应用程序 这样关键应用程序的 function 至少会有些模糊?
  • 还有其他我们忽略的方法吗? 就像,有没有办法在运营商可以为我们设置的 Android 图像中设置某种全局变量 - 比如com.exampleapp.unlock.hiddenfeature1 = true - 我们可以查询哪个而不是检查关键应用程序的存在? 这可能仍然容易受到多种用途的影响,但也许也有办法禁止这种情况?

还有什么?

从技术角度来看,一个明显的方法是查询设备的 IMEI(也许对于仍然可能的预安装应用程序?),然后将其与符合条件的设备列表进行比较,或者至少跟踪已声明隐藏功能的 IMEI。 但是,当然,出于数据隐私的原因,这是不可能的。

所以,我希望我明确了我们的目标,非常感谢任何建议、建议和意见!

语境

  • 预装应用程序: PIA
  • Google-Play 应用程序: GPA

问题

  • PIA是一种“风味”
  • PIA 利用“共享偏好”留下 GPA 应用程序可以“拾取”的标记
  • 任何其他形式的“共同点”。

这些问题是您无法避免失败的各种情况,特别是如果用户在被 GPA 更新或简单的 SharedPreferences 清理/重新安装之前从未打开您的应用程序。

想法?

想法很便宜,所以对所有这些都持保留态度。 我主要是在大声思考,因为我发现这是一个有趣的问题。

  1. 您是否考虑过某种形式的Licencing 例如:使用 Google Play许可

  2. 一种动态交付形式可以帮助您吗?

  3. 让一个 PIA 只是一个启动器来启动您的应用程序的特殊风格怎么样? (用户可以通过即时应用程序获得?PIA 不会被 GPA 更新,因为它不会被触及(如果是,它只会被你触及,是的,用户可以再做一次,但随后你会为不可能的事情而战)。你将不得不接受一些用户会“作弊”。但是通过使用 PlayStore 和所有这些“功能”,你总是可以控制更多的东西。不确定 Play 商店是否是什么东西这些新设备将有或没有。

  4. 除此之外,您将不得不自己处理这个服务器端。 拥有一个用户“注册”或请求试用的应用程序,然后从那里获取。

目前我想不出其他的想法。

我不是在寻找代表,请随意选择更好的回应,但请告诉我们您选择做什么。 ;)

嗯,让我看看我是否理解正确。

您在 Google Play 上有这个应用程序,并且相同的 package 也将预装在某些设备上。 我假设您可以控制如何在设备上安装此应用程序。 含义:预装的将是无法从手机中删除的系统应用程序 而且,如果您从 Play 商店下载它作为该设备上已经预安装了该应用程序的更新,它将保留为系统应用程序。

您基本上可以通过基本检查来判断任何设备上安装了哪个版本的应用程序:

boolean isSystemApp = (getApplicationInfo() & ApplicationInfo.FLAG_SYSTEM) != 0

这个简单的调用应该告诉您应用程序是否已预安装到设备中。 即使用户之后收到更新,它也不会改变。 如果此标志为假,您可以简单地假设它是侧面加载的或从 Google Play 商店安装的(我的意思是没有预先安装它)。

如果应用程序是系统应用程序,您可以打开这些功能,否则将其关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM