我正在为android开发一些api作为一个库项目,我想把它们导出为一个混淆的jar。
我有各种类,但唯一的公共实体是:
-
MyInterface
:列出用户必须实现的一些方法的接口; MySingleton
: Singleton(实现为带有单个实例的enum);MyObject
:一个实现我需要处理的特定对象的类;
MyUtilities
:一个包含静态方法的类;我是新手,所以我遵循了一些教程并阅读了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类型,因为String
和MyObject
都保留了。
它仍然没有HashMap类型也工作,但我必须将其转换为Hasmap<String, MyObject>
这是我的proguard配置文件(由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>;
}
根据Proguard文档,您可能需要添加以下选项:
-keepattributes Signature
引用他们的文档:
需要"Signature"属性才能访问泛型