12

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

这是我的 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**{*;}

依赖

4

4 回答 4

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 与类名一起使用。就像你的错误表明它无法优化 circleimageview 库。所以尝试添加这个:

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


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

于 2017-05-26T10:23:23.690 回答
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请在您的存储库中并将依赖项列表发送给我

于 2017-05-25T03:34:31.950 回答
1

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

./gradlew app:dependencies

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

尝试使用:

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

代替:

-keepnames beatbox.neelay.dummybeat.**{*;}
于 2017-05-23T12:28:59.427 回答
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.**
于 2017-05-29T05:35:30.050 回答