我正在尝试使用Proguard(4.7,但4.6也有问题)混淆Android JAR。我可以将问题分解为一个简单的示例项目。
问题:对于一些函数(由于什么原因不清楚),暴露函数的参数名称丢失,有时“乱码”(真的)。我想首先关注“丢失”的部分,因为混乱的东西更加奇怪......
1)我在Eclipse中创建了一个库项目。由于某些原因,Android SDK是2.1-update 1 该项目标记为“Library Project”,只有一个类MyJarEntry.java和一个导出函数foo
package com.decades.myjar;
import android.location.LocationListener;
public class MyJarEntry {
public void foo(String provider, long minTime, float minDistance, LocationListener listener) {
}
}
2)我的项目有一个子目录“proguard”,包含最新的proguard.jar和proguard.cfg,看起来像这样
-printmapping out.map
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class * {
public protected *;
}
3)我的Build.xml有构建JAR并像这样优化它的目标,所以在Eclipse中构建lib之后,我在终端中执行“ant jar”和“and optimize”。这是build.xml
<project name="MyJar" default="jar" basedir=".">
<description>
Lib JAR builder
</description>
<!-- set global properties for this build -->
<property name="res" location="res" />
<property name="bin" location="bin" />
<!-- Output directories -->
<property name="out.dir" value="bin" />
<property name="out.absolute.dir" location="${out.dir}" />
<property name="out.classes.dir" value="${out.absolute.dir}/com" />
<property name="out.classes.absolute.dir" location="${out.classes.dir}" />
<!-- Pack the jar -->
<target name="jar">
<jar destfile="MyJar.jar" basedir="bin/">
<!-- replace 'com' by what ever you are using -->
<!-- as first part of the package name -->
<!-- e.g. de, org, ... -->
<!-- the ** is important to include the directory recursively -->
<include name="com/**" />
</jar>
</target>
<!-- Obfuscation with ProGuard -->
<property name="version" value="0.0.1"/> <!-- change this occasionally -->
<property name="proguard-dir" value="proguard"/>
<property name="unoptimized" value="MyJar.jar"/>
<property name="optimized" value="MyJar_${version}.jar"/>
<target name="optimize" unless="nooptimize">
<!-- Run obfuscator -->
<java jar="${proguard-dir}/proguard.jar" fork="true" failonerror="true">
<jvmarg value="-Dmaximum.inlined.code.length=16"/>
<arg value="@${proguard-dir}/proguard.cfg"/>
<arg value="-injars ${unoptimized}"/>
<arg value="-outjars ${optimized}"/>
<arg value="-libraryjars /Users/decades/android-sdk-mac_x86/platforms/android-7/android.jar"/>
</java>
</target>
构建和混淆很好,但是在将生成的MyJar_0.0.1.jar导入到测试项目中之后,代码完成不会显示正确的参数名称,而是将foo表示为
foo(String arg0,long arg1,float arg2,LocationListener arg3)
虽然指定了“keepparameternames”。
我花了几个小时而无法使它发挥作用。如果我导入未经模糊处理的JAR,一切都很好。包中的一些其他功能也会显示正确的参数名称......
毫无头绪,是吗?
此致
答案 0 :(得分:3)
ProGuard 4.7(及更早版本)似乎删除了未使用参数的名称。我现在已经为将来的版本修复了这个问题。您可以通过关闭优化来解决这个问题(-dontoptimize)。
请注意,您始终可以在ProGuard's bug tracker上报告错误。