我为我的Android项目运行ProGuard并收到以下警告:
Note: duplicate definition of library class [org.apache.http.conn.scheme.HostNameResolver]
Note: duplicate definition of library class [org.apache.http.conn.scheme.SocketFactory]
Note: duplicate definition of library class [org.apache.http.conn.ConnectTimeoutException]
Note: duplicate definition of library class [org.apache.http.params.HttpParams]
Note: duplicate definition of library class [android.net.http.SslCertificate$DName]
Note: duplicate definition of library class [android.net.http.SslError]
Note: duplicate definition of library class [android.net.http.SslCertificate]
Note: there were 7 duplicate class definitions.
Run Code Online (Sandbox Code Playgroud)
我发现这里解决了这个问题而忽略了它:
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-keep class android.net.http.** { *; }
-dontwarn android.net.http.**
Run Code Online (Sandbox Code Playgroud)
我没有看到从已使用的库中删除重复项的方法.即使使用dontwarn
警告后也不会消失.
这是处理此警告的正确方法,只是忽略它或者这会导致问题吗?
我看到Gradle的Android插件有一个minifyEnabled
属性和useProguard
属性,如下所示:
android {
buildTypes {
debug {
minifyEnabled true
useProguard false
}
release {
minifyEnabled true
useProguard true
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两个属性有什么区别?或者说,每个人的意义是什么?
android gradle build.gradle android-gradle-plugin android-proguard
我不知道如何描述这个问题.我搜索了很多,但我找不到任何解决方案.
此解决方案也没有帮助我-keepattributes EnclosingMethod:
dependencies {
compile project(':libraries:material-drawer')
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:recyclerview-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
compile 'com.google.code.gson:gson:2.4'
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'de.greenrobot:eventbus:2.4.0'
compile 'com.commit451:PhotoView:1.2.4'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.viewpagerindicator:viewpagerindicator:2.4.3'
compile('com.github.afollestad.material-dialogs:commons:0.8.5.6@aar') {
transitive = true
}
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
transitive = true;
}
}
Run Code Online (Sandbox Code Playgroud)
并且jar文件夹包含ormlite-android-4.48.jar
和ormlite-core-4.48.jar
.
Proguard文件:
-keepattributes EnclosingMethod
-dontobfuscate
-keep public class * extends android.support.v4.view.ActionProvider {
public <init>(android.content.Context);
}
-dontwarn android.support.v4.**
#FOR APPCOMPAT 23.1.1:
-keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { …
Run Code Online (Sandbox Code Playgroud) 每次运行我的项目时都会收到此错误.我可以做一个清洁,然后再次运行,它的工作原理.但它不是最佳解决方案.有任何想法吗?
Error:Execution failed for task ':android:transformClassesAndResourcesWithProguardForRelease'.
Run Code Online (Sandbox Code Playgroud)
java.io.IOException:无法将android\build\intermediates\transforms\proguard\release\folders\3\1f\main\classes.jar重命名为android\build\intermediates\transforms\proguard\release\jars\3\1f\classes.jar
所以看起来最新的播放服务中存在一个错误.有谁知道如何解决这个问题?
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug'.
> ProGuard configuration parser error: /Users/myusername/.gradle/caches/transforms-1/files-1.1/play-services-base-11.8.0.aar/d2ad9e16677fda9cf07a1280a66e91ca/proguard.txt line 3:88 no viable alternative at input '<fields>'
Run Code Online (Sandbox Code Playgroud)
更多信息.似乎问题出在核心模块中:
Error:Execution failed for task ':myappname:transformClassesWithAndroidGradleClassShrinkerForDevelopmentDebug'.
> ProGuard configuration parser error: /Users/myusername/.gradle/caches/transforms-1/files-1.1/play-services-base-11.8.0.aar/d2ad9e16677fda9cf07a1280a66e91ca/proguard.txt line 3:88 no viable alternative at input '<fields>'
Run Code Online (Sandbox Code Playgroud)
编辑:导致该错误的文件的内容是:
# b/35135904 Ensure that proguard will not strip the mResultGuardian.
-keepclassmembers class com.google.android.gms.common.api.internal.BasePendingResult {
com.google.android.gms.common.api.internal.BasePendingResult.ReleasableResultGuardian <fields>;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的Xamarin.Android项目中使用Proguard,但编译失败并出现错误 Unsupported class version number [52.0] (maximum 51.0, Java 1.7)
我从这两个 问题中看到,它可能与Java 7和Java 8不匹配,更确切地说,某些版本的proguard不支持Java 8.但是在Xamarin首选项 - > SDK位置中,Java SDK指向JDK 7:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
是否有更精确配置proguard的地方?还有其他想法吗?
这是失败日志:
java.io.IOException:无法读取[/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.0-18/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar](可以在proguard.InputReader.readInput中的proguard.InputReader.readInput(InputReader.java:230)处理类[android/app/ActivityTracker.class](不支持的类版本号[52.0](最大51.0,Java 1.7))) InputReader.java:200)在proguard.InputReader.readInput(InputReader.java:178)的proguard.InputReader.exe执行(InputReader.java:78)proguard.ProGuard.readInput(ProGuard.java:196)proguard.ProGuard.执行(ProGuard.java:78)在proguard.ProGuard.main(ProGuard.java:492)引起:java.io.IOException:无法处理类[android/app/ActivityTracker.class](不支持的类版本号[ 52.0](最大51.0,Java 1.7))proguard.io.ClassReader.read(ClassReader.java:112)位于proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)的proguard.io.JarReader.read(JarReader) .java:65)在proguard.io.Director progPard.readFiles(DirectoryPump.java:65)中的progPard.EndoryPump.pumpDataEntries(DirectoryPump.java:53)中的yPump.readFiles(DirectoryPump.java:65)... 6更多引起者:java.lang. UnsupportedOperationException:proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:88)中proguard.classfile.util.ClassUtil.checkVersionNumbers(ClassUtil.java:140)中不支持的类版本号[52.0](最大51.0,Java 1.7)在proguard.classfile.ProgramClass.accept(ProgramClass.java:346)的proguard.io.ClassReader.read(ClassReader.java:91)... 11更多
9警告1错误
当我想使用Proguard规则生成签名的APK(发布)时,我收到此错误消息:
找不到满足版本限制的'com.android.support:support-annotations'版本:依赖路径'Transition:library:unspecified' - >'com.android.support.test:runner:1.0.2' - - >'com.android.support:support-annotations:27.1.1'约束路径'转换:库:未指定' - >'com.android.support:support-annotations'严格'26 .1.0'因为以下原因原因:debugRuntimeClasspath使用版本26.1.0 ...
Gradle(app):
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 21
targetSdkVersion 26
}
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-
android.txt'),'proguard-rules.pro'
}
}
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleCompatible
implementation 'com.android.support:support-compat:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-annotations:28.0.0'
//noinspection GradleCompatible
implementation 'com.android.support:cardview-v7:28.0.0'
//noinspection GradleCompatible
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.android.support:appcompat-v7'
api 'com.google.android.gms:play-services:12.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation …
Run Code Online (Sandbox Code Playgroud) 谷歌已经为Android开发者发布了针对Android Studio 2.1 的新JACK编译器测试版.
我的问题是,我们如何使用JACK为APK进行模糊处理?下面的文章说JACK 本地执行模糊处理并且不需要Proguard:
以下文章说JACK使用Proguard配置文件(即.pro
文件)来执行混淆:
它也说
在此过程中,Jack还处理任何请求的代码缩小(缩小和/或混淆).
这到底是什么意思?我们是否必须使用该minifyEnabled
选项并定义.pro
包含Proguard选项的文件?
综上所述:
我们究竟如何与JACK实现混淆?我们是否可以绕过Proguard的使用,或者Proguard在混淆过程中扮演事实上的角色,即使我们使用JACK编译?
JACK目前是否支持混淆,是否可以在Android Studio的稳定(即非beta/canary)版本中使用?
注意:
我已经提到了以下帖子:
进一步参考:
更新:
android android-sdk-tools android-studio android-jack-and-jill android-proguard
在我buildType
看来这个:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
我有一些问题:
我正在使用Gradle创建一个具有不同风格的构建.它过去一直很好,直到现在,直到我想启用Proguard
.我启用minifyEnabled
了Release Build,现在我有一个例外说:
" Caused by: org.gradle.internal.UncheckedException: java.io.IOException: The output jar [.../app/build/intermediates/multi-dex/dev/release/componentClasses.jar] must be specified after an input jar, or it will be empty.
"
有人知道造成这种异常的原因吗?在发布我的应用程序之前,我基本上想要启用ProGuard.这是我的Gradle文件,如下所示.
lintOptions {
abortOnError false
}
dexOptions{
incremental true
javaMaxHeapSize "4g"
}
defaultConfig {
applicationId "..."
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
} …
Run Code Online (Sandbox Code Playgroud) android proguard gradle android-gradle-plugin android-proguard
android-proguard ×10
android ×9
proguard ×4
gradle ×2
build ×1
build.gradle ×1
java ×1
xamarin ×1