1

我正在为 android 开发一些 api 作为库项目,我想将它们导出为一个混淆的 jar。

我有各种课程,但唯一的公共实体是:

  • MyInterface:一个接口,列出了用户必须实现的一些方法;

  • MyUtilities:具有一些静态方法的类;

  • MySingleton:一个单例(实现为具有单个实例的枚举);

  • MyObject:实现我需要处理的特定对象的类;

我是混淆的新手,所以我遵循了一些教程并阅读了 android/proguard 文档。

我成功地从我的项目中创建了一个 jar 并在外部应用程序中使用它。我还成功地混淆了所有非公共类(所以除了上述之外的所有类),它仍然可以继续工作。


现在我的问题:

中指定的方法之一MyInterface

public void getObject(HashMap<String, MyObject>);

在混淆之前,用户可以添加implements MyInterface到他的活动/类并(自动)生成接口方法的实现,特别是:

@Override
public void getObject(HashMap<String, MyObject> hashmap){
  // User implementation
}

在混淆 jar 之后,当我添加implements MyInterface到用户活动并自动生成方法实现时,我得到:

@Override
public void getObject(HashMap hashmap){
  // User implementation
}

所以没有 HashMap 类型。老实说,我不知道为什么会发生这种情况。我还希望看到 HashMap 类型,因为StringMyObject都被保留了。

它仍然可以在没有 HashMap 类型的情况下工作,但我必须将它转换为Hasmap<String, MyObject>

这是我的 proguard conf 文件(由 proguard gui 工具生成):

-injars inAPIs.jar
-outjars 'obfAPIs.jar'

-libraryjars /My/android/SDK/Path/platforms/android-15/android.jar
-libraryjars /My/android/SDK/Path/tools/support/annotations.jar
-libraryjars /My/android/SDK/Path/add-ons/addon-google_apis-google-15/libs/effects.jar
-libraryjars /My/android/SDK/Path/add-ons/addon-google_apis-google-15/libs/maps.jar
-libraryjars /My/android/SDK/Path/add-ons/addon-google_apis-google-15/libs/usb.jar

-overloadaggressively


-keep class my.package.MyObject {
    public <fields>;
    public <methods>;
}

-keep public class my.package.MyUtilities {
    public <fields>;
    public <methods>;
}

-keep interface  my.package.MyInteface {
    public <fields>;
    public <methods>;
}

-keep public class my.package.MySingleton {
    public <fields>;
    public <methods>;
}

-keep,allowshrinking public class my.package.MyInterface {
    public <fields>;
    public <methods>;
}

-keep,allowshrinking public class my.package.MyObject

-keep,allowshrinking public class my.package.MyUtils

-keep,allowshrinking public enum  my.package.MySingleton {
    public <fields>;
    public <methods>;
}
4

1 回答 1

3

根据Proguard docs,您可能需要添加以下选项:

-keepattributes Signature

引用他们的文档:

在 JDK 5.0 及更高版本中编译时,需要“Signature”属性才能访问泛型类型。

于 2013-04-09T08:32:54.393 回答