0

リリース バージョンのコードをコメント アウトする方法を期待していました。

私が Ant にたどり着いたのは、Log.D コードが最適化手法によって削除されていたにもかかわらず、Proguard の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 で and (&&) を使用すると、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 がこれを行います。

プロガードの最適化を介してクラスを渡すことができ、コンパイラが以前にそうしなかった場合、コードのこの部分を (ほぼ) 確実に削除します。

于 2013-08-07T14:51:09.180 に答える