Android - proguard 忽略 -keep 的 Swig 方法
Posted
技术标签:
【中文标题】Android - proguard 忽略 -keep 的 Swig 方法【英文标题】:Android - proguard ignores -keep on Swig methods 【发布时间】: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 崩溃了。
有什么想法可以让这个特定的课程保持原样吗?
提前致谢, 还是波尔。
【问题讨论】:
【参考方案1】:好吧,我没有找到特定 SWIG 方法的任何解决方案,但由于 SWIG 包装代码已经非常混乱,我决定不必这样做使用 Proguard 进行混淆。
我将 SWIG 接口移动到了一个外部 JAR 文件,并将其导入为“-libraryjars”
现在本机层找到了这个方法,一切都很完美。
还是谢谢!
最好的问候, 或者。
【讨论】:
我能得到更多细节吗?【参考方案2】:Swig 回调需要避免混淆。 首先尝试通过swig保留所有生成的java文件并编译查看。崩溃将修复。如下所示
-keep com.custom.project** *; -dontwarn com.custom.project**
接下来最大化您的文件以进行混淆。 希望对您有所帮助。
【讨论】:
以上是关于Android - proguard 忽略 -keep 的 Swig 方法的主要内容,如果未能解决你的问题,请参考以下文章
Android - proguard 忽略 -keep 的 Swig 方法
Android studio - Proguard 似乎忽略了规则,导致构建错误