【问题标题】:Android - proguard ignores -keep on Swig methodsAndroid - proguard 忽略 -keep 的 Swig 方法
【发布时间】: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


    【解决方案1】:

    好吧,我没有找到特定 SWIG 方法的任何解决方案,但由于 SWIG 包装代码已经非常混乱,我决定不必这样做使用 Proguard 进行混淆。

    我将 SWIG 接口移动到了一个外部 JAR 文件,并将其导入为“-libraryjars

    现在本机层找到了这个方法,一切都很完美。

    还是谢谢!

    最好的问候, 或者。

    【讨论】:

    • 我能得到更多细节吗?
    【解决方案2】:

    Swig 回调需要避免混淆。 首先尝试通过swig保留所有生成的java文件并编译查看。崩溃将修复。如下所示

    -keep com.custom.project** { *; } -dontwarn com.custom.project**

    接下来最大化您的文件以进行混淆。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2012-03-12
      • 2016-04-10
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多