【问题标题】:Error when proguard Android project保护Android项目时出错
【发布时间】:2012-01-04 06:49:15
【问题描述】:

我有项目 A,它使用项目 B 作为库项目。他们都使用 android-support-v4.jar 作为引用库。当我尝试使用 Android SDK 提供的 ant 脚本构建项目 A 时,在 -obfuscate 步骤出现以下错误:

[proguard] Preparing output jar [E:\Workspace\GuosenAndroid1.1\bin\proguard\obfuscated.jar]
[proguard]   Copying resources from program jar [E:\Workspace\GuosenAndroid1.1\bin\proguard\original.jar]
[proguard]   Copying resources from program jar [E:\Workspace\GuosenAndroid1.1\libs\android-support-v4.jar]
[proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [android-support-v4.jar:META-INF/MANIFEST.MF])
[proguard]   Copying resources from program jar [E:\Workspace\com_viewpagerindicator\bin\classes.jar]
[proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])
[proguard]   Copying resources from program jar [E:\Workspace\com_viewpagerindicator\libs\android-support-v4.jar]
[proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [android-support-v4.jar:META-INF/MANIFEST.MF])

构建失败 E:\Workspace\GuosenAndroid1.1\basicbuild.xml:723: Can't write [E:\Workspace\GuosenAndroid1.1\bin\proguard\obfuscated.jar] (Can't read [E:\Workspace\com_viewpagerindicator\ libs\android-support-v4.jar](重复的 zip 条目 [android-support-v4.jar:android/support/v4/content/ModernAsyncTask$WorkerRunnable.class]))

这是我的 proguard 配置:

-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep class android.support.** { *; }
-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);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

这是使用 Proguard 执行 -obfuscate 步骤的 ant 脚本:

<target name="-obfuscate">
    <echo>proguard enabled: ${proguard.enabled}</echo>
    <if condition="${proguard.enabled}">
        <then>
            <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" />
            <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" />
            <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" />
            <!-- input for dex will be proguard's output -->
            <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" />

            <!-- Add Proguard Tasks -->
            <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar" />
            <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" />

            <!-- Set the android classpath Path object into a single property. It'll be
                 all the jar files separated by a platform path-separator.
                 Each path must be quoted if it contains spaces.
            -->
            <pathconvert property="android.libraryjars" refid="android.target.classpath">
                <firstmatchmapper>
                    <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
                    <identitymapper/>
                </firstmatchmapper>
            </pathconvert>

            <!-- Build a path object with all the jar files that must be obfuscated.
                 This include the project compiled source code and any 3rd party jar
                 files. -->
            <path id="project.jars.ref">
                <pathelement location="${preobfuscate.jar.file}" />
                <path refid="jar.libs.ref" />
            </path>
            <!-- Set the project jar files Path object into a single property. It'll be
                 all the jar files separated by a platform path-separator.
                 Each path must be quoted if it contains spaces.
            -->
            <pathconvert property="project.jars" refid="project.jars.ref">
                <firstmatchmapper>
                    <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
                    <identitymapper/>
                </firstmatchmapper>
            </pathconvert>

            <mkdir   dir="${obfuscate.absolute.dir}" />
            <delete file="${preobfuscate.jar.file}"/>
            <delete file="${obfuscated.jar.file}"/>
            <jar basedir="${out.classes.absolute.dir}"
                destfile="${preobfuscate.jar.file}" />
            <proguard>
                @${proguard.config}
                -injars       ${project.jars}
                -outjars      "${obfuscated.jar.file}"
                -libraryjars  ${android.libraryjars}
                -dump         "${obfuscate.absolute.dir}/dump.txt"
                -printseeds   "${obfuscate.absolute.dir}/seeds.txt"
                -printusage   "${obfuscate.absolute.dir}/usage.txt"
                -printmapping "${obfuscate.absolute.dir}/mapping.txt"
            </proguard>
        </then>
    </if>

我应该怎么做才能摆脱这个错误?谢谢。

【问题讨论】:

    标签: android ant proguard


    【解决方案1】:

    android-support-v4.jar 被两次包含在 Proguard 正在优化的代码集中,这是不允许的。你有两个地方包含的android支持jar吗?这就是您的错误消息中真正的样子。我认为您遗漏了一行,它说明了您项目中其他事件的位置。

    【讨论】:

    • @Samuel 你能发布你的解决方案吗?我现在遇到了这个问题。
    • @Samuel,您能否发布您的解决方案,以便其他人可以解决他们的问题。
    【解决方案2】:

    我刚刚解决了一个类似的问题。我正在使用 viewpagerindicator 库,它依赖于 android 支持库 v4,我也在使用 android appcompat 并且它具有相同的依赖关系。

    所以我从 Gradle 中的 viewpagerindicator 中排除了支持库依赖项,如下所示:

    compile ('fr.avianey.com.viewpagerindicator:library:2.4.1') {
        // exclude redundant transitive dependency
        exclude (group: 'com.google.android', module: 'support-v4')
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 2016-01-20
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2016-02-22
      • 2017-06-06
      相关资源
      最近更新 更多