android - 使用 proguard 混淆 JAR 时的奇怪行为

标签 android obfuscation proguard

我正在尝试使用 Proguard 来混淆 Android JAR(4.7,但 4.6 也有问题)。我可以将问题分解为一个简单的示例项目。

问题:对于一些函数(不清楚原因),公开函数的参数名称丢失,有时“困惑”(真的)。我想先关注“丢失”的部分,因为乱序的东西更奇怪......

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”和“并优化”。这是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(字符串arg0,长整型arg1,浮点型arg2,LocationListener arg3)

尽管指定了“keepparameternames”。

我花了几个小时,但没能成功。如果我导入未混淆的 JAR,一切都很好。包中的一些其他函数也显示了正确的参数名称...

你不知道吗?

问候

最佳答案

ProGuard 4.7(及更早版本)似乎删除了未使用参数的名称。我现在已经修复了这个问题以供将来的版本使用。您可以通过关闭优化 (-dontoptimize) 来解决这个问题。

请注意,您随时可以在 ProGuard's bug tracker 上报告错误.

关于android - 使用 proguard 混淆 JAR 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656447/

相关文章:

android - 在 android 中将 quickblox 与 Proguard 集成

android - 在 gridview 中显示文件夹内容

java - Android 中简单格式日期解析失败

java - 使用 maven + yguard

java - 错误:发生了JNI错误。线程 “main” java.lang.VerifyError中的异常。该位置的预期堆栈图框架

android - ProGuard - 仅混淆和缩小包?

java - Android:如何提高 tesseract ocr 检索到的图像中的数字?

android - 在 android studio 的 Material 日期选择器中禁用日期

java - 隐藏开源应用程序中使用的 API key

android - Dagger2 在应用 ProGuard 规则后提示