如何实现com.example.free检测安装com.example.paid后解锁付费功能?无需Content Provider
嘿,这个需求其实是Android生态里挺常见的「轻量解锁器」模式,CamScanner确实用了类似的思路,而且不用Content Provider也完全能实现,我给你拆解几个靠谱的方案:
方案1:包存在性检测(CamScanner大概率采用的核心方案)
这是最直接的实现方式——免费应用com.example.free定期或在关键入口检查设备上是否安装了com.example.paid包,只要检测到存在,就自动解锁付费功能。
具体实现步骤:
- 付费应用做极简处理:只保留
AndroidManifest.xml文件,不需要任何Activity、Service或代码逻辑,甚至连资源文件都可以删掉,这样体积轻松控制在4-5KB以内。 - 在免费应用里添加检测逻辑:
private boolean isPaidAppInstalled() { PackageManager pm = getPackageManager(); try { // 尝试获取付费应用的包信息,不存在则抛出异常 pm.getPackageInfo("com.example.paid", PackageManager.GET_ACTIVITIES); return true; } catch (PackageManager.NameNotFoundException e) { return false; } }
- 在合适的时机调用这个方法(比如应用启动时、进入付费功能页面时),返回
true就解锁对应功能。
方案2:签名验证(防破解增强版)
只检测包名存在的话,容易被恶意用户通过伪造同名包解锁,所以可以加上签名校验——免费应用预存付费应用的签名哈希,检测到包存在后,再验证签名是否匹配。
代码示例:
private boolean isPaidAppValid() { PackageManager pm = getPackageManager(); try { PackageInfo paidPackageInfo = pm.getPackageInfo("com.example.paid", PackageManager.GET_SIGNATURES); Signature[] paidSignatures = paidPackageInfo.signatures; // 这里替换成你付费应用的签名哈希(可以提前生成好) String validSignatureHash = "你的付费应用签名SHA-256哈希值"; for (Signature signature : paidSignatures) { String hash = getSignatureHash(signature); if (validSignatureHash.equals(hash)) { return true; } } return false; } catch (Exception e) { return false; } } // 生成签名的SHA-256哈希值 private String getSignatureHash(Signature signature) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] signatureBytes = signature.toByteArray(); md.update(signatureBytes); byte[] hashBytes = md.digest(); // 转成十六进制字符串 StringBuilder sb = new StringBuilder(); for (byte b : hashBytes) { sb.append(String.format("%02x", b)); } return sb.toString(); }
方案3:广播触发(主动解锁可选方案)
如果想让付费应用安装后立即触发解锁,而不是等免费应用下次启动,可以用自定义广播:
- 付费应用的
AndroidManifest.xml里添加安装完成后的广播发送逻辑,或者用一个空Activity在启动时发送广播(即使是空Activity,整个应用体积还是能控制在几KB)。 - 免费应用动态注册广播接收器,接收付费应用发送的解锁广播,收到后立即解锁功能。
注意:Android 8.0+对静态广播有严格限制,所以推荐免费应用用动态注册,或者给广播加上签名权限,只有同签名的应用才能发送,防止伪造。
额外注意事项:
- 处理卸载场景:免费应用可以监听
ACTION_PACKAGE_REMOVED广播,当检测到com.example.paid被卸载时,自动锁定付费功能。 - 签名一致性:如果两个应用用同一个签名打包,可以开启
sharedUserId进一步增强安全性,但这个不是必须的,前面的方案都不需要依赖它。
内容的提问来源于stack exchange,提问作者Asif Patel
相关产品推荐
相关产品推荐

