什么使某些android类“必须维护”?

我注意到“模板” 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"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android" android:versionCode="1" android:versionName="1.0"> <application> <activity android:name=".ExampleActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> </application> </manifest> 

现在,没有线路

 -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或其他您所列出的任何东西,那么您绝对不希望在优化过程中将其删除。