什么使某些Android类"必须 - 保持"?

Bil*_*Ape 22 android proguard

我注意到"模板" 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
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*lts 27

简而言之,这些类位于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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

现在,没有线

-keep public class * extends android.app.Activity
Run Code Online (Sandbox Code Playgroud)

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

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

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