0

我希望有一种方法可以在发布版本上注释掉代码。

导致我使用 Ant 的原因是Proguard 删除 Log.D(调试)调用的方式并不令人满意,因为它会将字符串文字留在 dex 文件中,即使 Log.D 代码已被其优化技术删除。正如在此线程上指出的那样 在 ProGuard 优化期间删除未使用的字符串

有人建议 Ant 可以与替换算法一起使用,但这会在运行时清除代码。我希望如果有一种方法可以注释掉代码,使它变成//ant Log.d,然后一旦它编译//ant就可以被删除。

我是 ant 新手,在 Ant 中找不到任何注释代码的搜索结果。这不是推荐的做法吗?我觉得将所有文件复制到另一个目录然后删除行然后将其复制回来是矫枉过正的。如果编译失败,您的代码将留在另一个目录中。

所以目前我正在使用下面的正则表达式模式来注释掉代码。

 <regexp pattern="(\s*)Log\.d\s*(\(.*\))\s*;"/>
        <substitution expression="\1\/\/AntComment Log\.d\2;"/>

我想知道是否有更好的方法,即处理评论的内置方法。

还有一种方法可以试运行 ant regex 语句来查看它得到了什么?

Jean Waghetti我尝试了一些带有条件编译的代码

我只是尝试了一些变体,似乎它需要你在同一个函数中有 if(DEBUG)。所以这段代码最终会在 classes.dex 文件中包含字符串文字。

Logger.myLog("Sensitive Info" + c); // you call this

//in Logger class - myLog method
static void myLog(String msg){
if(DEBUG){

如果您尝试进行更复杂的日志记录,则需要确定是否记录,但使用和 (&&) 和 DEBUG 最终会在 dex 文件中添加字符串文字,例如:

public class SomeClass{
  public final boolean log = DEBUG && figure_Log();
  private boolean figure_Log(){
   // some condition based on other settings
 }
  //in the code
  if (log){

要实现更复杂的日志记录,您必须具备以下条件:

if(DEBUG && log){ 

在所有日志调用之前,它会创建太多未使用的代码警告,对我来说看起来很丑。

4

1 回答 1

0

您可以根据最终静态字段将要删除的代码放在条件块上。

static final DEBUG = false;

if (DEBUG) {
    System.out.println("debug message");
}

Java语言规范有一些关于“条件编译”的词。它不强制执行,但 if 块中的代码可以优化,而不是在您的类中编译。Oracle javac 执行此操作。

您可以通过 proguard 优化传递您的类,如果您的编译器以前没有,它(几乎)肯定会剥离这部分代码。

于 2013-08-07T14:51:09.180 回答