Странное поведение при запутывании JAR с помощью proguard - PullRequest
2 голосов
/ 28 декабря 2011

Я пытаюсь запутать JAR Android с помощью Proguard (4.7, но 4.6 тоже проблематично). Я мог бы разбить проблему на простой пример проекта.

Проблема: для некоторых функций (неясно, по каким причинам) имена аргументов открытых функций теряются, иногда "зашифровываются" (действительно). Сначала я хотел бы сосредоточиться на «потерянной» части, потому что зашифрованная вещь гораздо более странная ...

1) Я создал проект библиотеки в Eclipse. Android SDK является 2.1-обновление 1 по некоторым причинам Проект помечен как «Библиотечный проект» и имеет только один класс 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 я делаю "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 (строка arg0, long arg1, float arg2, LocationListener arg3)

хотя указано "keepparameternames".

Я провел часы и часы и не мог заставить его работать. Все в порядке, если я импортирую несжатый JAR. Некоторые другие функции в пакете также отображаются с правильными именами параметров ...

Понятия не имею, а вы?

Привет

1 Ответ

3 голосов
/ 29 декабря 2011

ProGuard 4.7 (и старше), кажется, удаляет имена неиспользуемых параметров.Я исправил это в будущих выпусках.Вы можете обойти это, отключив оптимизацию (-dontoptimize).

Обратите внимание, что вы всегда можете сообщать об ошибках на Отслеживание ошибок ProGuard .

...