【问题标题】:Proguard does not obfuscate gui componentsProguard 不会混淆 gui 组件
【发布时间】:2012-12-11 14:35:18
【问题描述】:

我想使用 ProGuard 来混淆我的 Android 应用程序。这工作正常。但是我的 gui 类,它扩展了活动、视图和 sherlockactivity 并没有被混淆。这是proguard.cfg

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-libraryjars C:/Users/android-sdks/platforms/android-17/android.jar


-dontpreverify
-dontoptimize
-repackageclasses ''
-allowaccessmodification
-optimizationpasses 5
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributes *Annotation*

-dontwarn    sun.misc.Unsafe
-dontwarn    com.actionbarsherlock.**
-dontwarn    com.google.common.**

-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class com.actionbarsherlock.** { *; } 
-keep interface com.actionbarsherlock.** { *; } 

-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.view.View
-keep public class * extends android.view.ViewGroup
-keep public class * extends android.support.v4.app.Fragment

-keepclassmembers class * extends android.app.Activity { 
public void *(android.view.View);
}
-keepclassmembers class android.support.v4.app.Fragment { 
*** getActivity(); 
public *** onCreate(); 
public *** onCreateOptionsMenu(...); 
}
-keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock {
public <init>(...); 
}

-keepclasseswithmembers class * {
   public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet, int);
}


-keep public class * extends android.view.View {
   public <init>(android.content.Context);
   public <init>(android.content.Context, android.util.AttributeSet);
   public <init>(android.content.Context, android.util.AttributeSet, int);
   public void set*(...);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keepclassmembers class com.brainyoo.brainyoo2android.ui.html.BYJavaScriptInterface {
   public *;
}

首先,我认为活动不能因为反射调用而被混淆

myactivity.class

我已经尝试添加:

- keep public class mypackege.myactivity.class

但这并不能解决问题。任何想法如何混淆 gui 元素?

谢谢 克里斯汀

【问题讨论】:

  • 你是如何确定你的 GUI 类没有被混淆的?
  • 我认为这是actionbarsherlock的一个已知问题
  • 我确实确定我的 GUI 类没有被混淆,因为在混淆我的应用程序之后,我使用 dex2jar 反汇编程序来获取我的 apk 的 jar 文件。然后我使用了带有 gui 的 java 反编译器。在那里我可以看到我所有的类都被混淆了,除了我的 GUI 类

标签: android android-activity actionbarsherlock proguard


【解决方案1】:

但我的扩展 acitvit、view 和 sherlockactivtiy 的 gui 类没有被混淆。

那是因为你的 ProGuard 配置文件说不要混淆它们。此外,这很重要,如果它们混淆了,你的应用程序将无法运行,因为:

  • Android 将找不到您重命名的活动
  • Android 将找不到您的活动生命周期方法
  • Android 将找不到您的小部件(用于在解释布局资源时与反射一起使用)

我尝试添加:-keep public class mypackege.myactivity.class 但它并没有解决问题。

那是因为你告诉 ProGuard不要混淆那个类。

任何想法如何混淆 gui 元素?

如果您希望在完成后拥有一个可以工作的应用程序,您不需要。

【讨论】:

  • @ChristineBauers 这个答案最重要的部分是告诉您不要甚至尝试混淆您的活动。您可以更改规则来完成它,但是 Android 将无法找到您的生命周期方法,这充其量会使您的 Activity 无法使用,最坏的情况可能会导致应用程序崩溃异常。
  • 噢.. 知道我明白了。非常感谢:)
  • 如果你没有从 XML 中引用你的视图,完全可以混淆它们。完全没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2018-04-16
  • 2019-09-28
  • 2013-02-09
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多