我已经在应用程序中实现了应用内购买,现在我想更加安全地保护它。阅读开发者材料时,它指出:
除了运行混淆程序外,我们建议您使用以下技术来混淆您的应用内购买代码。
将方法内联到其他方法中。
动态构建字符串而不是定义为常量。
使用Java反射调用方法。
http://developer.android.com/guide/market/billing/billing_best_practices.html
混淆(Obfuscation) - 好的,我可以使用ProGuard做到这一点。
将方法内联到其他方法中 - 这是在说一旦我的代码完成,尽可能摆脱OO,并将所有代码放在一个方法中吗?这是否包括内联类?在Android示例中,他们有一个常量类,我应该内联所有这些吗?
动态构建字符串 - 是的,所以将所有类常量变量都转换为直接在代码中构建的字符串 - 好的,ProGuard应该可以覆盖此操作。
使用Java Reflection - 这是我的主要问题。我应该调用所有的方法而不是直接调用它们吗?
为了节省一些工作量,我可以这样做:
private static Object invokeMethod(String name, Class<?>[] params, Object[] args){
try {
return MySpecificClass.class.getMethod(name, params).invoke(null, args);
} catch (IllegalArgumentException e) {
// Should never happen in my code, ignore and cancel in app charge
} catch (SecurityException e) {
// Should never happen in my code, ignore and cancel in app charge
} catch (IllegalAccessException e) {
// Should never happen in my code, ignore and cancel in app charge
} catch (InvocationTargetException e) {
// Should never happen in my code, ignore and cancel in app charge
} catch (NoSuchMethodException e) {
// Should never happen in my code, ignore and cancel in app charge
}
return null;
}
然后我可以做这样的事情:
private static boolean someMethod() {
return true; // just an example
}
params = new Class<?>[0];
if ((Boolean) invokeMethod("someMethod", params, null)) {
// Do something
}
这是否是良好的安全性措施,还是只是代码膨胀,导致我的应用程序无法调试真正的用户问题?
谢谢。
catch (Exception everythingelse)
)。我想你可以重新抛出它并在调用它的地方处理它。但是你还必须考虑到proguard
。由于你将混淆名称,这将破坏你的反射,因此你需要在 proguard 配置文件中添加-keep
规则。所以也许这些方法会稍微不那么安全,因为它们可能有意义的名称。 - Tony Chan