2016-07-01 6 views
1

ProGuardを使用して私のアプリケーションを難読化しようとしました。私は難読化のためのすべてのオプション例外を無効にしました。ローダーが私のメインクラスです。Proguard - エラー:JNIエラーが発生しました

以下のスクリーンショットは、難読化されたjarを実行しようとしたときの結果です。 難読化中にエラーは発生しませんでした。

enter image description here

マイ設定

-injars 'C:\Users\Corsair\Desktop\obfuscate\Example.jar' 
-outjars 'C:\Users\Corsair\Desktop\obfuscate\ExampleOut.jar' 

-libraryjars 'C:\Program Files\Java\jre1.8.0_91\lib\rt.jar' 

-dontskipnonpubliclibraryclassmembers 
-dontshrink 
-dontoptimize 
-dontusemixedcaseclassnames 
-dontpreverify 
-dontnote 
-dontwarn 

-verbose 

-keep class Loader 

答えて

5

これは、使用しているのみの構成である場合は、また、ネイティブメソッドは、難読化されます。その結果、ネームライブラリの名前はもはやネイティブライブラリのものと一致しないため、System.loadLibraryを使用してライブラリをロードしようとすると、このようなエラーが表示されます。

あなたはこのように、少なくともルールを追加する必要があります。

-keepclasseswithmembernames,includedescriptorclasses class * { 
    native <methods>; 
} 

これは、処理する任意のクラス内のすべてのネイティブメソッドを保つためにProGuardのを指示します。

編集:

それが作業を取得するために必要な

追加ルール:

  • -dontpreverifyを外し、事前検証はJava 7+
  • のために必要とされる

このmainメソッドをキープ主な方法を維持します:

-keep class Loader { 
    public static void main(...); 
} 
+0

のために全体のガイドを参照してください、たくさん助けのためのおかげで、私はそれを追加しましたが、私はまだエラーを受信して​​います!ここに私の設定がありますhttp://pastebin.com/bnhvYGaT – SJ19

+0

あなたが出力ジャーをどこかに貼り付けて、私たちがそれを調べることができるかもしれません。 –

+0

確かに、どこにアップロードするのか分かりませんので、Githubに載せます。 https://github.com/SJ19/ProGuardTest – SJ19

4

特定のクラスをBeanクラス、コールバッククラス、およびネイティブクラスのように難読化することから除外する必要があります。公式の例では次のように述べている:

処理ネイティブメソッド

アプリケーション、アプレット、サーブレット、図書館などは、ネイティブメソッドが含まれている場合、あなたは自分の名前とそのクラスを維持したいと思うを'という名前であるため、ネイティブライブラリにリンクすることができます。

-keepclasseswithmembernames,includedescriptorclasses class * { 
    native <methods>; 
} 

注:すべてのクラスまたはすべてのネイティブメソッドを保持する必要はありません。関連する名前を難読化しないようにしたいだけです。

処理コールバックメソッド

など、アプリケーション、アプレット、サーブレット、ライブラリは、外部コード(ネイティブコード、スクリプト、...)から呼び出されるコールバックメソッドを、含まれている場合、あなたがよそれらを保存したいと思うし、おそらく彼らのクラスも。それらはアプリケーションのメインメソッドと同じように、コードへのエントリポイントです。アプリケーション、アプレット、サーブレット、図書館など、豆エディタクラス、またはgetterメソッドとsetterメソッドを見つけるために、Beanクラスのイントロスペクションを多用した場合は、その後、Beanクラス

を処理

-keep class mypackage.MyCallbackClass { 
    void myCallbackMethod(java.lang.String); 
} 

構成が苦しくなる可能性があります。必ずBeanクラス名、またはゲッターとセッターの名前は

参考を変更しないでくださいすることよりも、あなたが行うことができます他の多くはありません。また、クラス名やメソッドのシグネチャ

-keep class mybeans.** { 
    void set*(***); 
    void set*(int, ***); 

    boolean is*(); 
    boolean is*(int); 

    *** get*(); 
    *** get*(int); 
} 

にいくつかの他のワイルドカードを使用しますシナリオ(Ressources、Serializationクラス)は問題を引き起こす可能性があります。こんにちは、これら

ProGuard Official: Examples

+0

お手数ですが、私はまだ同じエラーを受けています!ここに私の設定です。 http://pastebin.com/bnhvYGaT – SJ19

+0

あなたはすでにそれを解決したようです..素晴らしい:) –

関連する問題