web-dev-qa-db-ja.com

Dexguardが有効になっていると、Crashlyticsのスタックトレースにファイル名が不明なソースとして表示される

プロジェクトでDexguardを有効にすると、Fabric Crashlyticsからのクラッシュレポートに問題が発生します。

私のプロジェクトでDexguardを有効にしたところ、かなりうまくいきました。次に、この このページ の手順に従い、前述の構成を追加して、ファブリックがスタックトレースを難読化解除し、適切なクラッシュレポートを表示できるようにしました。メインモジュールのbuild.gradleにファブリックとdexguardプラグインを適用する方法は次のとおりです。

apply plugin: 'com.Android.application'
apply plugin: 'dexguard'
apply plugin: 'io.fabric'

そして、これが私のproguard-project.txtファイルの設定です。

# Fabric
#############################################################################
-keepattributes *Annotation*,SourceFile,LineNumberTable
-keep public class * extends Java.lang.Exception
-keepresourcexmlelements manifest/application/meta-data@name=io.fabric.ApiKey
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
#############################################################################

そして、これがリリースビルドでのproguard-project.txtの使用方法です。

buildTypes{
    debug{
        proguardFile getDefaultDexGuardFile('dexguard-debug-shrink.pro')
        proguardFile 'proguard-project.txt'
    }
    release{
        proguardFile getDefaultDexGuardFile('dexguard-release.pro')
        proguardFile 'proguard-project.txt'
        proguardFile 'dexguard-project.txt'
        if(new File("$projectDir/../local.properties").exists()){
            signingConfig signingConfigs.release
        }
    }
}

しかし、リリースビルドでクラッシュが発生すると、クラッシュが発生したファイル名は失われますが、それ以外はすべて正しく機能し、スタックトレースはほぼ理解できます。クラッシュレポートの例を次に示します。

Unknown source file names

クラッシュレポートで確認できるように、スタックトレースにはファイル名だけがありません。行番号やメソッド名などの他の説明は完全に問題ありません。

ir.X.ui.XMainActivity.throwSomethingのような完全なメソッド名とUnknown Sourceの前の行番号を使用しますが、エラーが発生したファイル名を結論付けることができます。スタックトレースにファイル名を表示します完全に説明的なテーマにしてください。私は多くのオプションと試行錯誤を試みましたが、問題はまだ存在しています。

何か足りないものはありますか?この問題を解決するにはどうすればよいですか?

Dexguardのバージョン8.1.0.7、Fabricプラグインのバージョン1.21.7、Crashlyticsライブラリのバージョン2.9.0を使用しています。

Fabricプラグインをバージョン1.25.1に、Crashlyticsライブラリをバージョン2.9.1に更新しましたが、まだ問題は解決していません。

Fabricプラグインをバージョン1.25.2に、ビルドツールのバージョンを27.0.3に、gradleプラグインのバージョンを3.1.0に更新しましたが、まだ問題が残っています。

20
Mohamad Amin

難読化されていないクラッシュレポートについては、次の手順を実行できます。 firebase crashlyticsのドキュメント から引用

1. Crashlyticsが読み取り可能なクラッシュレポートに必要な情報を保持するには、構成ファイルに次の行を追加します。

 -keepattributes *Annotation*
 -keepattributes SourceFile,LineNumberTable
 -keep public class * extends Java.lang.Exception

2. CrashlyticsがProGuardまたはDexGuardマッピングファイルを自動的にアップロードできるようにするには、構成ファイルから次の行を削除します。

 -printmapping mapping.txt
10
Honey Shah

Dexguardはコードを暗号化し、ファイルとクラッシュレポートを難読化しました

質問によると、クラッシュレポートを有効にするすべてが正しく定義され、何も変更されません。私のプロジェクトシナリオでも、Dexguard With Fabricを使用して同じです。

DexguardをProjectに統合する際、Dexguardはコードを暗号化し、他のライブラリのファイルとクラッシュレポートを難読化しました。

ただし、Google Firebase Crashlyticsも使用している場合、Firebaseコンソールでログを表示することはできません。ファブリックが提供する同じレポートを取得します。

これらのCrashlyticsは、Googleコンソールでクラッシュレポートを提供します。 Android VitalsのANR&Crashes Sectionでクラッシュログを確認します。

そのセクションには、Androidユーザーが使用状況と診断データを自動的に共有することを選択したデバイスから収集されたすべてのANRとクラッシュが表示されます。異常は、難読化されていないスタックトレースでのみ検出できます。

Googleがこのセクションについて説明しました https://support.google.com/googleplay/Android-developer/answer/60832

4
Keerthivasan

Crashlyticsでスタックトレースを正しく取得するには、以下の手順に従ってください

  1. Play Consoleにログインします。
  2. アプリを選択します。
  3. 左側のメニューで、Android vitals> Deobfuscation filesをクリックします。
  4. アプリのバージョンの横にある[アップロード]をクリックします。
  5. アプリのバージョンのProGuardマッピングファイルをアップロードします。

このリンクを確認してください https://support.google.com/googleplay/Android-developer/answer/6295281?hl=ja

4
Avijit Karmakar