签名apk在proguard启用时崩溃

时间:2017-05-17 18:38:49

标签: android proguard android-proguard signed-apk

我正在尝试在我的app中使用proguard将proguard设置为true然后问题开始我在导入lib时使用proguard跟随this -keepnames class com.somepackage.*使用我的软件包名称,当我尝试使用已签名的apk时,应用程序正在崩溃。我知道这是一个愚蠢的问题,但我坚持这个最后5小时无法找到一个简单的解决方案因为我使用大约20 lib。我跟着this also。 Plz指导我这个怎么办?

这是我的proguard规则类代码

-keepnames class beatbox.neelay.dummybeat.*
-keepnames com.srx.widget.*
-keepnames de.hdodenhof.circleimageview.CircleImageView.*
-keepnames com.bumptech.glide.*
-keepnames com.romainpiel.shimmer.*
-keepnames com.vansuita.gaussianblur.GaussianBlur
-keepnames com.antonyt.infiniteviewpager.InfinitePagerAdapter
-keepnames com.antonyt.infiniteviewpager.InfiniteViewPager
-keepnames com.eftimoff.viewpagertransformers.CubeOutTransformer
-keepnames com.ms.square.android.glassview.GlassView
-keepnames me.alexrs.fontpagertitlestrip.lib.FontPagerTitleStrip

我现在无法生成任何已签名的apk。错误是。

Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
  

作业失败,请参阅日志了解详情

任何提示都会有所帮助。 控制台输出

FAILURE: Build failed with an exception.
  • 出了什么问题: 任务执行失败':app:transformClassesAndResourcesWithProguardForRelease'。

      

    作业失败,请参阅日志了解详情

  • 尝试: 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。

编辑build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.1"
defaultConfig {
    applicationId "beatbox.neelay.dummybeat"
    minSdkVersion 16
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    renderscriptTargetApi 24
    renderscriptSupportModeEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    vectorDrawables.useSupportLibrary = true
}
lintOptions {
    checkReleaseBuilds false
    abortOnError false
}
buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

repositories {
jcenter()
mavenCentral()
maven { url "https://jitpack.io" }
maven { url 'http://Manabu-GT.github.com/GlassView/mvn-repo' }
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile project(':foldingtabbar')
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
compile 'com.android.support:design:25.2.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.intuit.sdp:sdp-android:1.0.4'
compile 'com.leo.simplearcloader:simplearcloader:1.0.1'
compile 'com.ms.square:glassview:0.1.0'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.romainpiel.shimmer:library:1.4.0@aar'
compile 'com.github.StephenVinouze:ShapeView:1.1.0'
compile 'com.eftimoff:android-viewpager-transformers:1.0.1@aar'
compile 'com.github.antonyt:InfiniteViewPager:v1.0.0'
compile 'me.alexrs:font-pager-titlestrip:1.0.0'
compile 'com.github.florent37:arclayout:1.0.1'
compile 'com.android.support:cardview-v7:25.1.0'
compile 'com.android.support:support-v4:25.1.0'
compile 'com.github.jrvansuita:GaussianBlur:v1.0.2'
compile 'com.google.code.gson:gson:2.7'
compile 'com.android.support:support-vector-drawable:25.2.0'
testCompile 'junit:junit:4.12'
}

我试过proguard-rule.pro

的另一种方式
-keepnames class beatbox.neelay.dummybeat.**{*;}
-keepnames class com.srx.widget.**{*;}
-keepnames class de.hdodenhof.circleimageview.CircleImageView.**{*;}
-keepnames class com.bumptech.glide.**{*;}
-keepnames class com.romainpiel.shimmer.**{*;}
-keepnames class com.vansuita.gaussianblur.**{*;}
-keepnames class com.antonyt.infiniteviewpager.**{*;}
-keepnames class com.eftimoff.viewpagertransformers.**{*;}
-keepnames class com.ms.square.android.glassview.**{*;}
-keepnames class me.alexrs.fontpagertitlestrip.lib.FontPagerTitleStrip**{*;}

dependency tree

5 个答案:

答案 0 :(得分:4)

原因: 并不是每个类或库都在启用Proguard的情况下进行了优化,所以Proguard所做的就是如果它们没有进行优化就会删除类,这会导致项目中的崩溃和错误。

解决方案:在您的proguard.cfg文件保留那些progaurd不支持的类或​​库。尝试这里描述的所有捕获:
尝试添加:

-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }


或者,如果您使用的是v4 lib:

-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-dontwarn android.support.v7.**
-keep class android.support.v7.** { *; }


如果您使用的是最新的android studio,您可能会将其发现为proguard-rules.pro


在您的情况下,尝试使用 -dontwarn以及classname。像你的错误表明它无法优化circleimageview库。所以也尝试添加它:

-dontwarn hdodenhof.**
-keep class hdodenhof.**


如果仍然无法降级你的circleimageview库:
compile 'de.hdodenhof:circleimageview:1.3.0'这对我有用。

答案 1 :(得分:2)

1)保留所有注释

-keepattributes SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,Signature,Exceptions,InnerClasses

2)如果您有任何用于网络呼叫的pojos或模型和类

,请保留

例如:

-keep class com.example.android.models.**
-keepclassmembers class com.example.android.models.** {
      *;
}
-keepclassmembers class com.example.android.network.** {
  public void set*(***);
  public *** get*();
  public *** is*();
}

3)对于您使用的所有库,请遵守proguard规则

例如:

-dontwarn com.zl.reik.dilatingdotsprogressbar.**
-keep class com.zl.reik.dilatingdotsprogressbar.**{*;}
-keep interface com.zl.reik.dilatingdotsprogressbar.**{*;}

您甚至需要为" foldingtabbar"保留类似的proguard规则,因为它也是一个库

如果上述解决方案无法解决,您的存储库中的run ./gradlew app:dependencies并向我发送依赖项列表

答案 2 :(得分:1)

为所有支持库提供相同版本也非常重要。有时库具有递归依赖性,其中每个都有不同的版本,可能导致此错误。运行:

./gradlew app:dependencies

查看每个库的依赖关系并检查它们是否都具有相同的版本。我已经看到,您使用25.1.0和25.2.0版本的支持库。另外,你的一些库是旧的,因此它们可能使用旧版本。

尝试使用:

-keep class beatbox.neelay.dummybeat.**{*;}
-dontwarn beatbox.neelay.dummybeat.**

而不是:

-keepnames beatbox.neelay.dummybeat.**{*;}

答案 3 :(得分:0)

Proguard删除了属于添加应用程序的依赖项的一部分的类。尽量使用它们:

-keep class hdodenhof.**
-keep class android.support.v4.** { *; }
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }

禁用依赖类的警告:

-dontwarn hdodenhof.**
-dontwarn android.support.v4.**
-dontwarn android.support.v7.**

答案 4 :(得分:-4)

在您的代码中:

minifyEnabled true

制作本

 minifyEnabled false

希望它有所帮助:)