我建立并签名的应用程序偶尔会在我的机器上发布崩溃,在logcat中我打开堆栈跟踪以获取空指针异常..但是我无法找到确切的行号?因为它说(未知来源) 例如,某些行看起来像这样
Caused by: java.lang.NullPointerException
at me.com.myapplication.a.i.d(Unknown Source)
at me.com.myapplication.MainActivity.onResume(Unknown Source)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1210)
正如您所看到的那样,我的应用程序包中没有显示行号,而是显示未知来源。
这是我这个项目的gradle配置。
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "me.com.myappliaction"
minSdkVersion 8
targetSdkVersion 21
versionCode 6
versionName "2.0"
}
signingConfigs {
signed {
storeFile file('../keystore/my.keystore')
storePassword 'xxxxxx'
keyAlias 'xxxxx'
keyPassword 'xxxxxx'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
signed {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.signed
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile project(':mycomponent')
}
该应用使用了已签名的构建版本。 我使用proguard命令使用以下语法正确读取跟踪
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
此类名称显示更好但仍然没有行号?我想知道这里究竟出了什么问题会导致行号丢失?如何在我的代码中获得显示行号的跟踪,并且仍然能够为发布做好准备?
答案 0 :(得分:6)
为了在ProGuard构建之后保留调试信息,您需要添加以下配置(到您的proguard-rules.pro文件):
-keepattributes SourceFile,LineNumberTable
# rename the source files to something meaningless, but it must be retained
-renamesourcefileattribute ''
答案 1 :(得分:3)
您还可以将mapping.txt文件上传到Google Play开发者控制台。在控制台上,只需单击要反混淆的应用程序即可。然后去&#34; Android vitals&#34; &GT; &#34; ANRs&amp;崩溃&#34;:
并上传适合您应用当前版本的mapping.txt文件。
mapping.txt的位置:
Android Studio:
\ [YOUR-PROJECT-DIR] \应用\建立\输出\映射\释放\的mapping.txt
Eclipse:
\ [ECLIPSE-WORKSPACE] \ [YOUR-PROJECT-DIR] \ proguard的\的mapping.txt
注意:只有在upload.txt上传后才会对错误进行反混淆处理。 Google Play开发者控制台中没有已经报告的崩溃的反模糊处理。
答案 2 :(得分:2)
在 build.gradle 中启用minify时会发生此错误。
minifyEnabled true
要在使用proguard时获取行号,您必须在 proguard-rules.pro
内写下以下行-keepattributes *Annotation*,SourceFile,LineNumberTable
你已经完成了。