我想使用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
我認爲-dontoptimize會訣竅。 – decades