我们正在构建一个 Android 应用程序,其中使用 Timber 进行日志输出。我们定义了自己的 .e、.d、.v 等函数,并使用 if (BuildConfig.DEBUG)
来查看是否应该输出日志。这解决了我们不想在版本中输出调试日志但函数调用中使用的所有字符串文字仍然存在于编译的源代码中的问题。我们还使用 ProGuard 进行混淆。举个例子,在一个类中我们可以有:
somObj.normalFunction(variable)
Log.d("This secret class achieved its secret mission!");
在我们的版本中,这不会在应用日志中看到,但如果您对 APK 进行逆向工程,您将看到类似以下内容的内容:
q.b(m)
z.a("This secret class achieved its secret mission!");
这可以向黑客暗示他们正在查看什么类。 因此,我们正在寻找的是能够在编译时完全删除所有 Log 函数调用(使用一些预处理、注释或其他东西,但希望不必在每个函数调用之前添加某些内容)或混淆所有这些函数调用的字符串文字参数。因此,两个理想的解决方案是,如果源代码在编译之前看起来像:
q.b(m);
或
q.b(m);
z.a("jgasoisamgp23mmwaföfm,ak,ä")
仅仅通过思考,我就可以看到两种实现这一目标的糟糕方法。要么我们用 if(BuildConfig.DEBUG)
包围对 Log.d
的所有调用,这将使编译器在编译之前删除它们。但这是非常潮的。或者,我们确保每次您想要添加日志打印输出时都需要执行
Log.d(LogClass.getLog(1234))
然后在 LogClass 中定义所有这些日志,然后使用 if(BuildConfig.DEBUG)
删除它们,如果是这种情况,则在 getLog 中返回 null。但这使得每次您想要添加日志时都变得更加潮。
最后,有什么好的解决方案吗?
最佳答案
免责声明:我为 PreEmptive 工作,制造PreEmptive Protection - DashO的公司.
DashO 能够删除对特定方法(例如 Log 方法)的调用。虽然这不会删除加载字符串文字的指令,只是删除调用本身,但 DashO 还提供字符串加密,这将为这些字符串文字提供一些保护。
举个例子,我通过 DashO 运行这个类:
public class App {
public static void main(String[] args) {
Log.d("Secret message here");
}
}
在启用字符串加密的情况下删除对 Log.d
的调用后,反编译输出如下所示:
public class App
{
public static void main(String[] paramArrayOfString)
{
a.replace("Bwpfpb7u|ih}z{?($0&", -12 - -61);
}
}
DashO 提供了其他可能破坏反编译器的保护措施(例如控制流混淆);我已经在本次演示中关闭了这些功能。
关于android - 在 Android 中对 Log-function 的所有调用中混淆或删除字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462191/