Reputation: 1201
I'm trying to apply proguard to an android app that uses a JNI library.
When the app runs, I'm getting this crash:
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)
The error message looks like mNativeInstanceId
has been obfuscated. However, the library module's seeds.txt
has this line:
com.library.package.NativeDetector: int mNativeInstanceId
meaning it was not obfuscated.
How do I fix this crash?
proguard-rules.pro
for the library module:
-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
class NativeDetector {
private int mNativeInstanceId; //intialized in JNI code
...
}
Edit: I've also tried a proguard file with lines like this with no change in outcome:
-keep class com.om.library.package.NativeDetector {
private <fields>;
}
Upvotes: 2
Views: 827
Reputation: 6200
The problem you are facing might be because you added the proguard rules only to the library module. These are not automatically picked up for the application unless you specify them as consumerProguardFiles
.
Upvotes: 2