Removal(除去)
Removal — Options
Removal – Options パネルでは、入力に含まれる使用されていないクラスとメンバーに起こることと、出力されるクラス内のメタデータの除去について制御します。
Unused Classes
これは、使用されていないクラスの処理を制御します。 オプションには、未使用のクラスをすべて除去する、パブリックでない未使用クラスのみ除去する、除去を実行しない、があります。 詳細については、<removal> セクションを参照してください。
Unused Members
これは、使用されていないメソッドとフィールドの処理を制御します。 オプションには、未使用のメンバーをすべて除去する、パブリックでない未使用メンバーのみ除去する、除去を実行しない、があります。
文字列の暗号化を使用する場合は、Unused Member Removal(未使用のメンバーを除去)を有効にしてください。
ライブラリの場合は Remove if not public
を指定し、それ以外の場合は Remove
を指定します。
詳細については、文字列の暗号化での除去の使用に関するセクションを参照してください。
詳細については、<removal> セクションを参照してください。
Debug Information
これは、コンパイラによって挿入されるデバッグ情報の除去を制御します。
ほとんどの情報はデバッガーで使用されるものですが、保持する最も有用な情報は Line Number Table
と Source File
です。
意味のある行番号を含むスタック トレースを生成するには、これら 2 つが保持されている必要があります。
チェックをオンした項目は除去されます。
詳細については、<debug> セクションを参照してください。
メモ:
[Local Variables]および[Local Variable Types]のフィールドの名前は変更されません。製品リリースでこれらの属性をそのままにしておくと、難読化を損なう可能性があります。
Attributes
Java コンパイラは、クラスとそのメンバーの追加のメタデータを生成し、その情報をクラス ファイル内の属性に格納します。 この情報の一部は、ライブラリに対してコンパイルを実行するときのコンパイラで、またはリフレクションを使用するアプリケーションで必要となります。 クラス ファイルのサイズを縮小するために、これらの設定を使用して、アプリケーションが実行時に必要としない情報を選択的に除去することができます。 チェックをオンした項目は除去されます。 詳細については、<attributes> セクションを参照してください。
メモ:
TypeAnnotation は常に削除されます。これはハードコードされていて解除することができません。
Removal — Exclude
Removal – Exclude パネルでは、クラスや、クラスのメソッドおよびフィールドを除去の対象から除外する規則を構成できます。 個々のメソッド、フィールド、クラス、またはパッケージ全体を除外することができます。
正規表現を使用して、個々のクラスやクラスのグループ、あるいはパッケージ全体を除外する規則を作成することができます。 詳細については、グラフィカルな規則エディターを参照してください。
メモ:
ここで参照されるクラスは、Classes セクションで参照されていても除去されます。
Removal — Classes
単体テストやサンプルなどのような、結果の出力に現したくないクラスが入力に含まれている場合は、DashO でそれらを除去することができます。これらの規則に一致するクラスは、DashO の出力に現れないようになります。 それらがほかの入力クラスの参照である場合は、サポート クラスであるかのように扱われます。
正規表現を使用して、個々のクラスやクラスのグループ、あるいはパッケージ全体に一致する規則を作成することができます。 詳細については、グラフィカルな規則エディターを参照してください。
メモ:
ここで参照されるクラスは、さらに Exclude セクションで参照されていても除去されます。
Method Call Removal
ログやコンソール出力などのような、結果の出力に存在してほしくないメソッドの呼び出しがプロジェクトの入力に含まれている場合は、DashO を使用してそれらを除去することができます(たとえば、Android ログの除去)。 ここで指定されたメソッドの呼び出しは、入力クラスから除去されます。 メソッド自体は除去されません。それらの呼び出しのみが除去されます。
他の機能とは異なり、メソッド呼び出しの除去では、クラス名、メソッド名、および署名での正規表現はサポートされません。 詳細については、<methodCallRemoval> セクションを参照してください。
メモ:
旧バージョンの DashO では、あらゆるクラスと一致する**
の使用がサポートされていました。この機能は危険です。使用することは現在推奨されておらず、将来削除されます。
動作への影響
メソッド呼び出しの除去は、プログラムの動作に影響を与えます。メソッドの呼び出しを除去すると、わずかな副作用をもたらす可能性があるため、この機能は慎重に使用する必要があります。
void でないメソッドの呼び出しの除去は、メソッドからの戻り値が実際に使用されているかどうかにかかわらず適用されます。
void でないメソッドの呼び出しが除去された場合、呼び出しの代わりに既定値が結果として提供されます。
この値は、メソッドの戻り値の型に応じて適切に、ゼロ、false、または null のいずれかになります。たとえば、戻り値の型 Double
、int[]
、および Set<String>
を置き換えた結果は、すべて null
になります。
これにより、予期しない問題が発生する可能性があります。
メソッド呼び出しの除去は、そのメソッド呼び出しを含んでいる式も含め、呼び出しの外部のバイトコードを変更しません。
String[] pathSplitterToRemove(String path) { ... }
...
String message = "First path: " + pathSplitterToRemove(path)[0]; // null 配列のアクセス
コードが、その結果によって何かをしているかどうかさえ明らかでない場合があります。
Double methodCallToRemove() { ... }
...
double ignoredValue = methodCallToRemove(); // null をボックス化解除する
(2 つの *ToRemove
メソッドの)メソッド呼び出しを除去した後、上記の例はどちらも NullPointerException
をスローします。