我刚开始使用Proguard,所以我可能会犯一个新手的错误.我有一个应用程序,在我运行发布版本(使用Proguard进行混淆)后,它很快就崩溃了.我相信我已经将它缩小到这样一个事实,即它似乎混淆了我的参考库.在我的例子中,我的参考库用于定义我用于使用Google Protobuffers与其他设备通信的消息类.我正在使用,ant释放.我的proguard配置是:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class *
{
native <methods>;
}
-keepclasseswithmembernames class *
{
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class *
{
public <init>(android.content.Context, android.util.AttributeSet, int);
} …
Run Code Online (Sandbox Code Playgroud) 我想在一个使用android库项目的android应用程序中使用proguard ,我收到以下错误:
java.io.IOException: Can't write
[/private/var/folders/Pg/PgUpPJQ-E5qxL7jX6kpdCE+++TI/-Tmp-/android_3140050575281008652.jar]
(Can't read [proguard.ClassPathEntry@1f8d244]
(Duplicate zip entry
[be.class == android_144638064543155619.jar:com/comp/dp/library/R$anim.class]))
at proguard.OutputWriter.writeOutput(OutputWriter.java:224)
at proguard.OutputWriter.execute(OutputWriter.java:120)
at proguard.ProGuard.writeOutput(ProGuard.java:391)
at proguard.ProGuard.execute(ProGuard.java:152)
at proguard.ProGuard.main(ProGuard.java:499)
Run Code Online (Sandbox Code Playgroud)
我的proguard.cfg文件就是这个,还有一些-libraryjars
引用了rt.jar
几个其他依赖库.
我的猜测是这个问题与使用Library Project有关,而proguard正在尝试两次处理来自库项目的条目.但我不确定应该用哪种方法来解决这个问题.
任何建议/方向都非常感谢.
更新1: 通过删除-injars bin/classes
我能够解决这个问题.我的猜测是因为proguard处理库项目和应用程序项目.class
库项目的文件被处理了两次.一旦进入库项目的bin/classes
文件夹,另一次进入应用程序项目的bin/classes
文件夹.
我正在尝试将第三方库(JmDNS)添加到我的Android项目中.
我在基础项目目录下创建了一个文件夹'libs',并将jar文件放在目录中.
当我尝试使用Ant(ant release)构建项目时,我收到了一个'重复定义'的注意事项,看起来是JmDNS jar文件中的每个类.
....
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.Canceler]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.DNSStateTask]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.Prober]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.Renewer]
[proguard] Note: duplicate definition of library class [javax.jmdns.impl.tasks.state.package-info]
[proguard] Note: duplicate definition of library class [javax.jmdns.package-info]
[proguard] Note: there were 357 duplicate class definitions.
Run Code Online (Sandbox Code Playgroud)
构建也失败,出现以下错误:
BUILD FAILED
/path/Tools/ant-android-scala/build-scala.xml:183: Can't write [/path/bin/projectname-debug-shrinked.jar] (Can't read [/path/projectname/libs/jmdns.jar(;;;;!META-INF/MANIFEST.MF,!library.properties)] (Duplicate zip entry [jmdns.jar:javax/jmdns/JmDNS$Delegate.class]))
Run Code Online (Sandbox Code Playgroud)
我已经确保jar文件只包含一次,并且没有其他方法可以在项目的任何位置包含重复的源文件.
为什么Proguard会抱怨重复的定义呢?
在我的Android应用程序中,我在libs文件夹中有多个第三方库
ex -: httpcore-4.2.4.jar , httpmime-4.2.5.jar,twitter4j-core-4.0.1.jar
Run Code Online (Sandbox Code Playgroud)
这些库没有重复,我很确定,但是当我创建proguard版本时,我得到了这个错误
(Duplicate zip entry [twitter4j-core-4.0.1.jar:META-INF/MANIFEST.MF])
.... (This error occurs for all of the library(libs)
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我试着用这个链接来解决,我尝试了它的每一个选项,但没有运气,
Proguard警告"无法写入资源[META-INF/MANIFEST.MF](重复的zip条目)"
有没有办法在输入jar上指定过滤器
首先我知道stackoverflow中已经存在这个问题,但是我无法解决它,尽管我尝试了不使用-injar、使用packagingOptions等建议
我知道这个版本会起作用,但我喜欢干净的构建。当我生成签名的 apk 时。项目清理后,我收到这些错误:
Warning:can't write resource [.readme] (Duplicate zip entry [classes.jar:.readme])
Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [joda-time-2.8.1.jar:META-INF/LICENSE.txt])
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [joda-time-2.8.1.jar:META-INF/NOTICE.txt])
Run Code Online (Sandbox Code Playgroud)
有时代替 joda-time-2.8.1.jar 有 commons-collections4-4.0.jar (相同的 .readme, licence, notice)警告。
我尝试排除那些带有包装选项的人,但它不起作用。
这是我的模块的 build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude '.readme'
}
defaultConfig {
applicationId 'com.example.myapp'
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName '0.1'
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} …
Run Code Online (Sandbox Code Playgroud) 我在Android Studio 2.3.0 beta4中有一个Android项目,它依赖于库项目CoolLib.
CoolLib的源文件位于libs文件夹中的jar文件coolLib.jar中.coolLib.jar包含文件{pkg} /BuildConfig.class.
当我尝试在Android API-22 +的设备/模拟器中构建和运行项目时,它运行得很好但是当我尝试在API VERSION <22的设备/模拟器上执行相同操作时,Android Studio 无法使用例外 -
警告:处理任务java.io.IOException时出现异常:无法写入[D:\ AndroidStudioProjects\CoolProject\app\build\intermediates\transforms\proguard\debug\jars\3\1f\main.jar](不能阅读[D:\ AndroidStudioProjects\CoolProject\CoolLib\build\intermediates\bundles\default\libs\coolLib.jar(;;;;;;**.class)](重复的zip条目[coolLib.jar:{pkg}/BuildConfig.class])):app:transformClassesAndResourcesWithProguardForDebug FAILED
项目的build.gradle包含以下版本的支持lib等.--
ext {
supportLibVer = '25.1.1'
playServiceVer = '10.0.1'
buildToolsVer = "25.0.2"
compileSdkVer = 25
targetSdkVer = 25
minSdkVer = 16
}
dependencies {
compile files('libs/FLurry_3.2.2.jar')
compile files('libs/jxl-2.6.12.jar')
compile project(':CoolLib')
compile files('libs/gcm.jar')
compile "com.google.android.gms:play-services-ads:$playServiceVer"
compile "com.android.support:appcompat-v7:$supportLibVer"
compile "com.android.support:design:$supportLibVer"
compile "com.android.support:cardview-v7:$supportLibVer"
compile "com.android.support:support-v13:$supportLibVer"
compile 'com.github.bumptech.glide:glide:3.7.0'
}
Run Code Online (Sandbox Code Playgroud)