【发布时间】:2015-07-24 20:26:03
【问题描述】:
我正在使用 proguard 来混淆我创建的 (SDK) jar 文件。
SDK 包含一个 Java 服务、一个静态编译的 C++ 库和一个 SWIG(版本 2)接口,服务和库通过该接口进行通信。
我在配置文件中添加了相关的“-keep”和“-keepclasseswithmembernames,includedescriptorclasses”语句。
但一个文件不断(部分)被混淆。
proguard 配置的第一部分是这样的(全部收集自网络):
-libraryjars '/Library/DevTools/adt-bundle-mac-x86_64-20140702/sdk/platforms/android-21/android.jar'
-libraryjars 'libs/android-support-v4.jar'
-libraryjars "libs/armeabi-v7a/libnativesdk.so"
-dontskipnonpubliclibraryclasses
-injars bin/mysdklib.jar
-verbose
-dontshrink
-dontoptimize
-dontusemixedcaseclassnames
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
我的特定类添加如下所示:
-keepclasseswithmembernames,includedescriptorclasses class com.company.MySdkIfJNI{
private final static native void swig_module_init();
public static *;
public final static native <methods>;
}
-keepclasseswithmembernames,includedescriptorclasses class com.company.MySdkWrapper{
public *;
}
-keep class com.company.IntWrapper
-keep class com.company.StatisticsParcel{
public *;
}
-keep class com.company.JNILibCallbacks
我保留的所有课程都很好。问题出在“MySdkIfJNI”类上。
这是一个 Swig (http://www.swig.org/) 在原生库和 Java 服务之间自动生成的接口。
我尝试了各种配置以保持这个类不变,但 proguard 一直在混淆它。
我试过'-keep'、'-keepclasseswithmembernames、includedescriptorclasses'、'-keepclasseswithmembernames'
-keepclasseswithmembernames,includedescriptorclasses class com.company.MySdkIfJNI{
private final static native void swig_module_init();
public static *;
public final static native <methods>;
*;
}
带参数和不带参数
但在 proguard 完成后(没有任何错误/警告),我发现只有部分方法被混淆了。
保留原生方法,如:
public final static native void JniMYSdkClient_setLogLevel(long jarg1, JniMYSdkClient jarg1_, int jarg2);
public final static native void delete_JniMYSdkClient(long jarg1);
但是所有以SwigDirector开头的Java方法都被混淆了,比如:
public static void SwigDirector_JNIMyCallbacks_onEvent(JNIMyCallbacks self, int accountId, int eventId, String sessionId, String msg) {
self.onEvent(accountId, eventId, sessionId, msg);
}
这种混淆会导致 Native swig 接口无法找到这个回调方法并且我的 lib 崩溃了。
有什么想法可以让这个特定的课程保持原样吗?
提前致谢, 还是波尔。
【问题讨论】:
标签: android jar native proguard swig