我正在尝试在我的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**{*;}
答案 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
希望它有所帮助:)