現時点では、サードパーティのコードに基づいたAndroidアプリを開発しています。コードを理解するためにブレークポイントを設定し始め、すぐに問題に遭遇しました。突然、Android Studioをブレークポイントで停止させることができなくなりました。
onCreate
メソッド内、ボタンのOnClickListener
s内にブレークポイントを設定しようとしましたが、何も機能しませんでした。今、私はそれが動作する唯一の場所がアプリモジュール内にあることがわかりました。プロジェクトのアプリモジュールにはアクティビティクラスが1つしかなく、他のすべてはライブラリモジュール内で提供されるため、実際にはデバッグできません。
AndroidManifest.xmlまたはbuild.gradleファイルに問題があると思われます。 EclipseからAndroid Studioに切り替えたばかりなので、このgradleのすべては私にとってかなり新しいものです。
アプリの実行中にライブラリブレークポイントにカーソルを合わせると、「...行で実行可能なコードが見つかりません」と表示されます。これが私の問題の原因だと思いますが、それを修正する方法についてはわかりません。
Build.gradleのエントリの中に、問題を引き起こす可能性のある「通常の容疑者」がいますか?
私はすでにプロジェクトをきれいにし、成功せずにキャッシュを無効にしました。ライブラリモジュール内のフラグメント用に<activity>
エントリを追加する提案を試みました。
編集:最新バージョンのAndroid Studio(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')
}
この問題のコメントで述べたように、デバッグビルドでminifyEnabled false
を設定することがベストプラクティスです。 appモジュールでこの変数を設定することにより、プロガードビルドプロセス全体を無効にします。リリースビルドを最適化するときに役立ちますが、テストと開発をしている場合はいくつかの問題が発生します。
まだ完全には理解していませんが、解決しました。問題は、@ 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
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
Kotlinコードをデバッグしようとして問題が発生しました。デバッガーはどのブレークポイントでも停止していませんでした。 Instant runの問題であることがわかりました。プロジェクトからすべてのビルドディレクトリを削除し、インスタントランを無効にした後、アプリをアンインストールしました。
無効にするにはInstant runに移動しますFile> Settings> Build、execution、deployment> Instant run> Enable Instant Runのチェックを外します
実際、Android Studioには既知の問題があります。 Gradleプラグインはデバッグ/リリースを依存関係に伝播しません 。少なくともA Studio 1.4および1.5で発生するようです。
アプリがデバッグでコンパイルされると、そのモジュールは実際にリリースでコンパイルされます。そのため、デバッグでプロガードを有効にすることができます。
私はこれをお勧めします answer それは私のために働いた。