簡體   English   中英

已簽名的應用程序崩潰且未簽名的APK運行

[英]Signed app crashing and unsigned apk running

這個問題可能與一些SO問題有關,因為我在這里搜索了很多內容,但是沒有任何帖子對我有所幫助。 我的應用程序在未簽名的情況下運行,但在運行已簽名的APK時立即崩潰。 我把它debuggable true放在gradle中,並檢查我發現此錯誤logcat。

java.lang.NoSuchFieldError: No static field REPLACE of type Lcom/a/a/a$a; in class Lcom/a/a/a$a; or its superclasses (declaration of 'com.a.a.a$a' appears in /data/app/com.aami.aruman.com-J1sPXkw9O_ZNL4zfcpqgMQ==/base.apk)
    at java.lang.reflect.Field.getAnnotationNative(Native Method)
    at java.lang.reflect.Field.getAnnotation(Field.java:847)
    at com.a.g.<init>(Unknown Source:94)
    at com.a.f.a(Unknown Source:97)
    at com.a.f.a(Unknown Source:126)
    at com.a.f.<init>(Unknown Source:27)
    at com.a.b.a(Unknown Source:22)
    at com.a.a.a(Unknown Source:3)
    at com.a.a.a(Unknown Source:1)
    at com.a.a.a(Unknown Source:9)
    at com.a.b.a.onCreate(Unknown Source:3)
    at com.aami.aruman.com.codingnation.base.DroiderApplication.onCreate(Unknown Source:0)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5747)
    at android.app.ActivityThread.-wrap1(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6501)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
07-12 22:22:18.355 13073-13073/com.aami.aruman.com E/UncaughtException: java.lang.NoSuchFieldError: No static field REPLACE of type Lcom/a/a/a$a; in class Lcom/a/a/a$a; or its superclasses (declaration of 'com.a.a.a$a' appears in /data/app/com.aami.aruman.com-J1sPXkw9O_ZNL4zfcpqgMQ==/base.apk)
    at java.lang.reflect.Field.getAnnotationNative(Native Method)
    at java.lang.reflect.Field.getAnnotation(Field.java:847)
    at com.a.g.<init>(Unknown Source:94)
    at com.a.f.a(Unknown Source:97)
    at com.a.f.a(Unknown Source:126)
    at com.a.f.<init>(Unknown Source:27)
    at com.a.b.a(Unknown Source:22)
    at com.a.a.a(Unknown Source:3)
    at com.a.a.a(Unknown Source:1)
    at com.a.a.a(Unknown Source:9)
    at com.a.b.a.onCreate(Unknown Source:3)
    at com.aami.aruman.com.codingnation.base.DroiderApplication.onCreate(Unknown Source:0)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5747)
    at android.app.ActivityThread.-wrap1(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6501)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我在帖子中看到過,發布build.gradle可以很容易地理解錯誤,所以這里是。

buildscript {
repositories {
    maven { url 'https://maven.fabric.io/public' }
}

dependencies {
    classpath 'io.fabric.tools:gradle:1.+'
 }
}

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}


android {
    compileSdkVersion 26
    useLibrary 'org.apache.http.legacy'
    buildToolsVersion '27.0.3'
    defaultConfig {
        multiDexEnabled true
        applicationId "com.aami.aruman.com"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"


    }
    android {
        lintOptions {
            checkReleaseBuilds false
            abortOnError false
        }
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES.txt'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/maven/pom.properties'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/notice.txt'
            exclude 'META-INF/license.txt'
            exclude 'META-INF/dependencies.txt'
            exclude 'META-INF/LGPL2.1'
            exclude 'META-INF/gson/FieldAttributes.class'
            exclude '.readme'
        }
    }
    buildTypes {
        release {
            debuggable true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.google.firebase:firebase-messaging:12.0.1'
    implementation 'com.android.support:appcompat-v7:26.1.+'
    implementation 'com.android.support:gridlayout-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.facebook.android:facebook-android-sdk:4.10.0'
    implementation 'com.android.support:design:26.1.+'
    implementation 'com.android.support:recyclerview-v7:26.1.0'
    implementation 'com.android.support:cardview-v7:26.1.0'
    implementation 'de.hdodenhof:circleimageview:1.3.0'
    implementation 'com.google.android.gms:play-services-places:12.0.1'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.google.android.gms:play-services-maps:12.0.1'
    implementation 'com.android.volley:volley:1.1.0'
    implementation 'com.github.bumptech.glide:glide:3.7.0'
    implementation 'com.squareup.picasso:picasso:2.71828'
    implementation 'com.github.lzyzsd:circleprogress:1.2.1'
    implementation 'com.romandanylyk:pageindicatorview:0.2.0'
    implementation 'com.nshmura:snappysmoothscroller:1.0.0'
    implementation 'com.codemybrainsout.rating:ratingdialog:1.0.8'
    implementation 'org.adw.library:discrete-seekbar:1.0.1'
    implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    implementation 'com.google.firebase:firebase-auth:12.0.1'
    implementation 'com.google.firebase:firebase-storage:12.0.1'
    implementation 'com.google.firebase:firebase-core:12.0.1'
    implementation 'com.facebook.fresco:fresco:1.3.0'
    implementation 'com.google.android.gms:play-services-auth:12.0.1'
    implementation 'com.google.android.gms:play-services-location:12.0.1'
    implementation 'com.rengwuxian.materialedittext:library:2.1.4'
    implementation 'com.nispok:snackbar:2.11.+'
    implementation 'com.github.ybq:Android-SpinKit:1.1.0'
    implementation 'com.gmail.samehadar:iosdialog:1.0'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'joda-time:joda-time:2.9.4'
    implementation 'com.crystal:crystalrangeseekbar:1.1.3'
    implementation 'com.google.firebase:firebase-crash:12.0.1'
    implementation 'com.github.clans:fab:1.6.2'
    implementation('com.crashlytics.sdk.android:crashlytics:2.9.2@aar')      {
        transitive = true
    }
    implementation 'com.github.florent37:singledateandtimepicker:2.0.5'
    implementation 'com.getbase:floatingactionbutton:1.10.1'
    implementation 'com.payumoney.sdkui:plug-n-play:1.3.0'
    implementation 'com.amitshekhar.android:jackson-android-networking:1.0.1'
    implementation 'com.daasuu:animateHorizontalProgressBar:0.2.4'
}
apply plugin: 'com.google.gms.google-services'

最后,這是proguard

-dontwarn org.apache.**
-dontwarn javax.annotation.**
-dontwarn com.squareup.picasso.**
-dontwarn okio.**
-keep class com.google.**
-dontwarn com.google.**
-keepattributes Signature
-dontwarn retrofit2.Platform$Java8
# For using GSON @Expose annotation
-keepattributes *Annotation*
-dontwarn org.**
-dontwarn javax.**
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }


-keep class com.squareup.okhttp.{ *; }
-dontwarn com.squareup.okhttp.**
-keep class com.facebook.{ *; }
-dontwarn com.facebook.**
-keep class ohttp3.{ *; }
-dontwarn okhttp3.**
-keep class org.joda.{ *; }
-dontwarn org.joda.**
-keepclassmembers class * {

    private <fields>;
    }
    # Proguard configuration for Jackson 2.x (fasterxml package instead of codehaus package)
    -keep class com.fasterxml.jackson.databind.ObjectMapper {
        public <methods>;
        protected <methods>;
    }
    -keep class com.fasterxml.jackson.databind.ObjectWriter {
        public ** writeValueAsString(**);
    }
    -keepnames class com.fasterxml.jackson.** { *; }

-keepclassmembers class com.aami.aruman.com.codingnation.beans.** { *; }


-dontwarn com.fasterxml.jackson.databind.**
-dontwarn org.springframework.**

關於Proguard

通過執行以下兩項操作,Proguard基本上使您的代碼更小且更難進行反向工程:

  1. 剝離未使用的代碼
  2. 通過重命名您寫給盡可能小(且難以閱讀)的名稱的易讀符號來混淆包和符號名。

關於您的問題

看起來有些東西正在使用Java反射來查找名為REPLACE的字段,但是該字段被proguard混淆了。

從您發布的堆棧跟蹤中,這是:

com.a.g.<init>(Unknown Source:94)

是進行反射調用的代碼。

那么到底com.ag<init>什么呢? 這是一個類的混淆名稱。 <init>告訴我這是某種類的構造函數。

但是為了弄清楚ag是什么,您需要在真實符號和proguard為其分配的符號之間進行某種映射。

當proguard運行時,它將生成一個符號映射文件。 您可以使用Android SDK隨附的proguard工具隨附的retrace.sh腳本(如果您在Windows上進行開發,則可以使用retrace.bat)來模糊處理堆棧跟蹤,前提是您仍然有此映射文件並弄清楚了該映射文件的位置在您的代碼中。

就像是:

<androidsdkroot>/tools/proguard/bin/retrace.sh -verbose mapping.txt stacktrace.txt > out.txt

哪里:

  • mapping.txt是proguard運行時創建的映射文件
  • stacktrace.txt包含您在問題中發布的原始堆棧跟蹤
  • out.txt是用於接收未混淆的堆棧跟蹤的文件名。

一旦確定了這一點,就需要在proguard配置文件中添加一個keep規則 ,以防止混淆。 或者,如果可以代替反射代碼,則可以這樣做。

最后,如果進行反射調用的代碼來自您不擁有的庫,那么我將查看該庫的文檔,看看它是否調用了您應添加到proguard配置文件中的任何保留規則,並且添加它們。

請參閱Android Shrink Code文檔,以了解有關解碼混淆堆棧跟蹤的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM