web-dev-qa-db-ja.com

Android St​​udioのデバッガーがライブラリモジュール内のブレークポイントで停止しない

現時点では、サードパーティのコードに基づいたAndroidアプリを開発しています。コードを理解するためにブレークポイントを設定し始め、すぐに問題に遭遇しました。突然、Android St​​udioをブレークポイントで停止させることができなくなりました。

onCreateメソッド内、ボタンのOnClickListeners内にブレークポイントを設定しようとしましたが、何も機能しませんでした。今、私はそれが動作する唯一の場所がアプリモジュール内にあることがわかりました。プロジェクトのアプリモジュールにはアクティビティクラスが1つしかなく、他のすべてはライブラリモジュール内で提供されるため、実際にはデバッグできません。

AndroidManifest.xmlまたはbuild.gradleファイルに問題があると思われます。 EclipseからAndroid St​​udioに切り替えたばかりなので、このgradleのすべては私にとってかなり新しいものです。

アプリの実行中にライブラリブレークポイントにカーソルを合わせると、「...行で実行可能なコードが見つかりません」と表示されます。これが私の問題の原因だと思いますが、それを修正する方法についてはわかりません。

Build.gradleのエントリの中に、問題を引き起こす可能性のある「通常の容疑者」がいますか?

私はすでにプロジェクトをきれいにし、成功せずにキャッシュを無効にしました。ライブラリモジュール内のフラグメント用に<activity>エントリを追加する提案を試みました。

編集:最新バージョンのAndroid St​​udio(2月18日からのバージョン1.1.0)を使用しています。

Appモジュールのbuild.gradleの内容:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 19
    buildToolsVersion project.Android_BUILD_TOOLS_VERSION

    defaultConfig {
        minSdkVersion Integer.parseInt(project.MIN_SDK)
        targetSdkVersion  Integer.parseInt(project.Android_BUILD_TARGET_SDK_VERSION)
    }

    signingConfigs {
        release {
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('xxx')
            storePassword 'xxx'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
            signingConfig signingConfigs.release
            debuggable false
            jniDebuggable false
            zipAlignEnabled true
        }
        debug {
            minifyEnabled false
            debuggable true
        }
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':firebase_plugin')
}

ライブラリモジュールのbuild.gradle:

apply plugin: 'com.Android.library'
Android {

    compileSdkVersion 19
    buildToolsVersion project.Android_BUILD_TOOLS_VERSION
    defaultConfig {
        minSdkVersion Integer.parseInt(project.MIN_SDK)
        targetSdkVersion Integer.parseInt(project.Android_BUILD_TARGET_SDK_VERSION)
    }

    buildTypes {
        release {
            minifyEnabled true
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
        }
        debug {
            minifyEnabled false
            debuggable true
        }
    }

    productFlavors {
    }

}

dependencies {
    // Facebook SDK
    compile project(':facebook')

    // Used for StringUtils
    compile files('libs/commons-lang3-3.3.2.jar')
    // Bug tracking
    compile files('libs/bugsense-3.6.1.jar')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //Google Play Services - For Google Maps
    compile('com.google.Android.gms:play-services:5.0.89') {
        exclude group: 'com.google.Android', module: 'support-v4'
    }
    // Support Library.
    compile 'com.Android.support:support-v13:18.0.+'

    compile('com.Android.support:appcompat-v7:19.1.0') {
        exclude group: 'com.google.Android', module: 'support-v4'
    }
    // Volley - Networking library from google.
    compile('com.mcxiaoke.volley:library:1.0.0') {
        exclude group: 'com.google.Android', module: 'support-v4'
    }
    // Has is own support library in it so need to exclude it so no TOP_LEVEL_EXCEPTION will occur.
    compile('de.greenrobot:greendao:1.3.0') {
        exclude group: 'com.google.Android', module: 'support-v4'
    }
    // Firebase
    compile('com.firebase:firebase-simple-login:1.4.2') {
        exclude group: 'com.Android.support', module: 'support-v4'
    }
    // Super Toast
    compile('com.github.johnpersano:supertoasts:1.3.4@aar') {
        exclude group: 'com.Android.support', module: 'support-v4'
    }
    // Croping images
    compile('com.soundcloud.Android:android-crop:0.9.10@aar') {
        exclude group: 'com.Android.support', module: 'support-v4'
    }
    compile('com.github.chrisbanes.actionbarpulltorefresh:library:0.9.9') {
        exclude group: 'com.Android.support', module: 'support-v4'
    }
}


    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':firebase_plugin')
}

enter image description here

63
olik79

この問題のコメントで述べたように、デバッグビルドでminifyEnabled falseを設定することがベストプラクティスです。 appモジュールでこの変数を設定することにより、プロガードビルドプロセス全体を無効にします。リリースビルドを最適化するときに役立ちますが、テストと開発をしている場合はいくつかの問題が発生します。

84
droidpl

まだ完全には理解していませんが、解決しました。問題は、@ Feanturyが示唆したように、ProGuardがまだアクティブであったことです。私が想像できるすべてのbuild.gradleの位置でminifyEnabled falseを指定したので、なぜそうなのかわかりませんが、効果はなかったようです。

数分前にクラッシュしたため、スタックトレースに次のような行が表示されました。

Java.lang.NullPointerException
        at com.example.MyClass(Unknown Source)
        ...

そのため、ProGuardは私にとって一番の疑いがありました。いくつかの周りを検索した後、 別のSO質問 が見つかりましたUnknown Sourceの問題。 ProGuardを有効にしてデバッグするための提案されたソリューションを試してみましたが、うまくいきました!

次の行をproguard-rules.txtに追加するだけです。

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable
15
olik79

olik79の答えに加えて、この2行を追加すると、フラグメント内のブレークポイントにアプリがヒットします。そうでない場合、フラグメントをベイパスする可能性があります

-keep public class * extends Android.support.v4.** {*;}
-keep public class * extends Android.app.Fragment

これは、sdk\tools\proguardのproguard-Android.txtの完全な編集です。

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn Android.support.**

-keep class !Android.support.v7.internal.view.menu.**,Android.support.** {*;}
-ignorewarnings
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

-keep public class * extends Android.support.v4.** {*;}
-keep public class * extends Android.app.Fragment
9
smoothumut

Kotlinコードをデバッグしようとして問題が発生しました。デバッガーはどのブレークポイントでも停止していませんでした。 Instant runの問題であることがわかりました。プロジェクトからすべてのビルドディレクトリを削除し、インスタントランを無効にした後、アプリをアンインストールしました。

無効にするにはInstant runに移動しますFile> Settings> Build、execution、deployment> Instant run> Enable Instant Runのチェックを外します

2
vovahost

実際、Android St​​udioには既知の問題があります。 Gradleプラグインはデバッグ/リリースを依存関係に伝播しません 。少なくともA Studio 1.4および1.5で発生するようです。

アプリがデバッグでコンパイルされると、そのモジュールは実際にリリースでコンパイルされます。そのため、デバッグでプロガードを有効にすることができます。

私はこれをお勧めします answer それは私のために働いた。

1
Hartok