release時にlogを削除

1500 ワード

releaseではlogを除去することはよく知られていますが、logはデバッグの開発にのみ役立ち、releaseでは除去しないとパフォーマンスに影響します.2つ目はreleaseがlogを除去しない場合、他の人があなたのapkを逆分析するときに安全な問題があります.主に2つの方法でlogを除去します
  • BuildConfig
  • を通過
    if (BuildConfig.DEBUG) {
        Log.d("leslie", "hello world");
    }
    

    これは条件コンパイルではなく、コンパイラがコンパイル時に定数で包まれたdead codeをコード最適化しただけであることに注意してください.
  • ProGuardによってログコードを最適化するには、まずProGuardに最適化オプションをオンにする必要があります.デフォルトでは、最適化
  • はオンになっていません.
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    
    

    proguard-android-optimize.txtには最適化アルゴリズムproguard-rulesが指定されている.Proに次の構成を加えればいいです
    -assumenosideeffects class android.util.Log {
        public static int v(...);
        public static int i(...);
        public static int w(...);
        public static int d(...);
        public static int e(...);
    }
    

    一部の人がLog方法をカスタマイズしてシステムLog方法を包装することを見て、BuildConfig.を使いますDEBUGやカスタム変数をスイッチすることで、実際にはログを削除することはできません.毎回空のメソッドを多く呼び出しているだけでなく、他の人があなたのapkに逆方向になった後、1つの変数の値を変えるだけですべてのログが印刷され、深刻なセキュリティ問題があります.あなたの印刷ログのコードがコンパイラに最適化されても、私は逆方向に手動で追加することができます.
    Android studio生成プロジェクトのデフォルトではProGuardの最適化機能が有効になっていません.googleはこう言います.
    # Optimization is turned off by default. Dex does not like code run
    # through the ProGuard optimize and preverify steps (and performs some
    # of these optimizations on its own).
    -dontoptimize
    -dontpreverify
    

    そこでここでは,コンパイル時にLogコードを削除し,logを書くたびに判断を加えることを第1の方法として推奨する.