1

ライブラリ プロジェクトとして Android 用の API を開発していますが、それらを難読化された jar としてエクスポートしたいと考えています。

私はさまざまなクラスを持っていますが、唯一のパブリックエンティティは次のとおりです。

  • MyInterface: ユーザーが実装する必要があるいくつかのメソッドをリストするインターフェイス。

  • MyUtilities: いくつかの静的メソッドを持つクラス。

  • MySingleton: シングルトン (単一のインスタンスを持つ列挙型として実装);

  • MyObject: 処理する必要がある特定のオブジェクトを実装するクラス。

私は難読化を初めて使用するので、いくつかのチュートリアルに従い、android/proguard ドキュメントを読みました。

プロジェクトから jar を正常に作成し、それを外部アプリケーションで使用しました。また、すべての非公開クラス (上記以外のすべてのクラス) を難読化することに成功しましたが、引き続き動作します。


今私の問題:

で指定された方法の 1 つは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 に答える