当前位置: 首页 > 面试题库 >

Android中的Proguard和反思

诸葛雨泽
2023-03-14
问题内容

我刚刚使用了proguard,但是我尝试通过反射实例化的类却无法正常工作。

我有一个界面

Algorithm

我通过这样的课程

AlgorithmFactory.SomeClassThatExtendsAlgorithmImpl.class

像这样实例化该类

public ArrayList<Algorithm> getAlgorithms(Context cnx) {
ArrayList<Algorithm> list = new ArrayList<Algorithm>();

for(Class<? extends Algorithm> alg: algorithms) {

    try {
        Constructor<? extends Algorithm> c = alg.getConstructor(Context.class);
        list.add(c.newInstance(cnx));
    } catch (IllegalArgumentException e) {
        Log.e(TAG, "IllegalArgumentException", e);
        throw new IllegalStateException("There was a problem creating the Algorithm class");
    } catch (InvocationTargetException e) {
        Log.e(TAG, "InvocationTargetException", e);
        throw new IllegalStateException("There was a problem creating the Algorithm class");
    } catch (InstantiationException e) {
        Log.e(TAG, "InstantiationException", e);
        throw new IllegalStateException("There was a problem creating the Algorithm class");
    } catch (IllegalAccessException e) {
        Log.e(TAG, "IllegalAccessException", e);
        throw new IllegalStateException("There was a problem creating the Algorithm class");
    } catch (SecurityException e) {
        Log.e(TAG, "SecurityException", e);
        throw new IllegalStateException("There was a problem creating the Algorithm class");
    } catch (NoSuchMethodException e) {
        Log.e(TAG, "NoSuchMethodException", e);
        throw new IllegalStateException("There was a problem creating the Algorithm class");
    }
}
return list;
}

这是我的proguard.cnf

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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 com.android.vending.licensing.ILicensingService


-keepclasseswithmembernames class * {
    native <methods>;
}

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

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

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
}

问题答案:

解决了

对于其他遇到此问题的人,您需要在proguard.cnf中添加以下内容

-keep public class * extends com.yoursite.android.yourappname.YourClassName

-keepclassmembers class * extends com.yoursite.android.yourappname.YourClassName{
 public <init>(android.content.Context);
}

第一个保留项告诉Proguard不要混淆扩展YourClassName的类名

第二个说保持构造函数名称(<init>意思是构造函数)不混淆,它只有一个参数,Context并且扩展YourClassName

此外,对于 在XML布局文件 中使用 onClick属性的 Android开发人员,您还需要在proguard.cnf文件中添加函数名称。

-keepclassmembers class * {
 public void myClickHandler(android.view.View);
}

这就是说myClickHandlerView在所有类中,使所有使用单个参数命名的方法。您可以像上面一样使用extends关键字进一步限制它。

希望这可以帮助。



 类似资料:
  • 我在Android中的Proguard文件有一个错误。 -加注-加注-加注-加注-加注-加注 -libraryjars/home/jorider/wul4/adt-android/sdk/platforms/android-17/android.jar-libraryjars/home/jorider/wul4/adt-android/sdk/extras/android/support/v4/a

  • 问题内容: 我正在为我的Android项目设置ProGuard。我的项目也使用GSON。 我已经研究了ProGuard配置与GSON和Android的兼容性,并遇到了由google-gson https://code.google.com/p/google-gson/source/browse/trunk/examples/android- proguard- 提供的示例示例/proguard.c

  • 当Cordova使用Ant构建时,我让ProGuard运行于发布版本,但现在使用了Gradle之后,我的项目的发布版本没有被混淆(我的“Cordova构建--发布Android”输出显示了一个步骤:cordovalib:mergereleaseProguardfiles,但没有其他ProGuard/minization/obfuscation条目)。 对于Ant,我的project.propert

  • 我明白了,我必须提到Proguard属性文件中的外部库。我该怎么提才是问题所在。 请查看我的proguard文件

  • 问题内容: 我终于找到了为什么我的应用程序崩溃而无法发布的原因。ProGuard确实从我的应用程序中剥离了代码,但我通过在proguard- android.txt(在sdk中找到)中使用keep命令手动添加类来防止了这种情况。 对于Facebook,我使用了: 但我认为我仍然缺少一些东西。该应用程序现在没有崩溃,但我无法登录Facebook并使用Open Graph。当我在调试模式下构建时,一切

  • 在发布模式下,当我只启用multi-dex时,我的应用程序大小为33.30MB,这相当大。经过一系列的研究,我意识到PROGUARD缩小了apk的大小。在我的解决方案中启用proguard,会出现此错误。PROGUARD的解决方案中可能缺少什么(缩小我的应用程序大小)? proguard.cfg