つまり、これらのクラスはAndrodiManifest.xmlで宣言できるため、proguard.cfgテンプレートに含まれています。
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:
は、この最小限のアプリケーションを考えてみましょうProGuardの中
-keep public class * extends android.app.Activity
ラインなし今
<?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>
、。cfgファイルの場合、ExampleActivity
の名前をA
に変更したくなるかもしれません。 AndroidManifest.xmlについては何も知らないので、マニフェストには触れません。 Android OSはアプリケーションマニフェストで宣言されたクラス名を使用してアプリケーションを起動するため、Android OSはExampleActivity
をインスタンス化しようとしますが、proguardの名前が変更されてからそのクラスは存在しません。
それはマニフェストで宣言されていないため、クラスの名前は唯一、それが変化したときにProGuardを更新するコードによって参照され、重要ではありませんのでCustomTextView
の場合、それは、B
を言って、それを名前を変更するProGuardのための罰金ですクラス名はCustomTextView
です。
いずれかの方法で、テンプレートproguard.cfgファイルから参照されるすべてのクラスをマニフェストで宣言できるため、proguardはそれらに触れてはいけません。
私の質問を理解し、このような素晴らしい答えを提供してくれてありがとう。すでに驚くべきことがない限り、あなたの答えは+50を受け入れる予定です。ここではフォローアップの質問:** '#1' **私はあなたの答えから' -keep'も "最適化"するだけでなく、マッピングにも影響することを正しく理解していますか? ** '#2' ** Proguardの将来のバージョンでAndroidManifest.xmlがサポートされている場合、上記のクラスでは' -keep'は必要なくなります。 –
** '#1' **:「マッピング」が何を意味するかは完全にはわかりません。 "名前の変更"を意味するならば、 '-keep'はproguardがクラスを削除するだけでなくクラスの名前を変更することも防ぐ。 AndroidManifestに関連する何かを「マッピング」することによって意味がある場合。'-keep'は' AndroidManifest.xml'と全く関係がありません。なぜなら、ちょうど '-keep'が最初に必要な理由です(#2の答えを見てください)。 ** '#2' **そう、proguardがAndroidManifest.xmlのセマンティクスについて知っていれば(それを変更する方法)、' -keep'は必要ありません。 –