签名的 apk 在 proguard enable 中崩溃

Posted

技术标签:

【中文标题】签名的 apk 在 proguard enable 中崩溃【英文标题】:Signed apk getting crashed in proguard enable 【发布时间】:2017-10-17 08:51:25 【问题描述】:

我正在尝试在我的应用程序中使用 proguard 将 proguard 设置为 true,然后问题开始我在使用 proguard 时按照this 导入 lib -keepnames class com.somepackage.* 使用我的包名称,当我尝试使用签名的 apk 时,应用程序正在崩溃。我知道这是一个愚蠢的问题,但我在过去的 5 小时里一直被困在这个问题上,因为我使用了大约 20 个库,所以无法找到一个简单的解决方案。我关注了this also。请指导我,我该怎么做?

这是我的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

【问题讨论】:

日志没有显示任何东西兄弟这是问题,否则我几乎添加了所有东西 数据正在从系统中加载,但随后应用崩溃且没有日志 你有正确的控制台可见吗? 查看更新问题对不起,我没有开始,现在我知道了。请指导我 运行./gradlew --stacktrace :app:transformClassesAndResourcesWithProguardForRelease 看看你会得到什么。 【参考方案1】:

原因: 并非每个类或库都在启用 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 库:

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

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

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

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

如果仍然无法正常工作,请降级您的 circleimageview 库:compile 'de.hdodenhof:circleimageview:1.3.0' 这对我有用。

【讨论】:

先生,我是否必须声明仅以 xml 形式使用的库,例如卡片视图库和其他库 先生,我添加了依赖树,您现在可以检查一下吗 @SAVVY 是的,如果 Proguard 未对其进行优化,则必须这样做 .. 它会在日志中为您的库提供一些警告 .. 在 xml 或类中使用它并不重要,它将与其他类和库一起编译。 bhai 我按照你说的尝试过,但是运行时它仍然会崩溃,如你所说可以告诉我如何声明 lib 这是我的依赖树 gist.github.com/neelayak/ef0fa83f9397c34eac0ac9cf60aa02a3【参考方案2】:

1) 保留所有注释

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

2) 如果您有任何用于网络调用的 pojo 或模型和类,请保留

例如:

-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 在你的存储库中并将依赖项列表发送给我

【讨论】:

先生,我添加了依赖树,您现在可以检查一下吗【参考方案3】:

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

./gradlew app:dependencies

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

尝试使用:

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

代替:

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

【讨论】:

先生,我必须在哪里使用./gradlew app:dependencies 我试图在控制台gradel中找到它但无法找到 使用 cmd(命令行)导航到您的项目文件夹并运行命令 先生,我试过了,但它仍然崩溃,你能给我一个来自我的依赖树的样本gist.github.com/neelayak/ef0fa83f9397c34eac0ac9cf60aa02a3【参考方案4】:

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.**

【讨论】:

我应该在哪里添加这个? @red-devil 你应该在 app/proguard-rules.pro 文件中添加这些 我做了,但我仍然收到此错误任务':app:transformClassesAndResourcesWithProguardForRelease'的执行失败。在我将 maven url "jitpack.io" 添加到 react-native-spark-button 所需的 build.gradle 后,该错误开始发生。你能指导我如何解决这个问题吗?

以上是关于签名的 apk 在 proguard enable 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 无法在 proguard 错误配置中生成签名的 APK

在 Android Studio 3 中激活 proguard 生成签名 Apk 时出错

无法使用 proguard 生成签名的 apk

由于 proguard 规则,生成签名 APK 时出错

Android - 使用 Proguard 创建签名的 APK

启用 ProGuard 会导致签名 APK 生成失败?