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 似乎忽略了规则,导致构建错误

在proguard android中忽略警告是正确的

proguard 不会忽略引用的库

Ant 似乎在打包 apk 时忽略了 Proguard 生成的 jar

Android混淆打包配置(忽略第三方jar)