私はJNIライブラリを使用するアンドロイドアプリにproguardを適用しようとしています。アプリを実行すると
、私はこのクラッシュを取得しています:Proguard: `seeds.txt`にフィールドがあるにもかかわらず` NoSuchFieldError`
Thread[24,tid=8563,WaitingForJniOnLoad,Thread*=0xb510a400,peer=0x12f57190,"Service Thread"] recursive attempt to load library "/data/app/com.my.package-1/lib/arm/nativeLibrary.so"
No pending exception expected: java.lang.NoSuchFieldError: no "I" field "mNativeInstanceId" in class "Lcom/library/package/NativeDetector;" or its superclasses
at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:428)
at void java.lang.Runtime.loadLibrary(java.lang.String, java.lang.ClassLoader) (Runtime.java:369)
at void java.lang.System.loadLibrary(java.lang.String) (System.java:989)
at void com.library.package.NativeDetector.<clinit>() (SourceFile:48)
at com.library.package.DectorTypeA com.library.package.Detectors.createInstance() (SourceFile:63)
at com.library.package.DectorTypeA com.library.package.imageAnalysis.DetectorProvider.a() (SourceFile:31)
at com.library.package.DectorTypeA com.library.package.imageAnalysis.DetectorProvider.provideDetector() (SourceFile:24)
at com.library.package.DectorTypeA com.library.package.myService.e() (SourceFile:205)
at com.library.package.DectorTypeA com.library.package.myService.c(com.library.package.myService) (SourceFile:43)
at void com.library.package.myService$2.run() (SourceFile:226)
mNativeInstanceId
が難読化されたようなエラーメッセージが見えます。しかし、ライブラリモジュールのseeds.txt
は、このラインを持っている:それは難読化されていなかったという意味
com.library.package.NativeDetector: int mNativeInstanceId
。
このクラッシュを解決するにはどうすればよいですか?ライブラリモジュールの
proguard-rules.pro
:
-keep class com.om.library.package.NativeDetector {
private <fields>;
}
:私も結果に変化がないと、このような線でProGuardのファイルを試してみた:編集
class NativeDetector {
private int mNativeInstanceId; //intialized in JNI code
...
}
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,LocalVariableTable
-keep public class * {
public protected *;
}
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.library.package.NativeDetector
-keepclassmembers class com.library.package.NativeDetector {
private <fields>;
}
NativeDetector.java
なぜ私はJNIがプライベート変数をロードできると思っていますか? –
プロガードが無効になっているときに機能しますか?それは第三者によって制作された図書館ですが。私は 'private int mNativeInstanceId;'と言っているのは、JNIコードによって初期化されています。なぜなら、それはコメントのことです。 – Michiyo
申し訳ありません - 私はproguardやJNIについて何も知らないので、別の関数が私的変数に直接影響することを期待していると私は奇妙に思えます。 –