2011-12-28 2 views
2

Proguard (4.7, 그러나 4.6 문제가 너무 있음)를 사용하여 Android JAR을 난독 화하려고합니다. 문제를 간단한 샘플 프로젝트로 분해 할 수 있습니다.Proguard를 사용하여 JAR을 난독 화하는 동안의 이상한 동작

문제 : 의 경우 일부 기능은 (명확하지 않은 이유로) 노출 된 함수의 인수 이름이 손실되고 때로는 "혼란스러워"(실제로)합니다. 스크래핑 된 것이 훨씬 더 이상하기 때문에 "잃어버린"부분에 집중하고 싶습니다 ...

1) Eclipse에서 라이브러리 프로젝트를 만들었습니다. 안드로이드 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.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 파일은 이클립스에 lib 디렉토리를 구축 한 후 내가 할 있도록 JAR를 구축하고 이런 식으로 최적화를위한 목표를 가지고 "ant jar"및 "and optimize"를 터미널에서 사용합니다.

<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> 

빌드 및 난독 괜찮 build.xml 파일입니다 만, 테스트 프로젝트에 결과 MyJar_0.0.1.jar을 가져온 후 코드 완성 대신 foo는 올바른 매개 변수 이름을 표시하지 않습니다

foo는 (문자열는 arg0, 긴 ARG1, 플로트 ARG2, LocationListener의에서 arg3) "keepparameternames"가 지정되어 있지만

로 제시됩니다.

나는 몇 시간과 시간을 들여서 작동시키지 못했습니다. 난독 화 JAR을 가져 오면 모두 괜찮습니다. 패키지의 다른 함수들도 올바른 매개 변수 이름으로 표시됩니다 ...

실마리가 없습니까?

감사

+0

제가 생각하기에, - 토론토가 트릭을합니다. – decades

답변

3

ProGuard에서 4.7 (이상)을 사용하지 않는 매개 변수의 이름을 제거 나타납니다. 이제 향후 릴리스에서이 문제를 해결했습니다. 최적화를 끄면 해결할 수 있습니다 (-dontoptimize).

언제든지 ProGuard's bug tracker에서 버그를 신고 할 수 있습니다.

+0

안녕하세요, 에릭, 귀하의 의견에 감사드립니다. 나는 또한 이미 "- 토론토 화"의 마술을 알아 냈다. 앞에서 설명한 것처럼 "dontptimize"하기 전에 매개 변수 이름을 제거하는 것이 아니라 가장 이상한 동작은 매개 변수 이름의 "회전"이었습니다. 위의 예제에서 Eclipse에 표시된 매개 변수는 arg0, arg1 ... argx 종류 중 하나 였지만 때로는 (또는 실제로 말할 수없는 때) 함수가 으로 변경되었습니다. foo (String listener, long provider , float minTime, LocationListener minDistance) BTW : 이것은 처음에 고객이 문제로보고 한 것입니다 ... – decades

+0

BTW : 저는 항상 keeparameternames가 그 매개 변수를 구성 할 것이라고 생각했습니다 ... – decades

+0

마지막으로 : keepattributes. 작동하지 않습니다. 위에서 설명한대로 매개 변수를 스크램블합니다. – decades

관련 문제