除去
除去(Removal) は、PreEmptive Protection™ DashO™ for Android & Java がアプリケーションから未使用のコードを除去するための処理であり、以下のような固有の機能を備えています。
- 使用されていないクラスとメソッドの除去
- コンパイラによって生成された属性の除去
- 特定のクラスの明示的な除去
メモ:Android モードの場合、DashO は除去を R8 で処理させるため、 DashO の除去は使用できません。 Android モードを使用する場合は、R8 を有効にしてください。
使用されていないクラスとメソッドの除去
DashO の除去機能はコードを分析して、未使用のクラス、メソッド、およびフィールドを検出し、それらを除去します。
Removal - Options ページで、未使用のすべてのクラスを除去する、public
でない未使用のクラスのみを除去する、または未使用のクラスを除去しない、から選択できます。
同様に、未使用のすべてのメンバーを除去する、public
でない未使用のメンバーのみを除去する、または未使用のメンバーを除去する、からも選択できます。
DashO は、エントリ ポイントをたどることで、使用されているクラスとメソッドを特定すると共に、検出できなかったクラスとメソッドを使用されていないものとして扱います。
使用されていないすべてのクラス、メソッド、フィールドを除去する機能は通常、アプリケーションに対して行うのに向いています。 パブリック API のあるライブラリには、パブリックでない未使用のクラスとメンバーのみを除去する方が適しています。ただし、このような除去は、ライブラリのエントリ ポイントを使用しても可能です。
対象除外
クラスやメンバーを除去対象から除外するには、DashO GUI の Removal - Exclude ページを使用します。
リフレクション
クラスまたはメソッドがリフレクションを介してのみアクセスできる場合には、DashO はそのクラスまたはメソッドが使用されていたとは特定できないことがあります。 [Input - Options]ページの[Determine Reflected Classes]をオンにすると、DashO が、名前変更と除去の分析時に、クラスへのリフレクションを介したシンプルなアクセスを特定しようとします。 一般に、リフレクションを介してアクセスされるクラスおよびメンバーをエントリ ポイントとして追加するか、除去から除外する方が信頼性が高くなります。
メモ:
DashO は、メソッドまたはフィールドのリフレクションベースのアクセスを検出できません。
リフレクションの検出の詳細については、クラスの動的読み込みを参照してください。
属性の除去
DashO を使用すると、コードからデバッグ情報などの不要な属性が除去されます。 不要なクラス、メソッド、フィールド、デバッグ情報などが除去されると、アプリケーションのサイズが小さくなるだけでなく、アプリケーションの保護も行われるようになります。保護が行われる理由は、デバッグ属性などのコンパイラ生成属性が、攻撃者がアプリケーションを詳細に分析するための情報となるからです。 DashO に除去させる属性を設定するには、DashO GUI の Removal - Options ページを使用します。
デバッグ情報
DashO によって除去されるデバッグ情報は次のとおりです。
フレンドリ名(GUI で使用) | 属性名(プロジェクト ファイルで使用) | 説明 |
---|---|---|
Source File | SourceFile |
特定のクラスのソース コードが含まれるファイルの名前です。 |
Source Directory | SourceDir |
ソース ファイルが格納されているディレクトリに関する情報が記述されています(非頻用)。 |
Source Debug Extension | SourceDebugExtension |
拡張デバッグ情報が含まれています。ツール固有と考えられます。 |
Line Number Table | LineNumberTable |
バイトコード命令と元のソース ファイルにおける行番号との関係が記述されています。 |
Local Variables | LocalVariableTable |
メソッドの実行におけるローカル変数の名前と型が記述されています。 |
Local Variable Types | LocalVariableTypeTable |
ジェネリック型を使ってローカル変数の型パラメーターが記述されています。 |
この情報の大部分は主にデバッガーで使用されるものですが、保持すべき最も有用な情報は Line Number Table
と Source File
です。
意味のある行番号が含まれたスタック トレースを生成したい場合は、これら 2 つが保持されている必要があります。
LocalVariableTable
属性と LocalVariableTypeTable
属性に含まれる変数名は変更されません。
本番環境リリースでこれらの属性をそのままにしておくと、保護の有効性が損なわれます。
この構成に関係なく、この情報の大部分は制御フローによって除去されます。
追加の属性
Java コンパイラは、クラスとそのメンバーの追加のメタデータを生成し、その情報をクラス ファイル内の属性に格納します。 この情報の一部は、ライブラリに対してコンパイルを実行するときのコンパイラで、またはリフレクションを使用するアプリケーションで必要となります。 クラス ファイルのサイズを縮小するために、これらの設定を使用して、アプリケーションが実行時に必要としない情報を選択的に除去することができます。 このような情報の一部からお客様のソフトウェアが攻撃者によって分析される可能性があるので、これらの情報を除去することで保護を強化できます。
フレンドリ名(GUI で使用) | 属性名(プロジェクト ファイルで使用) | 説明 |
---|---|---|
Exceptions | Exceptions |
メソッドがスローする、チェックされた例外を示します。 |
Signature | Signature |
型パラメーターを取るかパラメーター化された型を使用する、クラス、メソッド、フィールドなどの署名が記述されています。 |
Deprecated | Deprecated |
クラス、インターフェイス、メソッド、またはフィールドが置き換えられていることを示します。 |
Synthetic | Synthetic |
クラス メンバーがソース コードに現れないことを示します。 |
Enclosing Method | EnclosingMethod |
匿名クラスを囲む方法を示します。 |
Inner Classes | InnerClasses |
内部クラスと外部クラス間の関係を示します。 |
Visible Annotations | RuntimeVisibleAnnotations |
クラス、メソッド、またはフィールドの、リフレクションで見ることができるアノテーションを保持します(例:@Deprecated 、@FunctionalInterface 、@SafeVarargs )。 |
Invisible Annotations | RuntimeInvisibleAnnotations |
クラス、メソッド、またはフィールドの、リフレクションで見ることができないアノテーションを保持します。 |
Visible Parameter Annotations | RuntimeVisibleParameterAnnotations |
メソッドに対するパラメーターの、リフレクションで見ることができるアノテーションを保持します。 |
Invisible Parameter Annotations | RuntimeInvisibleParameterAnnotations |
メソッドに対するパラメーターの、リフレクションで見ることができないアノテーションを保持します。 |
Annotation Default | AnnotationDefault |
アノテーション要素の既定値。 |
Method Parameters | MethodParameters |
メソッドのパラメーターの名前を保持します。 |
"Unknown Attributes"(プロジェクト ファイルでは Unknown
)には、その他すべての種類の属性が含まれています。
メモ:
TypeAnnotation は常に除去されます。 この動作はハードコードされており、無効にすることができません。
クラスの除去
単体テストやサンプルなどのような、結果の出力に現したくないクラスが入力に含まれている場合は、それらのクラスがまとめて除去されるように DashO を構成することができます。 クラスを除去するように構成するには、DashO GUI の Removal - Classes ページを使用します。
メモ:
この機能は慎重に使用してください。 除去したクラスを入力のクラスで参照すると、アプリケーションが実行時に、除去されたクラスを特定できなくなるため失敗します。