我注意到"模板" 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可能会被重命名ExampleActivity
为A
.它虽然对AndroidManifest.xml一无所知,但它不会触及清单.由于Android OS使用在应用程序清单中声明的类名来启动应用程序,因此Android操作系统将尝试实例化ExampleActivity
,但由于proguard重命名它,该类将不存在!
在这种情况下CustomTextView
,可以将proguard重命名为B
,因为类的名称并不重要,因为它没有在清单中声明,只有proguard在更改类名时才会更新的代码引用CustomTextView
.
以这种或那种方式,从模板proguard.cfg文件引用的所有类都可以在清单中声明,因此proguard不能触及它们.
归档时间: |
|
查看次数: |
6978 次 |
最近记录: |