[解決済み] Androidアプリのリリース版をビルドする前に、すべてのデバッグログ呼び出しを削除するにはどうすればよいですか?
質問
Googleによると、私は"しなければなりません。 ソースコード内のLogメソッドの呼び出しをすべて無効化する。 AndroidアプリをGoogle Playに公開する前に、" を実行してください。のセクション3より抜粋 出版チェックリスト :
リリース用にアプリケーションをビルドする前に、ロギングを無効にして、デバッグオプションを無効にしていることを確認してください。ソースファイル内のLogメソッドの呼び出しを削除することで、ロギングを無効にすることができます。
私のオープンソースプロジェクトは規模が大きく、リリースのたびに手作業で行うのは面倒です。さらに、Logの行を削除することなどは、潜在的に厄介なことです。
if(condition)
Log.d(LOG_TAG, "Something");
data.load();
data.show();
Logの行をコメントすると、その次の行に条件が適用され、load()が呼ばれない可能性があります。このような状況は、存在すべきではないと判断できるほど稀なことなのでしょうか?
では、ソースコードレベルでもっと良い方法はないのでしょうか?あるいは、効率的に、しかし安全にすべてのログ行を削除するための巧妙なProGuard構文があるのでしょうか?
解決方法は?
私は、はるかに簡単な解決策は、すべての
if
のチェックがあちこちにあり、単に
プロガード
を除去するために、すべての
Log.d()
または
Log.v()
メソッドを呼び出すと、Antの
release
ターゲットになります。
こうすることで、通常のビルドでは常にデバッグ情報が出力され、リリースビルドではコードを変更する必要がありません。 また、ProGuardはバイトコードに対して複数のパスを行い、その他の不要なステートメントや空のブロックを削除し、適切な場合には短いメソッドを自動的にインライン化することができます。
例えば、以下はAndroid向けの非常に基本的なProGuardの設定です。
-dontskipnonpubliclibraryclasses
-dontobfuscate
-forceprocessing
-optimizationpasses 5
-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
そこで、それをファイルに保存し、Antから、コンパイルしたばかりのJARと、使用しているAndroidプラットフォームのJARを渡して、ProGuardを呼び出すことになります。
参照 サンプル ProGuardのマニュアルに記載されています。
アップデート(4.5年後)。 現在では、私は 木材 をAndroidのロギングに使用しました。
デフォルトの
Log
log タグは自動的に設定され、フォーマットされた文字列や例外を簡単に記録することができます。
この例では、アプリのデバッグビルドにおいてのみ、ロギングステートメントがlogcatに書き込まれます。
ティンバーは、私の
Application
onCreate()
メソッドを使用します。
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
そして、私のコード内の他のどこでも、簡単にログを取ることができます。
Timber.d("Downloading URL: %s", url);
try {
// ...
} catch (IOException ioe) {
Timber.e(ioe, "Bad things happened!");
}
をご覧ください。 Timberサンプルアプリ では、開発時にはすべてのログステートメントがlogcatに送られ、本番ではデバッグステートメントはログに残りませんが、エラーは静かにCrashlyticsに報告されます。
関連
-
[解決済み] com.android.supportのライブラリは全て全く同じバージョン表記である必要があります。
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
を作ってください。*** makeするルールがない エラーの原因、分析、解決策
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
Android Bluetooth 開発の基本プロセス
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidのシステムバージョンを確認するにはどうすればよいですか?
-
[解決済み] heroku - すべてのログを見る方法
-
[解決済み】なぜjava.util.loggingを使用しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NetworkOnMainThreadException
-
AndroidでAttempt to invoke virtual method... on null object referenceの例外が発生する。
-
アプリはGoogle検索でインデックスされません Androidmanifestのクソみたいな黄色い警告
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
アプリケーションがメインスレッドで過剰に作業している可能性があります。
-
WeChatとQQは、他のアプリのオープンリストに自分のアプリを追加し、ファイルパスを取得することができます
-
Android カスタムスピナーコントロールのドロップダウン・ボックスの実装
-
ConstraintLayoutのいくつかのプロパティの概要(RelativeLayoutの強化版、LinearLayoutの比例プロパティを含む、階層ツールの削減)。
-
[解決済み] Androidでログレベルを有効化/無効化する方法を教えてください。
-
[解決済み] デバッグとリリースの性能比較