2011-12-28 45 views
2

我想使用Proguard(4.7,但4.6有問題)來混淆Android JAR。我可以將問題分解成一個簡單的示例項目。奇怪的行爲,同時使用proguard模糊JAR

問題:對於某些函數(由於什麼原因而不清楚),暴露函數的參數名稱會丟失,有時會「混淆」(真的)。我想首先關注「丟失」部分,因爲亂七八糟的東西更奇怪...

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構建的lib後,我做的目標「螞蟻罐」和「優化」終端。這是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,一切正常。包中的一些其他功能也會顯示其正確的參數名稱...

不知道,是嗎?

Regards

+0

我認爲-dontoptimize會訣竅。 – decades

回答

3

ProGuard 4.7(及更早版本)似乎刪除未使用參數的名稱。我現在已經解決了這個問題以備將來發布你可以通過關閉優化來解決它(-dontoptimize)。

請注意,您始終可以報告ProGuard's bug tracker上的錯誤。

+0

嗨,埃裏克,感謝您的評論。我也已經想出了「-dontoptimize」的魔力。正如我最初所說,在「不優化」之前,不僅刪除了參數名稱 - 最奇怪的行爲是參數名稱的「旋轉右移」。因此,對於上面的示例,Eclipse中的參數是arg0,arg1 ... argx類型,但有時(並且我真的不能說,何時或爲什麼)該fucnction更改爲 foo(字符串偵聽器,長提供程序,float minTime,LocationListener minDistance) BTW:這是客戶最初報告的問題... – decades

+0

順便說一句:我一直認爲,keeparameternames將參數,它組織... – decades

+0

最後:非常有關你的建議 - keepattributes。不起作用。按照上面的解釋對參數進行加擾。 – decades