Proguard 如何在混淆内部类的同时保留外部类

Proguard 如何在混淆内部类的同时保留外部类,proguard,Proguard,我有一个类似这样的类: public class MyClass { private class MyInnerClass { public void someFunc() { } } public void usefulMethod() { ... some stuff... nativeUsefulMethod(); } private native void nativeUsefulMethod(); } 我需要保留所有本机函数的方法名,以

我有一个类似这样的类:

public class MyClass {
  private class MyInnerClass {
    public void someFunc() { }
  }

  public void usefulMethod() {
    ... some stuff...
    nativeUsefulMethod();
  }

  private native void nativeUsefulMethod();
}
我需要保留所有本机函数的方法名,以及包含它们的类,以便本机代码正常工作。看起来没问题:

-keepnames class * {
  native <methods>;
}
-keepnames类*{
本地人;
}
当我查看生成的jar时,我看到MyClass和nativeUsefulMethod()仍然存在,而usefulMethod()已经混淆。好。但是,内部类仍然命名为“MyClass$MyInnerClass”。它不包含本机方法,所以我希望它被称为“MyClass$a”或只是“a”


我测试了将“-keepnames”更改为“-keepclassmembernames”,两个类的类名都变得模糊。显然,这个指令保留了内部类名。有没有办法混淆外部而不是内部类名?

本机方法的正确配置是:

-keepclasseswithmembernames class * {
    native <methods>;
}
-KeepClassSwithMemberNames类*{
本地人;
}

请参阅ProGuard手册>示例>

本机方法的正确配置为:

-keepclasseswithmembernames class * {
    native <methods>;
}
-KeepClassSwithMemberNames类*{
本地人;
}

参见ProGuard手册>示例>

事实上,我独立地发现了这一点,但没有返回并检查结果-keepnames类*{…}导致保留所有类名,我只在内部类上注意到了它。当使用正确的指令时,内部类被正确地混淆了。事实上,我独立地发现了这一点,但没有返回并检查结果-keepnames类*{…}导致保留所有类名,我只在内部类上注意到了它。当使用正确的指令时,内部类会被正确地混淆。