是什么让某些Android类“必须 – 保持”?

我注意到“template” proguard.cfg总是包含以下内容:

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

为什么这些特殊的课而不是其他课?

这是ProGuard不能“优化”的完整类列表吗?

Solutions Collecting From Web of "是什么让某些Android类“必须 – 保持”?"

简而言之,这些类位于proguard.cfg模板中,因为这些类可以在AndrodiManifest.xml中声明。

考虑这个最小的应用:

CustomTextView.java:

 package com.example.android; import android.content.Context; import android.widget.TextView; public class CustomTextView extends TextView { public CustomTextView(Context context) { super(context); setText("The class name of this class is not important"); } } 

ExampleActivity.java:

 package com.example.android; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class ExampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new CustomTextView(this)); Log.i("ExampleActivity", "The class name of this class is important"); } } 

AndroidManifest.xml中:

 < ?xml version="1.0" encoding="utf-8"?>          

现在,没有线

 -keep public class * extends android.app.Activity 

在proguard.cfg文件中,proguard可能会试图将ExampleActivity重命名为A 它虽然对AndroidManifest.xml一无所知,但它不会触及清单 。 由于Android OS使用在应用程序清单中声明的​​类名来启动应用程序,因此Android OS将尝试实例化ExampleActivity ,但由于proguard重命名它,该类将不存在!

对于CustomTextView ,可以将proguard重命名为B ,因为类的名称并不重要,因为它没有在清单中声明,只有proguard更改类名时才更新的代码引用CustomTextView

以这种或那种方式,从模板proguard.cfg文件引用的所有类都可以在清单中声明,因此proguard不能触及它们。

查看ProGuard Manual 。 它声明 – 保持:

指定要保留为代码入口点的类和类成员(字段和方法)。 例如,为了保留应用程序,您可以指定主类及其主方法。 要处理库,您应指定所有可公开访问的元素。

这是ProGuard不能混淆的完整类列表吗?

如果指定-keep那并不意味着缺乏混淆。 这意味着它将这些类保留在您的代码中。 因为ProGuard在尝试优化和缩小您的应用时,如果它们似乎没有被使用,它可能会删除某些类。 不要100%接受我的话,但这是我曾经在其他一些SOpost上读到的。

为什么这些特殊的课而不是其他课?

我会假设,因为这些课程非常重要。 正如您所看到的,大多数类都是extend您列出的类的类。 如果您指定了ActivityService或您列出的任何其他内容,那么您绝对不希望在优化期间删除它。