プロジェクト ファイル リファレンス
このセクションでは、PreEmptive Protection™ DashO™ プロジェクトの構成ファイルについて説明します。 ユーザー インターフェイスを使用してファイルを生成している場合にもリファレンスとして役立つように、各オプションを詳しく解説します。
- <dasho>
- <propertylist> 要素
- <global> 要素
- <inputpath> 要素
- <globalProcessingExclude> 要素
- <classpath> 要素
- <entrypoints> 要素
- <report> 要素
- <output> 要素
- <removal> 要素
- <methodCallRemoval> 要素
- <renaming> 要素
- <optimization> 要素
- <controlflow> 要素
- <stringencrypt> 要素
- <resourceencryption> 要素
- <make-synthetic> 要素
- <premark> 要素
- <includenonclassfiles> 要素
- <preverifier> 要素
- <signjar> 要素
- <injection> 要素
- <includelist> および <excludelist> 規則
- 名前:リテラル、パターン、および正規表現
DashO プロジェクト ファイルには、どのような名前や拡張子を付けてもかまいませんが、優先される拡張子は .dox
です。
プロジェクト ファイルには、指定したアプリケーションがどのように難読化処理されるかについての情報が含まれています。
プロジェクト ファイルは、DashO と一緒に配布される dasho.xsd
に準拠する XML ドキュメントです。
メモ:
ほとんどの場合、要素や属性の先頭と末尾にある空白は削除されます。
<dasho>
<dasho>
要素は、.dox
ファイルの最も外側の要素です。
Version 属性
ファイル バージョンは必要な属性です。
プロジェクト ファイルを読み取ることができる最も古い DashO のバージョンを指定します。
たとえば、version="8.5"
プロジェクトは、プロジェクトを編集しなくても、バージョン 9.2 の DashO で使用することができます。
<dasho version="8.5.0">
メモ: DashO は、アプリケーションのバージョンと異なるバージョンでプロジェクト ファイルを作成することができます。 ファイル バージョンは、プロジェクト ファイルを使用することができる DashO の最小バージョンを表します。
Mode 属性
Mode はオプション属性です。
この属性は DashO が構成を処理する方法を指定します。
このモード属性は、(標準モードの場合は)存在しないか、または (Android モードの場合は)android
に設定されます。
<dasho mode="android" version="10.0.0">
<propertylist> 要素
省略可能な <propertylist>
(プロパティ リスト)要素では、プロパティと呼ばれる変数の定義および値の代入を行うことができます。
これらは、プロジェクト ファイルで使用したり、他のプロパティの値を定義するために使用したりすることができます。
<propertylist>
<property name="projectname" value="myproject"/>
<property name="projectdir" value="c:\myprojects"/>
</propertylist>
プロジェクト ファイルが存在するディレクトリを示す、dasho.basedir
と呼ばれる組み込みの外部プロパティがあります。
保存されていない新しいプロジェクトでは、dasho.basedir
は適用できません。
プロパティは、プロジェクト ファイルの作成に役立ちます。このプロジェクト ファイルは、複数のプロジェクトや同じプロジェクトのさまざまなバージョン、あるいはさまざまなビルド環境間での移植を容易にするテンプレートとしての役割を果たします。
プロパティ参照
プロパティは、次の構文で参照されます。
${property_name}
プロパティ参照は大文字と小文字を区別するので、${MyProjectDir}
は ${myprojectdir}
とは異なるプロパティを参照します。
定義されていないプロパティを参照する場合は、そのリテラル値が使用されます。
プロパティは、他のプロパティの条件に基づいて定義することができます。
プロパティの値は、環境変数への参照も含め、1 つまたは複数のプロパティ参照を使用して指定できます。
このプロパティ参照として、既定値、間接参照、置換構文が挙げられます。
再帰的な変数を定義することはできません。
DashO は、プロパティを参照するための柔軟な方法を多数提供しています。
${prop} |
単純な置換。prop の値が定義されていないか空白の場合、置換は行われず、${prop} は変更されません。 |
---|---|
${prop:-default} |
既定値による置換。prop が定義されており、空白でない場合は、その値を使用します。そうでない場合は、値として既定値を使用します。 |
${prop:+value} |
定義されている場合は置換。prop が定義されており、空白でない場合は、その値が使用されます。それ以外で prop が定義されている場合は、空白の文字列が代用されます。 |
${prop:?message} |
設定されていない場合にエラーを生成。prop が定義されており、空白でない場合は、その値が使用されます。そうでない場合は、メッセージのテキストを含むエラーが生成され、ビルドが終了します。 |
${prop/pattern/replace} |
パターン代入後に置換。正規表現 pattern の最初の出現箇所を置換テキスト replace で置き換えます。replace が空白の場合は、一致するテキストが削除されます。 |
${prop//pattern/replace} |
パターン代入後に置換。正規表現 pattern のすべての出現箇所を置換テキスト replace で置き換えます。replace が空白の場合は、一致するテキストが削除されます。 |
${prop/#pattern/replace} |
パターン代入後に置換。先頭の正規表現 pattern を置換テキスト replace で置き換えます。replace が空白の場合は、一致するテキストが削除されます。 |
${prop/%pattern/replace} |
パターン代入後に置換。末尾の正規表現 pattern を置換テキスト replace で置き換えます。replace が空白の場合は、一致するテキストが削除されます。 |
${prop#pattern} |
パターン削除後に置換。先頭の正規表現 pattern を削除します。 |
${prop%pattern} |
パターン削除後に置換。末尾の正規表現 pattern を削除します。 |
${!prop} |
間接的な置換。prop が定義されており、空白でない場合は、その値がプロパティ名として使用されます。その後、このプロパティの値は置換値として使用されます。間接的な置換に続いて、前述の参照のうちどれでも使用することができます。 |
メモ:
prop
が定義されていないか空白の場合は、${prop:-}
を使用して空の文字列を代入することができます。
動的プロパティ
プロジェクト ファイルのいくつかの場所で、動的プロパティを使用することができます。このプロパティの値には、処理されているクラスやメソッドに関する情報が含まれます。
${CLASS_NAME}
– パッケージ名を含む、現在のクラスの完全な名前。${CLASS_SIMPLENAME}
– クラスの簡易名。つまり、パッケージ名のないクラス名。${CLASS_PACKAGE}
– 末尾のピリオドを含む、クラスのパッケージ名。 これは、既定のパッケージのクラスでは空の文字列になります。プロパティが展開されるようにするには、${CLASS_PACKAGE:-}
を使用します。${METHOD_NAME}
– 現在のメソッドの名前。 コンストラクターの場合、これは${CLASS_SIMPLENAME}
と同じです。${PROP_NAME}
– メソッドが setter または getter である場合は、関連するプロパティの名前。 コンストラクターの場合、これは${CLASS_SIMPLENAME}
と同じです。
以下のプロパティ値は、プロジェクト ファイルの場所と名前によって異なります。
${dasho.file}
– プロジェクト ファイルの絶対パス。${dasho.basedir}
– プロジェクト ファイルがあるディレクトリへの絶対パス。${dasho.project}
– プロジェクト ファイルの、パスも拡張子もない名前。
useJDKHome
を有効にしていて、有効な JDKHome
値を設定し、かつ setJDKHomeProperties
を有効にしている場合は、以下のプロパティが指定した JDKHome
値として評価されます。
${JDK_HOME}
${JAVA_HOME}
タイムスタンプ プロパティ
DashO では、現在の日付および時刻に関する情報を挿入できるように、tstamp
プロパティが用意されています。
tstamp
プロパティは、次の 2 つの異なる方法で使用できます。
${tstamp}
– ロケールの既定の書式を使用して、日付の情報を挿入します。${tstamp[pattern]}
– 書式指定を使用して、日付の情報を挿入します。pattern
は、Java のSimpleDateFormat
クラスで使用されるものと同じです。
プロパティの優先順位
プロジェクト ファイルに定義されているプロパティ、Java のシステム プロパティ、または環境プロパティの値を参照することができます。 プロパティの値を解決するために、DashO は次の順序でソースを調べます。
DashO の動的プロパティ
Java のシステム プロパティ
環境プロパティ
プロジェクト ファイルのプロパティ
Java コマンド ラインの -D
オプション、DashO コマンド ラインの --properties <filename>
オプションを使用するか、Gradle 統合または Ant 統合を介せば、プロジェクト ファイルに定義されているプロパティをオーバーライドすることができます。
メモ:
--properties
引数によって設定されたプロパティは、-D
オプションによって設定されたプロパティをオーバーライドします。
プロパティは、次の要素と共に使用することができます。
<classpath>
のJDKHome
属性<entrypoints>/<applet>
のname
属性<entrypoints>/<ejb>
のname
属性<entrypoints>/<iappli>
のname
属性<entrypoints>/<library>/<jar>
および<entrypoints>/<library>/<dir>
のpath
属性<entrypoints>/<midlet>
のname
属性<entrypoints>/<android>
のname
属性<entrypoints>/<publics>
のname
属性<entrypoints>/<servlet>
のname
属性<entrypoints>/<unconditional>
のname
属性<global>/<exclude>
のclassname
属性<includenonclassfiles>/<copy>
のsource
およびrelativedest
属性<inputpath>/<pathelement>
および<classpath>/<pathelement>
のlocation
属性<mapping>/<mapinput>
のsuffix
属性<mapping>/<mapinput>
のpath
属性<mapping>/<mapoutput>
のpath
およびproguardMap
属性<mapping>/<mapreport>
のpath
属性<output>/<dir>
のpath
属性<output>/<jar>
のpath
およびmanifest
属性<output>/<constpooltag>
の値<output>/<sourcefile>
の値<premark>/<passphrase>
の値<premark>/<watermark>
の値<preverifier>
の値<rename>/<class-options>
のprefix
属性<rename>/<class-options>
のalphabet
属性<rename>/<member-options>
のalphabet
属性<report>
のpath
属性<shelflife>
のperiod
、warningperiod
、date
、およびwarningdate
属性<shelflife>/<property>
のname
およびvalue
属性<tamperCheck>
のaction
属性<tamperCheck>/<signerInfo>
のalias
、keystore
、storepass
、およびstoretype
属性<tamperResponse>
のsource
属性<debugEnabledCheck>
のaction
属性<debugEnabledResponse>
のsource
属性<debuggingCheck>
のaction
属性<debuggingResponse>
のsource
属性<shelfLifeCheck>
のaction
、expirationDate
、warningDate
、startDateSource
、expirationPeriod
、warningPeriod
、およびtokenSource
属性<signJar>
の値とそのkeystore
、storetype
、storepass
、alias
、keypass
、sigfile
、およびaddArgs
属性
<global> 要素
<global>
要素は省略可能であり、実行全体にわたって適用するオプションを定義するためにあります。
この要素には、グローバル オプションとグローバル除外が含まれています。
メモ: グローバル オプションは、大文字と小文字を区別しません。
Fornamedetection グローバル オプション
fornamedetection
オプションは、動的に対象選択されるクラスを検索する、DashO の組み込み機能をオンにします。
これにより、実行にかなりの処理時間が追加されます。
最初に、このオプションを備えたアプリケーションを実行し、その後、これらのクラスをエントリ ポイントとしてファイルに追加することをお勧めします。
場合によっては、DashO は、どのクラスが動的に読み込まれるのかを判断できません。 プログラムは、クラスの名前をユーザー入力として読み込むか、または外部ファイルで指定するよう要求することができます。 しかし、ほとんどの対象選択はそれほどあいまいなものではないため、DashO はそれらが何であるかを安全に判断できます。 レポート ファイルは、指定されたクラスの対象選択の検出に関連付けられている信頼度を報告します。 HIGH の信頼度は、ほぼ確実に正しいです。 つまり、DashO は次のようなものを検出します。
Class a = Class.forName("java.awt.Rectangle");
POSSIBLE の信頼度は、経験に基づいた推測です。 DashO は次のようなコードを検出します。
String s = getUnknownString();
Class a = Class.forName(s);
Rectangle r = (Rectangle)a.newInstance();
この場合、DashO は正確にどのクラスが読み込まれるのかを検出できません。 しかし、読み込まれたクラスが Rectangle にキャストされることは「把握しています」。 したがって、DashO は Rectangle のすべてのサブクラスを検出し、それらを可能性がある(POSSIBLE)という信頼度で対象として選択します。
fornamedetection
オプションを使用し、強制(force)モードで実行することで、検出したものを自動的に対象として選択するよう DashO に指示します。
これは、DashO の決定に自信を持っている場合にのみ行ってください。
強制モードで実行すると、指定された forName()
呼び出しについて動的に読み込まれたクラスを判断できない場合でも、実行が停止しません。
<global>
<option>fornamedetection</option>
</global>
Ignorenotfoundclasses グローバル オプション
ignorenotfoundclasses
オプションは、DashO がクラスパスに存在しないクラスへの参照に遭遇した場合でも、アプリケーションを処理できるようにします。
DashO は、見つからないすべてのクラスを無視できるわけではありません。スーパー クラスやスーパー インターフェイスが見つからない場合は、続行できません。
このオプションは、実行からの情報を収集できるように、DashO が終了することを可能にするための手段としてのみ使用する必要があります。 すべてのクラスにアクセスせずに、必要なすべての依存関係を安全に判断することはできません。
メモ: このオプションは常に Android モードで使用します。
<global>
<option>ignorenotfoundclasses</option>
</global>
Ignore_Missing_Members グローバル オプション
ignore_missing_members
オプションは、DashO が解決することができないメソッドまたはフィールドへの参照に遭遇した場合でも、アプリケーションを処理できるようにします。
これは、クラスパス内のエラーによって、または最新のものでない jar ファイルによって発生する場合があります。
DashO がクラスを処理できるとしても、クラスパスと jar に期待するクラスが含まれていることを確かめるために、それらをチェックしたいと思うでしょう。
メモ: このオプションは常に Android モードで使用します。
<global>
<option>ignore_missing_members</option>
</global>
Force グローバル オプション
DashO は、クラスのリフレクションの使用を検出すると、リフレクション コードの場所とターゲットをメモしておき、その分析を続行します。
分析の終わりに、リフレクション レポートを出力して、ビルド処理を中止します。
プロジェクト内のすべてのリフレクション問題に対処したら、DashO がビルドを完了できるように、force
オプションを追加することができます。
force
オプションは、プロジェクト ファイルで指定するか、またはコマンド ラインの --force
オプションを介して DashO に渡すことができます。
難読化を UI やビルド システム統合を介して実行できるよう、.dox
ファイルにこの値を設定することをお勧めします。--force
は DashO コマンド ラインでのみ動作します。
メモ:
差し込まれたコードがリフレクションを使用することがあるため、このオプションなしで実行するときにはチェックを無効にする必要があるかもしれません。このオプションは常に Android モードで使用します。
<global>
<option>force</option>
</global>
Makepublic および Nomakepublic グローバル オプション
DashO がクラスやメンバーをパブリックで定義するときに、makepublic
および nomakepublic
オプションが制御します。
メモ: Android モードの場合、
makepublic
およびnomakepublic
は無視されます。
<global>
<option>nomakepublic</option>
</global>
Renameforname グローバル オプション
renameforname
オプションは、動的に読み込んだクラスの名前を変更できるようにします。
DashO がクラスを読み込むために使用される文字列を明白に判断できない場合には、そのクラスを <entrypoints> 要素に列挙する必要があります。
こうしたあいまいな場合は、fornamedetection
オプションが possible の信頼度で報告するものに対応します。
メモ:
コードの中で Java の assert キーワードを使ってアサーションを使用すると、クラスが内省的になります。 renameforname オプションを使用しない限り、DashO はそのクラスの名前を変更不能にします。このオプションは Android モードで無視されます。
<global>
<option>renameforname</option>
</global>
Nooverloadinduction グローバル オプション
nooverloadinduction
オプションは、単純な名前変更のためにオーバーロード誘導(Overload Induction™)を無効にします。
つまり、DashO は名前の変更時に追加のオーバーロードを作成作成しません。
グローバル <exclude>
exclude
オプションでは、入力クラスの一部として表示されるが、DashO の最終出力に含めてはいけないクラスを指定できます。
グローバル exclude の属性で指定された正規表現に一致するクラスは、処理されず、最終出力の対象として選択されません。
この要素は次の属性をサポートしています。
classname
- 対象から除外されるクラスの名前を記述する正規表現。 名前:リテラル、パターン、および正規表現を参照してください。annotations
- 正規表現を使用して照合するアノテーション。詳細については、Annotations 属性を参照してください。
たとえば、サード パーティ製の jar ファイル内に存在するテストやサンプルを対象から除外することができます。
<global>
<exclude annotations=".*\.SampleCode" classname="com\.thirdparty\..*"/>
<exclude classname="com\.thirdparty\.tests\..*"/>
<exclude classname="com\.thirdparty\.sample\..*"/>
</global>
メモ:
除外されるクラスの名前は、常に正規表現として指定されます。このオプションは Android モードで無視されます。
Bypassdasho グローバル オプション
bypassdasho
オプションは、入力を処理しないように DashO を構成します。
入力 jar ファイルとディレクトリは、直接出力にコピーされるようになります。
このオプションは、出力での merge 属性が false に設定されている場合、または APK を出力する場合にのみ使用することができます。
<global>
<option>bypassdasho</option>
</global>
<inputpath> 要素
<inputpath>
要素には、DashO が処理するクラスの場所が含まれます。
DashO は、ディレクトリ、zip ファイル、jar ファイル、および war ファイルを処理することができます。
また、location に複数のエントリを含めることができます。各エントリは、OS 固有のクラスパスの区切り文字で区切ります。
メモ:
--pathMap
引数を使って実行している場合、この要素は無視されます。
<inputpath>
<pathelement location="c:\test\app.jar"/>
<pathelement location="c:\test\classes"/>
<pathelement location="c:\test\one.jar;c:\test\two.jar"/>
</inputpath>
メモ:
c:\test\classes
は、パッケージ指定のどの部分にもなりません。 パッケージのルート ディレクトリになります。
メモ: 1 つの dox ファイルで入力として提供できる .war ファイルは 1 つのみです。
メモ: war 入力の場合、WEB-INF/classes/ は自働的に入力として扱われ、WEB-INF/lib/*.jar はサポートして扱われます。
入力ハンドラー エントリ ポイント
入力ハンドラーを使用すると、保護エンジンに特定の方法で入力を扱うように指示することができます。たとえば、入力をライブラリのエントリ ポイントとして、または Spring Boot の入力として扱うよう構成することができます。handler
属性を使用してこれを構成します。
handler
属性には以下の値があります。
- "none"
- "library"
- "extensiblelibrary"
- "springboot"
メモ: ディレクトリ、jar または war をライブラリとして構成する場合は、それを <classpath> に設定する必要はありません。 DashO はこれを自動的に行います。
<inputpath>
<pathelement location="myAPI.jar" handler="library"/>
</inputpath>
<pathelement location=".." handler="extensiblelibrary">
は、パブリック メンバーのみをエントリ ポイントとして扱うかどうかを制御します。
<pathelement location=".." handler="library">
は、保護されたメンバーもエントリ ポイントとして扱うかどうかを制御します。
省略した場合は、on
と見なされます。
メモ: 入力および/またはライブラリとして提供できる .war ファイルは 1 つのみです。
<globalProcessingExclude> 要素
<globalProcessingExclude>
要素には、全体的に処理から除外する必要のあるクラスの場所が含まれます。
これは updateReferences
属性に応じて、2 つの異なる方法で機能します。
updateReferences
がtrue
の場合:これは、制御フローや名前変更など個々の領域のすべての<excludelist>
要素にエントリを含めるのと同じ効果があります。 クラス、メソッド、およびフィールドへの参照は、使用されているコードに関する DashO の分析に含められます。 名前変更されたクラス、メソッド、およびフィールドへの参照が更新されます。updateReferences
がfalse
(または未指定)の場合:規則に一致するクラスは、直接出力にコピーされます。 変更は発生しません。
<globalProcessingExclude>
<classes name="org.package.excludeMe.**" updateReferences="true"/>
<classes name="com.example.ExcludeMe" updateReferences="true"/>
<classes name="com.thirdParty.**"/>
</globalProcessingExclude>
メモ:
除外されるクラスが DashO への他の入力を参照している場合は、updateReferences
をtrue
に設定する必要があります。 設定しないと、実行時に出力クラスでNoClassDefFoundError(s)
、NoSuchMethodError(s)
、またはNoSuchFieldError(s)
が発生する可能性があります。クラスが Global Processing Exclude と Global Exclude の両方に一致する場合、そのクラスは出力されません。
クラスが、
updateReferences
の設定が異なる複数の Global Processing Exclude 規則に一致する場合は、警告が出力され、そのクラス内の参照は更新されません。
<classpath> 要素
<classpath>
要素には、入力クラスを分析する際に DashO が必要とするかもしれないクラスの場所が含まれます。
これらのクラスは、通常、サード パーティ製のパッケージであるか、または Java ランタイム環境の一部である jar ファイルです。
DashO は、クラスパス内のディレクトリ、zip ファイル、Java モジュール、および jar ファイルを処理することができます。
また、location に複数のエントリを含めることができます。各エントリは、OS 固有のクラスパスの区切り文字で区切ります。
メモ: この要素は Android モードで無視されます。
<classpath>
<pathelement location="c:\test\app.jar"/>
<pathelement location="c:\test\classes"/>
<pathelement location="c:\test\one.jar;c:\test\specialModule.jmod"/>
</classpath>
ディレクトリ(例:c:\test\classes
)を指定する場合は、以下のどちらかにしてください。
- Java モジュール(例:
myFirstModule.jmod
、anotherModule.jmod
)を格納するディレクトリ .class
ファイルのルート ディレクトリ。フォルダーはパッケージ階層を表します(例:com\example\MyClass.class
、com\example\util\MyUtilities.class
)
メモ: このディレクトリに
.jmod
ファイルが含まれる場合には、.class
ファイルは検索されません。
JDKHome、useJDKHome、および setJDKHomeProperties 属性
useJDKHome
を設定すると、DashO が依存関係を評価する際、当該の JDK に含まれるランタイム クラスが使用されます。
JDKHome
属性では、そのプロジェクトで使用する JDK の場所を指定できます。
setJDKHomeProperties
を設定すると、JDKHome
に指定された値がプロパティ JDK_HOME
と JAVA_HOME
の値として DashO によって使用されます。
<classpath useJDKHome="true" JDKHome="c:\Program Files\AdoptOpenJDK\jdk-11.x.y" setJDKHomeProperties="true">
<pathelement location="c:\test\classes"/>
…
</classpath>
メモ:
Android API または J2ME を使用するプロジェクトでは、JDK の場所を参照しないでください。このようなプロジェクトは、これら特定の環境用のランタイム jar ファイル、たとえば
Android.jar
やmidpapi10.jar
を必要とします。
<entrypoints> 要素
エントリ ポイントとは、DashO がアプリケーションで使用されているクラスや、メソッド、およびフィールドを判断するために行う依存関係の分析の開始点です。 言い換えれば、これらがアプリケーションのエントリ ポイントです。
メモ: この要素は Android モードで無視されます。
<classes>、<method>、および <field> エントリポイント
<classes>
、<method>
および <field>
要素を使用し、アプリケーションへのエントリ ポイントとして、クラス、メソッドおよびフィールドを指定することができます。
<entrypoints>
<classes name="test.AClass"/>
<classes name="test.MyApplication">
<method name="main" signature="java.lang.String[]"/>
<field name="value"/>
</classes>
</entrypoints>
classes
要素は省略可能な selects-class
属性をサポートしています。
false
に設定した場合は、クラス内の何かが、入れ子になっている必要な <method>
または <field>
条件に一致する場合にのみ、その一致するクラスはエントリ ポイントと見なされます。
<entrypoints>
<classes name="**" selects-class="false">
<method name="main" signature="java.lang.String[]"/>
</classes>
</entrypoints>
メソッドもフィールドもなく、selects-class を true
に設定してクラスを指定した場合、そのクラス自体とその他の保持されるメソッドをオーバーライドするメソッドのみがエントリ ポイントと見なされます。
メソッドの署名を指定するときは、上記の例のように、String[]
ではなく java.lang.String[]
を用いて、完全修飾のクラス名を使用します。
複数のパラメーターは、スペースを入れずにカンマで区切る必要があります。
また、メソッド名として特別な <init>
表記法を使用すると、コンストラクターをエントリ ポイントとして指定することができます。
プロジェクト ファイルは XML なので、忘れずに <
と >
を使用してください。
クラス、メンバー、およびメソッドの署名の名前は、リテラル、パターン、あるいは正規表現として指定することができます。 詳細については、名前:リテラル、パターン、および正規表現を参照してください。
Rename 属性
rename
属性は、<classes>
、<method>
、または <field>
要素で指定されたクラスまたはメンバーの名前を変更できるかどうかを制御します。
<entrypoints>
<classes name="test.OtherApplication" rename="true">
<method name="main" signature="java.lang.String[]"/>
</classes>
</entrypoints>
この例で、test.OtherApplication
クラスは自由に名前を変更できますが、DashO がエントリ ポイントとして扱う main
メソッドは名前を変更することはできません。
特殊クラスのエントリ ポイント
以下の要素を使用すると、特殊クラスのエントリ ポイントを指定できます。
名前 | エントリ ポイントの種類 | rename-members のサポート |
---|---|---|
<android> |
Android | Yes |
<applet> |
Applet | No |
<ejb> |
Enterprise JavaBeans(EJBs) | Yes |
<iappli> |
iAppli | No |
<midlet> |
Midlet | No |
<publics> |
Class public fields/methods | Yes |
<servlet> |
Servlet | No |
<springbean> |
SpringBean | Yes |
<unconditional> |
Class all fields/methods | Yes |
これらのエントリ ポイントの詳細については、特殊クラスのエントリ ポイントを参照してください。
上記の要素は次の属性をサポートしています。
name
- エントリ ポイントとして扱われるクラスの名前を記述するリテラル、パターン、または正規表現です。 名前:リテラル、パターン、および正規表現を参照してください。rename-class
-true
の場合は、エントリ ポイントとして扱われるクラスの名前を変更できます。<springbean>
を除き、既定値はfalse
です。annotations
- 照合するアノテーション。詳細については、Annotations 属性を参照してください。supertype
- 照合するスーパータイプ。詳細については、Supertype 属性を参照してください。
さらに、上記の要素の多くが次の属性をサポートします(上の表を参照)。
rename-members
-true
の場合は、指定されたクラスのメンバーの名前を変更できます。<springbean>
と<android>
を除き、既定値はfalse
です。
<entrypoints>
<android name="com.example.myApp.MyActivity"/>
<android name="com.example.myApp.MyIntActivity" rename-class="true"/>
</entrypoints>
<springbean>
他の特殊クラスには存在しない、<springbean>
でサポートされる追加属性があります。
entrypoints
– 以下のような属性の bean 定義で使用される、メソッド名のカンマ区切りの一覧。init-method
– bean を作成した後に Spring フレームワークによって呼び出されるメソッド。destroy-method
– bean を破棄する前に Spring フレームワークによって呼び出されるメソッド。factory-method
– bean をインスタンス化するときに Spring フレームワークによって呼び出されるメソッド。
renamePropertyMethods
–True/False
(既定でfalse
):プロパティ メソッドの名前を変更します:get*()
、set*(*)
、およびis*()
(および、これらのメソッドで表されるフィールド)。renameEntryPoints
–True/False
(既定でfalse
):entrypoints
下に挙げられているエントリ ポイント メソッドの名前を変更します。
<entrypoints>
<springbean name="com.example.spring.beans.MyBean"
entrypoints="initBean,destroyBean,createBeanOne,createBeanTwo"
rename-class="false" renamePropertyMethods="true" renameEntryPoints="true"/>
</entrypoints>
<report> 要素
レポート ファイルが指定されている場合は、DashO は除去されたすべてのメソッドとフィールドを示すレポートを作成します。 またレポートには、全体のメソッド、フィールド、および定数プール エントリの除去を含む、プロジェクト全体の総数がまとめられています。
メモ: この要素は Android モードで無視されます。
<report path="c:\output\dasho-report.txt"/>
警告とエラーはコンソールに渡されます。
レポートからの抜粋は次のようになります。
Removal Option : Remove all unused Dependency Report for Entry Points: GifWiz.Editor.main(java.lang.String[]) ------------------------------------------------------------------------ gifwiz.ConsoleMessage ======================================================================== Removable Method display() Removable Method outline(int) Removable Field n Removable Field z1 gifWiz.Arc ======================================================================== Removable Method round(double) Removable Method update_scp() Removable Method update_scp(int) Removable Method corners() Removable Field ccw Removable Field cw Removable Field dalpha21 Removable Field dalpha10
各 Removable メソッドは、プログラムの実行において不必要であると DashO が判断したものです。
DashO は、実行に関して要約した結果も出力します。
Statistics In Out Change ======================================================================== Classes 612 596 -2.6% Methods 8975 7095 -20.9% Fields 4953 2792 -43.6% Constants 103306 90756 -21.9% Processing Time: 4:46.977 min
この DashO の実行で、すべてのメソッドのほぼ 21% 近くを除去することができました。 しかし、これはアプリケーションのサイズが 21% 縮小されたというわけではありません。 除去されたメソッドのパーセンテージは、アプリケーションのサイズのわずか 1% かもしれません。
<output> 要素
<output>
要素は、DashO で出力をディレクトリ、jar ファイル、war ファイル、または APK ファイルへ書き込むようにするかどうかを示します。
出力の形式は、名前の変更オプションに依存します。
また、複数の結果を 1 つの出力にまとめるか、入力と同じパッケージを保持するかどうかを制御します。
名前の変更を指定しない場合は、現在存在するディレクトリ/パッケージ構造は指定されたディレクトリに再作成されるので、出力先がソースと同じにならないようにしてください。
名前を変更する場合は、パッケージの概念を削除することができ、すべてのクラスが指定されたディレクトリに置かれます。
メモ:
--pathMap
引数を使って実行している場合、この要素は無視されます。
<output merge="true">
<dir path="c:\output\"/>
</output>
任意で、jar ファイルの出力で manifest
を指定することができます。
DashO は、出力 jar ファイルにマニフェスト ファイルをコピーします。
マニフェストの jar ファイルを指定した場合は、それがマニフェストのソースとして使用されます。
<output merge="true">
<jar path="c:\output\protected.jar" manifest="c:\misc\Manifest.mf"/>
</output>
war を出力する場合は、入力として war を持っている必要があります。
<output>
<war path="c:\output\myApp.war"/>
</output>
メモ: 出力が war の場合、入力 の war に含まれるすべてのものが出力にコピーされます。
APK に出力する場合は、入力として APK を持っている必要があります。 APK を整列させるかどうかを指定することができます。 これは、APK も署名されている場合にのみ、true に設定する必要があります。
<output zipAlign="true">
<apk path="c:\output\myApp.apk"/>
</output>
メモ:
path
とmanifest
の両方の属性は、プロパティをサポートしています。
Jar 属性
DashO が <jar>
要素を使用して 1 つ以上の jar ファイルを作成する場合、あるいは merge=false である場合には、jar ファイルの作成をカスタマイズする属性を指定することができます。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
compress |
true /false |
true |
true の場合、jar ファイル内のエントリは圧縮されます。 |
level |
自然数 0 から 9 |
6 |
jar ファイルのエントリの圧縮レベル。値が大きいほど、より高い圧縮率を与えます。 |
filesonly |
true /false |
true |
false の場合、jar には、ファイルのみのエントリでなく、ファイルとディレクトリの両方のエントリが格納されます。 |
includenonclassjars |
true /false |
false |
true の場合、残りのクラスが何も含まれていない jar ファイルも出力に含まれます。 |
<output merge="false" compress="true" level="4" filesonly="false" includenonclassjars="true">
<dir path="c:\output\"/>
</output>
このサンプルでは、ファイルとそのディレクトリ構造の両方のエントリを含む jar ファイルが、中程度の圧縮レベルで生成されます。
APK 属性
DashO で <apk>
要素を使用して APK を作成する場合には、APK を整列させる必要があるかどうかと、使用する AAPT バージョンを指定できます。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
aaptVersion |
AAPT /AAPT2 |
AAPT |
APK を作成する際に使用する AAPT バージョンを設定します。 |
zipAlign |
true /false |
false |
zipalign を使用して APK を整列させる必要があるかどうかを決定します。これは、APK も DashO によって署名されている場合にのみ、true に設定する必要があります。 |
<output aaptVersion="AAPT2" zipAlign="true">
<apk path="c:\output\myApp.apk"/>
</output>
Merge 属性
DashO は、難読化された結果を結合して単一のディレクトリまたは jar に入れるか、または入力クラスの元のパッケージを保持することができます。
この動作は、<output>
要素の merge
属性を使用して制御されます。
merge
属性の値は、true
または false
です。
merge
属性が指定されていない場合は、既定値の true
になります。
merge="true"
これが DashO の既定のモードです。
merge="true"
の場合は、<dir path="..."/>
または <jar path="..."/>
のいずれかを出力に使用できます。
DashO は、難読化されたすべてのクラスを結合して、指示された jar ファイルまたは出力ディレクトリへ入れます。
merge="false"
merge="false"
が指定された場合は、<dir path="..."/>
のみ出力に使用できます。
DashO は、出力ディレクトリに入力クラスの元のパッケージを保持します。
jar ファイルによってもたらされるクラスは、出力ディレクトリの同じ名前の jar ファイルに配置されます。
また、jar ファイルによってもたらされるマニフェスト ファイルと非クラス ファイルは、難読化された jar ファイルにコピーされます。
ディレクトリによってもたらされるクラスは、出力ディレクトリ内のサブディレクトリに配置されます。
入力ディレクトリに現れる非クラス ファイルがコピーされることはありません。
DashO は、共通のルートの場所を基とする、jar ファイルとディレクトリ間の相対パスを保持しようとします。
この設定は、<dir>
出力および <jar>
出力にのみ適用されます。
メモ:
merge="false"
オプションは、<dir path="…"/>
要素を出力に使用する必要があります。<jar path="…"/>
または<apk path="…"/>
要素が指定されている場合は、merge="false"
の設定は無視されます。
Autocopy 属性
merge="true"
が指定されている(または、出力の種類が <jar>
である)場合は、autocopy
属性も指定することができます。
autocopy="true"
が指定されている場合、入力 jar ファイルおよびディレクトリ内の非クラス ファイルは、自動的に出力にコピーされます。
autocopy="false"
が指定されている場合、入力 jar ファイルおよびディレクトリ内の非クラス ファイルは、出力にコピーされません。
この設定は、<dir>
出力および <jar>
出力にのみ適用されます。
<output merge="true" autocopy="true">
<dir path="obfuscated"/>
</output>
<constpooltag>
クラス ファイルをマークするために、それ用の定数プール エントリを隠れた状態で追加することができます。 この文字列は、DashO が出力するすべてのクラスに配置されますが、一時的ユーザーに対し印刷物にして公表されることはなく、明らかにされません。 クラスの逆アセンブル ツールを使用するものだけが、この文字列を見ることができます。 value 属性には、クラスの動的プロパティを含む、プロパティ参照を含めることができます。
<output>
<constpooltag value="Copyright 1984 Yoyodyne Engineering, Inc."/>
</output>
メモ: 値はカスタム クラス属性として参照されるため、予約されている属性名を指定することはできません。
<sourcefile>
この要素では、スタック トレースで使用される Java の SourceFile
属性の値を設定できます。
value 属性には、クラスの動的プロパティを含む、プロパティ参照を含めることができます。
<output>
<sourcefile value="${CLASS_SIMPLENAME}-v${ver}"/>
</output>
<removal> 要素
<removal>
要素を使用すると、Removal(除去)を構成できます。
メモ: この要素は Android モードで無視されます。
<removal>
要素の classes
および members
属性では、除去するクラスおよびメンバー(フィールド/メソッド)を指定できます。
これらのオプションは次のとおりです。
none
– 除去しないunused-non-public
– 使用されていない項目で、パブリックでない("public" または "protected" 修飾子を持たない)ものだけを除去するunused
– 使用されていないすべての項目を除去する
属性が 2 つとも省略されているか、<removal>
が指定されていない場合には、クラスとメンバーの除去は行われません。
removal は <excludelist>
要素をサポートしています。この要素には、除去されないクラス、メソッド、およびフィールドを選択する規則を含めることができます。
<classes>
要素は省略可能な selects-class
属性をサポートしています。
false
に設定した場合は、クラス内の何かが、入れ子になっている必要な <method>
または <field>
条件に一致しない限り、そのクラスは対象から除外されません。
この要素については、<includelist> および <excludelist> 規則セクションで説明します。
<removal classes="unused-non-public" members="unused"/>
<debug> 要素
<debug>
要素は、処理されたクラスからデバッグ情報属性を削除するよう DashO に指示し、削除する属性を指定します。
types
属性は、削除する情報の種類を指定するために使用されます。
削除できるデバッグ情報の種類、およびその種類の属性で指定できる属性名の詳細については、このセクションを参照してください。
複数の項目はスペースで区切られます。
2 つの特別なキーワードもサポートされます。
All
– デバッグ情報はすべて削除されます。None
– デバッグ情報は何も削除されません。
<debug>
要素が存在しない場合は、すべてのデバッグ情報が保持されます。
セクションはあっても type 属性が存在しない場合は、すべてのデバッグ情報が削除されます。
<debug/>
<debug types="None" />
<debug types="SourceDir SourceDebugExtension" />
<attributes> 要素
<attributes>
要素は、処理されたクラスから(<debug>
要素で指定された属性以外の)属性を削除するよう DashO に指示します。
この要素の types
属性は、削除する属性の種類を指定するために使用されます。
削除できる属性の種類の詳細については、このセクションを参照してください。
複数の項目はスペースで区切られます。
2 つの特別なキーワードもサポートされます。
All
– 属性はすべて削除されます。None
– 属性は何も削除されません。
<attributes>
要素が存在しない場合は、すべての属性が保持されます。
セクションはあっても type
属性が存在しない場合は、次の属性が削除されます:Deprecated
、Synthetic
、RuntimeInvisibleAnnotations
、および RuntimeInvisibleParameterAnnotations
。
<attributes/>
<attributes types="All" />
<attributes types="Deprecated Synthetic" />
メモ: TypeAnnotations 属性は常に削除されます。 これはハードコードされていて構成することができません。
<methodCallRemoval> 要素
<methodCallRemoval>
要素を使用すると、メソッド呼び出しの除去を構成できます。
<methodCallRemoval>
要素の属性はありません。
すべての構成は、<method>
サブ要素に含まれています。
メモ: この要素は Android モードで無視されます。
<method> 要素
これらの要素は、除去するメソッドの呼び出しを定義します。
この要素の属性は、クラス名、メソッド名、および署名によってメソッドを識別します。 このため、オーバーロードされたメソッドの場合、各メソッドに対して 1 つのエントリを作成する必要があります。
className
– この string 属性は、メソッドを含んでいるクラスの完全修飾名を指定します。methodName
– この string 属性は、メソッドの名前を指定します。 コンストラクター メソッドまたは静的初期化メソッドは指定できません。signature
– この string 属性は、メソッドのパラメーター一覧を指定します。 カンマで区切ったパラメーターの種類を使用します。 非プリミティブ型の完全修飾名およびプリミティブ型の単純名(int
、char
など)を使用します。[]
を使用して配列パラメーターを指定します。 これらの型は大文字小文字を区別します。
<renaming> 要素
<renaming>
要素を使用すると、名前の変更を構成できます。
メモ: この要素は Android モードで無視されます。
次の要素は、option 属性とアノテーションの名前の変更を使用して、名前の変更のグローバル制御を可能にしています。
有効な値は on
と off
です。
<renaming option="on" renameAnnotations="on"/>
<class-options> 要素
<class-options>
要素の属性は、クラスの名前の変更を制御します。
rename
– この boolean オプションは、クラスの名前の変更をオンまたはオフにします。false
の場合は、クラスは元の名前を保持します。keeppackages
–true
の場合、DashO はパッケージの階層を保持します。そうでない場合、DashO パッケージ階層をフラット化します。 既定値はfalse
です。 詳細については、このセクションを参照してください。alphabet
– 新しいクラス名を作成するために使用される文字集合を定義する文字列。 省略すると、既定の文字集合が使用されます。minlength
– 新しいクラス名の最小の長さ。randomize
–true
の場合、DashO はクラス名にランダムな名前変更を使用します。そうでない場合、DashO は順次的な名前変更を使用します。 既定値はfalse
です。prefix
– Class Prefix(クラスに付加されるプレフィックス)を指定します。
<member-options> 要素
<member-options>
要素は、メソッドとフィールドの名前の変更を制御します。
keeppublics
–true
に設定すると、すべてのパブリック メソッドおよびフィールドは、元の名前を保持します。 <entrypoints> 要素のlibrary
オプションでは、すべてのパブリック メソッドを、本質的に元の名前を保持するエントリ ポイントとして扱います。 このオプションを指定すると冗長になります。alphabet
– 新しいメンバー名を作成するために使用される文字集合を定義する文字列。 使い方は、<class-options>
要素の alphabet 属性の場合と同じです。minlength
– 新しいメンバー名の最小の長さ。randomize
–true
の場合、DashO はメンバー名にランダムな名前変更を使用します。そうでない場合、DashO は順次的な名前変更を使用します。 既定値はfalse
です。
<renaming> の対象除外リスト
<renaming>
要素は <excludelist>
要素をサポートしています。この要素には、名前が変更されないクラス、メソッド、およびフィールドを選択する規則を含めることができます。
この要素については、<includelist> および <excludelist> 規則セクションで説明します。
<renaming option="on">
<excludelist>
<classes name="samples.SimpleApp" excludeclass="true"/>
</excludelist>
</renaming>
メモ: これらの規則は、エントリ ポイントによって定義される名前の変更の制限と併せて適用されます。
<mapreport> 要素
<mapreport>
要素を使用すると、DashO で名前の変更レポートを出力する場所を設定できます。
<renaming option="on">
<mapping>
<mapreport path="c:\workproject-mapreport.txt"/>
</mapping>
</renaming>
メモ:
path
属性はプロパティをサポートします。
<mapoutput> 要素
<mapoutput>
要素を使用すると、DashO で名前変更の割り当てファイルを出力する場所を設定できます。
省略可能な proguardMap
属性に、ProGuard 互換の割り当てファイルを出力する場所が格納されます。
属性 overwrite="true"
は、既存の割り当てファイルの上書きを可能にするよう DashO に指示します。
メモ:
overwrite
属性は省略可能で、省略すると、既定値のfalse
になります。
<renaming option="on">
<mapping>
<mapoutput path="c:\work\project.map"
proguardMap="c:\work\mapping.txt" overwrite="true"/>
</mapping>
</renaming>
<mapinput> 要素
<mapinput>
要素を使用すると、増分難読化向けに名前変更の入力割り当てファイルを指定できます。
<renaming option="on">
<mapping>
<mapinput path="c:\work\project.map"/>
</mapping>
</renaming>
Suffix 属性
mapinput
には、増分難読化全体にわたって変更を追跡するために直ちに利用できる、任意の suffix オプションがあります(つまり、suffix には、日付や何かほかの識別文字列を指定できます)。
<renaming option="on">
<mapping>
<mapinput suffix="new">
<file path="c:\work\project.map"/>
</mapinput>
</mapping>
</renaming>
<optimization> 要素
<optimization>
要素を使用すると、DashO の最適化を構成できます。
option
属性が off
に設定されている場合は、要素内の内容に関係なく、DashO は最適化をまったく行いません。
メモ: この要素は Android モードで無視されます。
<optimization option="on"/>
最適化を行う場所を微調整するために、<optimization>
要素に <includelist>
と <excludelist>
の両方を含めて、クラスとメソッドを選択する規則を含むことができます。
これらについては、<includelist> および <excludelist> 規則セクションで説明します。
<optimization option="on">
<includelist>
<classes name="samples.**"/>
</includelist>
<excludelist>
<classes name="samples.SimpleApp"/>
</excludelist>
</optimization>
<controlflow> 要素
<controlflow>
要素を使用すると、制御フローの難読化を構成できます。
この要素は option
属性をサポートします。option
が off
に設定されている場合は、要素内の内容に関係なく、DashO は制御フローの難読化をまったく行いません。
option
属性の既定値は on
です。
<controlflow>
要素は次の属性をサポートします。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
option |
on /off |
on |
制御フローの難読化の適用を完全に有効(on )または無効(off )にします。 |
jumbling |
on /off |
on |
Block Jumbling(ブロックの入れ替え)を有効(on )または無効(off )にします。 |
tryCatch |
on /off |
on |
Try/Catch による難読化を有効(on )または無効(off )にします。 |
catchHandlers |
自然数(1 、2 など) |
1 |
tryCatch による難読化によって追加される例外ハンドラーの最大数を指定します。 |
blockSplitting |
on /off |
on |
Block Splitting(ブロック分割)を有効(on )または無効(off )にします。 |
blockSplittingBlockSize |
自然数(1 、2 など) |
3 |
ブロック分割によって作成された新しいブロックに含まれる最低限の命令数を指定します。 |
<controlflow option="on" tryCatch="on" catchHandlers="1" blockSplitting="on" blockSplittingBlockSize="3" jumbling="on" />
制御フローの難読化を行う場所を微調整するために、<controlflow>
要素に <includelist>
と <excludelist>
の両方を含めて、クラスとメソッドを選択する規則を含むことができます。
これらについては、<includelist> および <excludelist> 規則セクションで説明します。
<controlflow option="on">
<excludelist>
<classes name="SimpleApp"/>
</excludelist>
</controlflow>
<stringencrypt> 要素
<stringencrypt>
要素を使用すると、文字列の暗号化を構成できます。 この要素では次の属性をサポートします。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
option |
on /off |
on |
文字列の難読化の適用を完全に有効(on )または無効(off )にします。 |
level |
自然数 1 から 10 |
2 |
文字列の暗号化レベルを設定します。 |
implementations |
自然数 1 から 10 |
2 |
DashO によって作成される復号の数を設定します。 |
useIntern |
true /false |
false |
復号メソッドから文字列を返す前に、文字列に対して intern() を呼び出すかどうかを判断します。 |
<stringencrypt option="on" level="3" implementations="4"/>
文字列の暗号化の対象として選択または除外されるようにするため、<stringencrypt>
要素に <includelist>
と <excludelist>
の両方を含めて、クラスとメソッドを選択する規則を含むことができます。
これらについては、<includelist> および <excludelist> 規則セクションで説明します。
<stringencrypt option="on">
<includelist>
<classes name="com.yoyodyne.**"/>
</includelist>
<excludelist>
<classes name="com.yoyodyne.ui.**"/>
</excludelist>
</stringencrypt>
<decrypter> 要素
<decrypter>
要素を使用すると、どのクラスを復号クラスとして選択できるかを制御します。
この要素は、<includelist> および <excludelist> 規則で使用される <classes>
要素に似ています。
<decrypter>
要素には、外部クラスを選択する 4 つの属性があります。
属性名 | 有効な値 | 機能 |
---|---|---|
name |
名前、パターン、または正規表現 | 復号化メソッドを作成する場所を決定するための、クラスの名前、複数のクラスを選択したパターン、または正規表現を定義します。 |
regex |
true /false |
true の場合、name が正規表現を含んでいるものと予期されます。既定値は false です。 |
modifiers |
クラス修飾子の一覧 | クラスが選択されるにはリストされた修飾子と一致する必要があります。 |
excludedPackages |
パッケージの一覧 | decrypter クラスが置かれないようにするパッケージのカンマ区切りの一覧。既定値は java., javax., android. です。 |
<decrypter>
要素を省略すると、DashO は自動的に場所を決定します。
<decrypter modifiers="static class" name="com.yoyodyne.**"/>
<seInput> 要素
<seInput>
要素は、文字列の暗号化の入力割り当てファイルを指定します。
<seInput path="c:\example_project\prev_project-se.map" />
メモ: この要素は Android モードで無視されます。
<seOutput> 要素
<seOutput>
要素は、文字列の暗号化の出力割り当てファイルを指定します。
このファイルが存在する場合は、上書きされます。
<seOutput path="c:\example_project\project-se.map" />
メモ: この要素は Android モードで無視されます。
<customEncryption> 要素
<customEncryption>
要素を使用すると、カスタム暗号化を構成できます。
これは次の属性をサポートしています。
属性名 | 必要な値 | 機能 |
---|---|---|
useCustomEncryption |
true /false |
カスタム暗号化を有効(true )または無効(false )にします。既定値は false です。 |
encryptionJar |
ファイルのパス(プロジェクト ファイルへの相対パス) | 暗号化メソッドが定義される JAR ファイル。 |
encryptionClass |
完全修飾されたクラス名。 | 暗号化メソッドを実装するクラスの名前。 |
encryptionMethod |
メソッドの単純名。 | 暗号化メソッドの名前。 |
decryptionClass |
完全修飾されたクラス名。 | 復号メソッドを実装するクラスの名前。 |
decryptionMethod |
メソッドの単純名。 | 復号メソッドの名前を指定します。 |
また、カスタム暗号化の使用対象となるクラスおよびメソッドを選択するための規則を含んでいる、<includelist>
も含める必要があります。
これらについては、<includelist> および <excludelist> 規則セクションで説明します。
ここで留意すべき点は、この <includelist>
は、文字列の暗号化のために選択された全クラス/メソッドのサブセットである必要があるということです。
<customEncryption useCustomEncryption="true" encryptionJar="custEncryption.jar"
encryptionClass="com.example.myCustomEncryption.Encrypt" encryptionMethod="myEncrypter" decryptionClass="com.example.myProject.Decrypt" decryptionMethod="myDecrypter" >
<includelist>
<classes name="com.example.mySpecialClasses.**"/>
</includelist>
</customEncryption>
<resourceencryption> 要素
<resourceencryption>
要素を使用すると、リソースの暗号化を構成できます。
これは次の属性をサポートしています。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
option |
on /off |
on |
リソースの暗号化の適用を完全に有効(on )または無効(off )にします。 |
<resourceencryption option="on" />
メモ: この要素は標準モードで無視されます。
<assetencrypt> 要素
<assetencrypt>
要素を使用すると、Asset(assets フォルダーに配置されたファイル)の暗号化を構成できます。
これは次の属性をサポートしています。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
option |
on /off |
on |
Asset の暗号化を有効(on )または無効(off )にします。 |
<assetencrypt>
要素には <includelist>
と <excludelist>
の両方を含めることができます。これには、リソースの暗号化の対象として包含または除外する項目を選択する規則が含まれます。
これらについては、<includelist> および <excludelist> 規則セクションで説明します。
<resourceencryption option="on">
<assetencrypt option="on">
<excludelist>
<items name="www/**"/>
</excludelist>
</assetencrypt>
</resourceencryption>
メモ:
この要素は標準モードで無視されます。assets サブディレクトリにあるファイルに対する規則を定義する場合は、パスの各部分を
/
文字で区切ります。
<rawresourceencrypt> 要素
<rawresourceencrypt>
要素を使用すると、Raw リソース(res/raw フォルダーに配置されたファイル)の暗号化を構成できます。
これは次の属性をサポートしています。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
option |
on /off |
on |
Raw リソースの暗号化を有効(on )または無効(off )にします。 |
<rawresourceencrypt>
要素には <includelist>
と <excludelist>
の両方を含めることができます。これには、リソースの暗号化の対象として包含または除外する項目を選択する規則が含まれます。
これらについては、<includelist> および <excludelist> 規則セクションで説明します。
<resourceencryption option="on">
<rawresourceencrypt option="on">
<includelist>
<items regex="true" name=".*\.mp."/>
</includelist>
</rawresourceencrypt>
</resourceencryption>
メモ: この要素は標準モードで無視されます。
<make-synthetic> 要素
<make-synthetic>
要素は、Make Synthetic(合成)難読化オプションを制御します。
この要素には 1 つの属性と値が含まれ、value
には指定できる設定が 4 つあります。
none
private
non-public
all
- value 属性が省略された場合は、これが既定値となります。
これらのオプションの詳細については、Make Synthetic(合成)を参照してください。
Make Synthetic は <excludelist>
要素をサポートしています。この要素には、合成としてマークされないクラス、メソッド、およびフィールドを選択する規則を含めることができます。
この要素については、<includelist> および <excludelist> 規則セクションで説明します。
メモ: このオプションは Android モードでは常に
none
です。
<make-synthetic value="non-public"/>
<premark> 要素
<premark>
要素を使用すると、PreMark™(ウォーターマーク)を構成できます。
この要素は option
属性をサポートします。この属性によって PreMark を有効(option="on"
)、または無効(option="off"
)にします。
また、オーバーフローの動作を制御する truncate
属性もサポートします。 truncate="on"
の場合、ウォーターマークが長すぎて Jar および warn にそれぞれ埋め込めない場合、DashO はウォーターマークを切り捨てます。
そうでない場合、ウォーターマークが長すぎて適用できないときは DashO はエラーを発生します。
メモ: この要素は Android モードで無視されます。
<premark option="on"/>
<encoding>
<encoding>
要素を使用すると、ウォーターマーク用の文字コードを指定できます。
<premark option="on">
<encoding name="7bit-a"/>
</premark>
<watermark>
<watermark>
要素は、出力 jar ファイルに埋め込むウォーターマークを設定します。
<premark option="on">
<watermark>Copyright Yoyodyne Engineering, Inc.</watermark>
</premark>
<passphrase>
<passphrase>
要素は、ウォーターマークを読み取るために必要なパスフレーズを設定します。
<premark option="on">
<passphrase>secret</passphrase>
</premark>
<includenonclassfiles> 要素
DashO は、関連する非クラス ファイルを実行の一部として jar ファイルに保存するために、その出力先ディレクトリにコピーすることができます。 たとえば、アプリケーションが、jar のディレクトリ階層中に gif ファイルが散在する jar ファイル内に埋め込まれると仮定します。 難読化されたクラス ファイルを出力先に入れることに加えて、指定した出力先の中に、その他の非クラス ファイルに対する gif ファイルをコピーすることもできます。
さらに、出力先ディレクトリのルートあるいは非クラス ファイルがコピーされる jar のルートからの相対パスを指定するために、非クラス ファイルを含めることも可能です。 この相対パスは省略可能です。 相対パスが指定されていない場合、個々の非クラス ファイルは、出力先ディレクトリまたは jar のルートにコピーされます。
メモ: 非クラス ファイルの処理中に検出された XML 構成ファイルは、クラス名やメソッド名を変更できるように更新されることがあります。
次の例では、DashO は非クラス ファイルを出力先ディレクトリまたは jar のルートにコピーします。
<includenonclassfiles>
<copy source="c:\gifs\important.gif"/>
</includenonclassfiles>
次の例では、DashO は c:\gifs
ディレクトリの .gif
ファイルを、出力先ディレクトリまたは jar のルートにコピーします。
ソース内の別のディレクトリで .gif ファイルは検索されません。
<includenonclassfiles>
<copy source="c:\gifs\*.gif"/>
</includenonclassfiles>
次の例では、非クラス ファイルは c:\test\dashoed\gifs
ディレクトリにコピーされます。
サブディレクトリの gifs
は、出力ディレクトリ c:\test\dashoed
に作成されます。
<output>
<dir path="c:\test\dashoed"/>
</output>
<includenonclassfiles>
<copy source="c:\gifs\important.gif" relativedest="/gifs"/>
</includenonclassfiles>
ソースとしてディレクトリが指定されている場合、再帰下降によって見つかったすべての非クラス ファイルは、階層を保持しながら出力先にコピーされます。
<includenonclassfiles>
<copy source="c:\nonclassfiles\"/>
</includenonclassfiles>
jar または zip ファイルが指定されている場合、非クラス ファイルは内部階層を保持しながらコピーされます。
<includenonclassfiles>
<copy source="c:\test\nonclassfiles.jar"/>
</includenonclassfiles>
jar または zip ファイルで相対パスが指定されている場合は、指定された相対パスの下に階層が再作成されます。
<includenonclassfiles>
<copy source="c:\test\nonclassfiles.jar" relativedest="misc"/>
</includenonclassfiles>
<preverifier> 要素
J2ME CLDC アプリケーションを実行している場合、DashO では、DashO によるアプリケーションの処理が完了した後に、クラス ファイルの事前検証を実行することができます。
run
属性を true
に設定している場合は、事前検証プログラムへのパスを指定できます。
パスのみを指定した場合、プログラム名は preverify
であると見なされます。
メモ: この要素は Android モードで無視されます。
<preverifier>
要素には、事前検証プログラムに追加オプションを渡す次の属性が含まれています。
属性名 | 有効な値 | 既定値 | 機能 |
---|---|---|---|
run |
true /false |
false |
true の場合、preverifier は実行されます。 |
nofinalize |
true /false |
false |
true の場合、-nofinalize が preverifier に渡される:ファイナライザーは許可されません。 |
nonative |
true /false |
false |
true の場合、-nonative が preverifier に渡される:ネイティブ メソッドは許可されません。 |
nofp |
true /false |
false |
true の場合、-nofp が preverifier に渡される:浮動小数点演算は許可されません。 |
<preverifier run="true" nonative="true" nofp="true">
${wtk.home}/bin/preverify.exe
</preverifier>
<signjar> 要素
<signjar>
要素では、DashO によって作成された jar ファイルまたは APK に対して jarsigner
または apksigner
ツールを実行できます。
jarsigner
の詳細は、https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html にあります。
apksigner
の詳細は、https://developer.android.com/studio/command-line/apksigner.html にあります。
メモ: このオプションは Android モードで無視されます。
<signjar>
要素には次の属性があります。
属性名 | 有効な値 | 機能 |
---|---|---|
option |
on /off |
署名の on / off を切り替えます。既定値は on です。 |
keystore |
ファイル名 | キー ストアのパス。指定しない場合は、ユーザーのホーム ディレクトリの .keystore ファイルが使用されます。 |
storepass |
パスワード(必須) | キー ストアのパスワード。ユーザー インターフェイスはこれをエンコード形式で格納しますが、値はプレーン テキストで指定できます。 |
storetype |
キー ストアのタイプ | キー ストアのタイプ。指定しない場合は、Java セキュリティ プロパティ ファイルの keystore.type に設定されている値が使用されます。 |
alias |
別名(必須) | キー ストアに非公開鍵を格納するために使用される別名。 |
keypass |
パスワード | jar を署名するために使用される非公開鍵のパスワード。指定しない場合は、キー ストアのパスワードが使用されます。ユーザー インターフェイスはこれをエンコード形式で格納しますが、値はプレーン テキストで指定できます。 |
sigfile |
ファイル名 | .SF および .DSA ファイルのベース名。指定しない場合は、alias のベース名が使用されます。 |
internalsf |
true /false |
true の場合、.DSA の中に署名ファイルのコピーを含めます。既定値は false です。jarsigner にのみ適用されます。 |
sectionsonly |
true /false |
true の場合、署名ファイルに、マニフェスト ファイルのハッシュを含むヘッダーは追加されません。既定値は false です。jarsigner にのみ適用されます。 |
addArgs |
引数 | jarsigner または apksigner の任意の追加引数。 |
メモ:
jarsigner
を使用して APK に署名する場合は、addArgs
を"-sigalg SHA1withRSA -digestalg SHA1"
に設定する必要があるかもしれません。
apksigner
を使用する場合は、APK の署名スキームを設定するために、これを--v1-signing-enabled [true|false] --v2-signing-enabled [true|false]
または--min-sdk-version nn --max-sdk-version nn
(nn
は sdk バージョン)に設定してください。ブール型でない属性はすべて DashO プロパティを参照することができます。
<signjar option="on" keystore="../dev/keystore" storepass="${keystore.psw}"
alias="lazardo">
${JDK_HOME}/bin/jarsigner
</signjar>
<injection> 要素
<injection>
要素を使用して、チェックの差し込みを構成できます。 この要素では次の属性をサポートします。
option
="on
/off
" – DashO のチェック差し込み機能のオン/オフ(on
またはoff
)を切り替えます。 この属性が存在しない場合、既定値はon
です。honorAnnotations
="true
/false
" – コンパイルされたクラスに存在する差し込みアノテーションを使用するかどうかを決定します。true
の場合、DashO はクラス内の差し込みアノテーションを処理します。 この属性の既定値はtrue
です。stripAnnotations
="true
/false
" – コンパイルされたクラスに存在する差し込みアノテーションを出力に保持するかどうかを決定します。true
の場合、DashO はアノテーションを削除します。 この属性の既定値はtrue
です。
<injection>
要素が存在しない場合、コンパイルされたクラス内のアノテーションは無視されますが、出力で保持されます。
option 属性が off
の場合は、タグの内容に関係なく、<injection>
要素全体が無視されます。
使用可能な属性とその既定値を次のサンプル XML に示します。
<injection option="on"
honorAnnotations="true"
stripAnnotations="true" />
メモ:
<injection>
要素は単に、com.preemptive.annotation.instrumentation
パッケージからアノテーションを処理、または削除するだけです。 これらのアノテーションの詳細については、関連する javadocs を参照してください。
<runtime> 要素
<injection>
要素には、省略可能な <runtime>
要素を含めることができます。<runtime>
タグは、Shelf Life チェックを差し込む場合に、アプリケーションでどのチェック実装が差し込まれるかと、どの Shelf Life の実装 jar が使用されるかを指定するために使用されます。
<runtime>
要素を省略すると、その target
属性の既定値が使用されます。
target
="java
" – アプリケーションの実行環境。 サポートされている値は、java
(Java 5 以上)とandroid
(Android SDK 1.6 以上)です。
<injection>
<runtime target="java" />
</injection>
<shelflife> 要素
<injection>
要素には、任意の Shelf Life 設定を含めることができます。
これらは、アプリケーションに配置される期限切れトークンを作成する ShelfLifeCheck アノテーションで使用される値を定義します。
すべての属性が、差し込みが行われるときに展開されるプロパティ参照を含むことができることに注意してください。
key
="file" – PreEmptive Solutions から入手した Shelf Life キー ファイル。date
="date" –MM/DD/YYYY
形式の固定の有効期限。 これは、アプリケーションが期限切れになると見なされる日付です。warningDate
="date" –MM/DD/YYYY
形式の固定の警告日付。 これは、期限切れに関する警告を開始する日付です。period
="days" – 有効期限。 これは、アプリケーションが期限切れになると見なされる開始日からの日数です。 指定する shelf life チェックごとの開始日を構成できます。warningPeriod
="days" – 警告期間。 これは、期限切れの警告期間を開始する、期限までの日数です。
固定の日付と期間の組み合わせが許可されます。 固定の日付と期間の両方の値が存在している場合は、固定の日付が使用されます。 アプリケーション コードに現れるアノテーションは、これらの値をオーバーライドしたり増加させたりすることができます。
<injection>
<shelflife key="../yoyodyne.slkey"
date="10/25/${EXP_YR}"
warningperiod="90"/>
</injection>
期限切れトークンのプロパティ
ユーザー定義のプロパティを期限切れトークンに追加することができます。
これらのプロパティは、DashO の他のプロパティ要素と同じ形式を使用します。
プロパティは、ShelfLifeCheck
アノテーションを使ってユーザー操作が指定されているアプリケーションによって調べることができます。
<injection>
<shelflife key="…" date="10/25/2016">
<property name="REGION" value="2"/>
<property name="COUNTRY" value="GB"/>
</shelflife>
</injection>
name
と value
の両方の属性にはプロパティ参照を含めることができます。これらは ShelfLifeCheck
が差し込まれるときに展開されます。
<checks> 要素
<checks>
要素は、コードに差し込むチェックとレスポンスについて説明します。
これらのチェックおよびレスポンスには、<locations> 要素が含まれている必要があります。
チェック
ほとんどのチェックには、次の標準属性があります。
action
– チェックの状態を伴う、任意の操作の呼び出し/設定。 ほとんどのチェックでは、これはboolean
型になります(ソースおよび操作の指定を参照してください)。response
– チェックがトリガーされたときに実行するレスポンス。exit
– ランダムなゼロ以外のリターン コードを生成してアプリケーションを終了する。hang
– 現在のスレッドをハングさせる。error
–java.lang.Error
の、ランダムに選択されたサブクラスをスローする。exception
–java.lang.Exception
の、ランダムに選択されたチェックされていないサブクラスをスローする。none
– 何もしない(既定)。
where
– コードを差し込む場所。Beginning
– メソッドの最初の部分(既定)。End
– メソッドの最後の部分(すべての exit ポイント)。BeginningAndEnd
– メソッドの最初と最後の部分。
レスポンス
ほとんどのレスポンスには、次の標準属性があります。
source
– チェックがトリガーされたかどうかを判断するソース。 これはboolean
型になります(ソースおよび操作の指定を参照してください)。response
–source
が、チェックがトリガーされたことを示す場合に、実行するレスポンス。exit
– ランダムなゼロ以外のリターン コードを生成してアプリケーションを終了する。hang
– 現在のスレッドをハングさせる。error
–java.lang.Error
の、ランダムに選択されたサブクラスをスローする。exception
–java.lang.Exception
の、ランダムに選択されたチェックされていないサブクラスをスローする。none
– 何もしない(既定)。
probability
–response
(つまりexit
、hang
、error
、またはexception
)が発生する確率。0.0
から1.0
までの小数を指定できます(既定値:1.0
)。where
– コードを差し込む場所。Beginning
– メソッドの最初の部分(既定)。End
– メソッドの最後の部分(すべての exit ポイント)。BeginningAndEnd
– メソッドの最初と最後の部分。
<debuggingCheck> 要素
デバッグ チェックは、アプリケーションがデバッグされているかどうかを判断します(デバッグ チェックとレスポンスを参照してください)。 デバッグ チェックは標準属性を備えています。
<debuggingCheck action="myBoolean" response="none" where="End">
<locations>
<classes name="com.example.MyClass">
<method name="runCalculation" signature="int,int"/>
</classes>
</locations>
</debuggingCheck>
<debuggingResponse> 要素
デバッグのレスポンスを使用すると、アプリケーションは、チェック自体が発生した場所から離れた領域でデバッグ チェックに対応できるようになります(デバッグ チェックとレスポンスを参照してください)。 デバッグのレスポンスは標準属性を備えています。
<debuggingResponse source="myBoolean" response="error" where="Beginning"
probability="0.5">
<locations>
<classes name="com.example.MyOtherClass">
<method name="runOtherCalculation" signature="double"/>
</classes>
</locations>
</debuggingResponse>
<debugEnabledCheck> 要素
デバッグ有効化チェックは、アプリケーションのデバッグが有効になっているかどうかを判断します(デバッグ チェックとレスポンスを参照してください)。 デバッグ有効化チェックは標準属性を備えています。
<debugEnabledCheck action="myBoolean" response="none" where="End">
<locations>
<classes name="com.example.MyClass">
<method name="runCalculation" signature="int,int"/>
</classes>
</locations>
</debugEnabledCheck>
<debugEnabledResponse> 要素
デバッグ有効化のレスポンスを使用すると、アプリケーションは、チェック自体が発生した場所から離れた領域でデバッグ有効化チェックに対応できるようになります(デバッグ チェックとレスポンスを参照してください)。 デバッグ有効化のレスポンスは標準属性を備えています。
<debugEnabledResponse source="myBoolean" response="error"
where="Beginning" probability="0.5">
<locations>
<classes name="com.example.MyOtherClass">
<method name="runOtherCalculation" signature="double"/>
</classes>
</locations>
</debugEnabledResponse>
<emulatorCheck> 要素
エミュレーター チェックは、エミュレーターでアプリケーションが実行されているかどうかを判断します(エミュレーター チェックとレスポンスを参照してください)。 エミュレーター チェックは標準属性を備えています。
<emulatorCheck action="myBoolean" response="none" where="End">
<locations>
<classes name="com.example.MyClass">
<method name="runCalculation" signature="int,int"/>
</classes>
</locations>
</emulatorCheck>
メモ: エミュレーター チェックは Android でのみサポートされます。
<emulatorResponse> 要素
エミュレーターのレスポンスを使用すると、アプリケーションは、チェック自体が発生した場所から離れた領域でエミュレーター チェックに対応できるようになります(エミュレーター チェックとレスポンスを参照してください)。 エミュレーターのレスポンスは標準属性を備えています。
<emulatorResponse source="myBoolean" response="error"
where="Beginning" probability="0.5">
<locations>
<classes name="com.example.MyOtherClass">
<method name="runOtherCalculation" signature="double"/>
</classes>
</locations>
</emulatorResponse>
メモ: エミュレーターのレスポンスは Android でのみサポートされます。
<hookCheck> 要素
フック チェックは、アプリケーションがフックされているかどうかを判断します(フック チェックとレスポンスを参照してください)。 フック チェックは標準属性を備えています。
<hookCheck action="myBoolean" response="none" where="End">
<locations>
<classes name="com.example.MyClass">
<method name="runCalculation" signature="int,int"/>
</classes>
</locations>
</hookCheck>
メモ: フック チェックは Android でのみサポートされます。
<hookResponse> 要素
フックのレスポンスを使用すると、アプリケーションは、チェック自体が発生した場所から離れた領域でフック チェックに対応できるようになります(フック チェックとレスポンスを参照してください)。 フックのレスポンスは標準属性を備えています。
<hookResponse source="myBoolean" response="error"
where="Beginning" probability="0.5">
<locations>
<classes name="com.example.MyOtherClass">
<method name="runOtherCalculation" signature="double"/>
</classes>
</locations>
</hookResponse>
メモ: フックのレスポンスは Android でのみサポートされます。
<rootCheck> 要素
ルート チェックは、ルート化されたデバイスでアプリケーションが実行されているかどうかを判断します(ルート チェックとレスポンスを参照してください)。 ルート チェックは標準属性を備えています。
<rootCheck action="myBoolean" response="none" where="End">
<locations>
<classes name="com.example.MyClass">
<method name="runCalculation" signature="int,int"/>
</classes>
</locations>
</rootCheck>
メモ: ルート チェックは Android でのみサポートされます。
<rootResponse> 要素
ルートのレスポンスを使用すると、アプリケーションは、チェック自体が発生した場所から離れた領域でルート チェックに対応できるようになります(ルート チェックとレスポンスを参照してください)。 ルートのレスポンスは標準属性を備えています。
<rootResponse source="myBoolean" response="error"
where="Beginning" probability="0.5">
<locations>
<classes name="com.example.MyOtherClass">
<method name="runOtherCalculation" signature="double"/>
</classes>
</locations>
</rootResponse>
メモ: ルートのレスポンスは Android でのみサポートされます。
<shelfLifeCheck> 要素
Shelf Life チェックは、有効期限パラメーターに基づいて、アプリケーションの有効期限が切れているか、または間もなく切れるかどうかを判断します(Shelf Life を参照してください)。
Shelf Life チェックは、response
を除くすべての標準属性を備えているほかに、6 つの追加属性があります。
expirationDate
– アプリケーションの有効期限が切れる絶対日付。MM/DD/YYYY
形式です。warningDate
– 期限切れに関する警告を開始する絶対日付。MM/DD/YYYY
形式です。startDateSource
– 実行時にjava.util.Date
として提供される開始日のソース。expirationPeriod
– 相対的な有効期限。開始日からの日数を示します。warningPeriod
– 相対的な警告期間。有効期限までの日数を示します。tokenSource
– Shelf Like トークンを外部で管理する場合に、java.io.Reader
とするトークンのソース。
メモ: この場合、標準の
action
属性は、Token
引数を受け入れ、void を返すメソッドを必要とします (既定:ShelfLifeCheck で説明されている既定の操作)。
<shelfLifeCheck action="customShelfLifeAction()" where="End"
expirationDate="11/01/2016" warningDate="10/01/2016">
<locations>
<classes name="com.example.Main">
<method name="earlySetupMethod" signature="java.lang.String"/>
</classes>
<classes name="com.example.MyOtherClass">
<method name="infrequentButCriticalCalculation" signature="double"/>
</classes>
</locations>
</shelfLifeCheck>
<tamperCheck> 要素
改ざんチェックは、アプリケーションが変更されたかどうかを判断します(改ざんチェックとレスポンスを参照してください)。 改ざんチェックは標準属性を備えています。
改ざんチェックには、任意で、署名情報を構成する signerInfo
要素を含めることができます。
これは、<signjar> に設定されている情報をオーバーライドします。
alias
– キー ストアに非公開鍵を格納するために使用される別名。 Android プロジェクトで、カンマは複数のエイリアスを区切るのに使用します。 DashO プロパティを参照できます。keystore
– キー ストアの URL。既定値はユーザーのホーム ディレクトリの.keystore
になります。 URL にプロトコルが含まれていない場合、キー ストアはファイルと見なされます。 DashO プロパティを参照できます。storepass
– キー ストアのパスワード。 ユーザー インターフェイスはこれをエンコード形式で格納しますが、値はプレーン テキストで指定できます。 DashO プロパティを参照できます。storetype
– キー ストアの種類。既定値は、Java セキュリティ プロパティ ファイルの keystore.type に設定されている値になります。 DashO プロパティを参照できます。
<tamperCheck action="myBoolean" response="none" where="End">
<locations>
<classes name="com.example.MyClass">
<method name="runCalculation" signature="int,int"/>
</classes>
</locations>
<signerInfo alias="correct_cert" storepass="[SbJlvHrFg8s4GblvgMcQ4w==]"
keystore="keystore.ks"/>
</tamperCheck>
<tamperResponse> 要素
改ざんのレスポンスを使用すると、アプリケーションは、チェック自体が発生した場所から離れた領域で改ざんチェックに対応できるようになります(改ざんチェックとレスポンスを参照してください)。 改ざんのレスポンスは標準属性を備えています。
<tamperResponse source="myBoolean" response="error"
where="Beginning" probability="0.5">
<locations>
<classes name="com.example.MyOtherClass">
<method name="runOtherCalculation" signature="double"/>
</classes>
</locations>
</tamperResponse>
<locations> 要素
すべてのチェックおよびレスポンスでは、場所を設定する必要があります。
<locations>
タグは、その子として <classes> を必要とします。
ソースおよび操作の指定
チェックとレスポンスには、ソースおよび操作を指定できます。 ソースでは、実行時に差し込まれるコードに、フィールドとしてのデータ、またはメソッド呼び出しの結果としてのデータを提供します。 操作では、差し込まれるコードによって呼び出されるカスタム動作を提供するか、または結果を記録するフィールドを指定します。 ソースと操作では、現在のクラスに定義されているフィールドやメソッド、または別のクラスの静的メソッドや静的フィールドを参照できます。
静的フィールドおよびメソッドは、どのメソッドからでも使用できます。 インスタンス フィールドおよびメソッドは、同じクラス内のインスタンス メソッドからのみ使用できます。 フィールドは、アノテーションが求める必要な型でなければなりません。 メソッドは、アノテーションが求める必要な戻り値の型とパラメーターを持っていなければなりません。 指定されたフィールドおよびメソッドは、実行時に差し込み場所からアクセスできる必要があります。
フィールドやメソッドは、次の形式を使用して指定します。
field
– 現在のクラスの フィールド field をソースとして使用します。 ソースが静的メソッドから使用される場合、ソースは静的でなければなりません。そうでない場合は、インスタンス フィールドまたは静的フィールドを指定できます。@field
– 現在のクラスの静的フィールド field をソースとして使用します。 これは、静的メソッドまたはインスタンス メソッドから使用できます。class.field
– クラス class の静的フィールド field をソースとして使用します。 class は、完全修飾された Java クラス名です。 これは、静的メソッドまたはインスタンス メソッドから使用できます。method()
– 現在のクラスのメソッド method をソースとして使用します。 ソースが静的メソッドから使用される場合、ソースは静的でなければなりません。そうでない場合は、インスタンス メソッドまたは静的メソッドを指定できます。@method()
– 現在のクラスの静的メソッド method をソースとして使用します。 これは、静的メソッドまたはインスタンス メソッドから使用できます。class.method()
– クラス class の静的メソッド method をソースとして使用します。 class は、完全修飾された Java クラス名です。 これは、静的メソッドまたはインスタンス メソッドから使用できます。
メモ:
@
は、別のクラスの静的メソッドまたは静的フィールドを参照する場合には使用できません。同じクラスの静的メソッドまたは静的フィールドを参照する場合、
@
は省略可能です。このソースまたは操作が、複数の場所に差し込むよう構成されているチェックまたはレスポンスから使用されている場合には、指定されたソースまたは操作は、それぞれの差し込み場所と相対していなければなりません。
ソースまたは操作が正しく指定されていないと、エラーが発生します。
<includelist> および <excludelist> 規則
プロジェクト ファイルの一部の要素は、<includelist>
および <excludelist>
を使用して、操作が適用される項目を微調整します。
これらの要素は、特定のクラス、メソッド、フィールド、またはリソース ファイルを選択するために適用される規則のリストを指定します。
対象選択と対象除外の両方を使用している要素では、最初に対象選択が決定されます。
<includelist>
が空の場合は、すべての項目が対象として選択されます。
項目が選択されたら、次に対象除外規則が調べられます。
<excludelist>
が空の場合は、どの項目も対象から除外されません。
また、<excludelist>
に加えて使用され、特定の機能について構成される <globalProcessingExclude> 要素もあります。
さらに、DashO の内部規則、その他のオプションの要件、およびクラス自体によって、項目が除外される可能性があります。
クラス、メンバーと同様にメソッドの署名の名前も、リテラル、パターン、あるいは正規表現として指定することができます。 詳細については、名前:リテラル、パターン、および正規表現を参照してください。 項目の修飾子、アノテーション、およびスーパータイプ(クラスとインターフェイスのみ)も条件として使用できます。詳細については、Modifiers 属性、Annotations 属性、および Supertype 属性を参照してください。
ほとんどの <includelist>
および <excludelist>
は <classes>
を使用します。
リソースの暗号化の <includelist>
と <excludelist>
は <items>
を使用します。
<classes> 要素
<classes>
要素は、1 つ以上のクラスを選択する規則を定義するために使用されます。
クラス名は完全修飾名である必要があり、内部クラスは、外部と内部のクラス名の間に $
を区切り文字として使用して指定されることに注意してください。
<classes>
要素は、フィールドとメソッドを選択するための追加規則を指定するために、クラスを選択します。
この要素に <field>
要素も <method>
要素も含まれていなければ、このタグをクラスのすべてのメンバー、あるいはクラス自体に適用するために使用できます。
この動作は、規則を使用しているオプションによって決まります。
一部の対象選択リストおよび対象除外リストでは、<classes>
条件をクラス自体に条件付きで適用することができます。
これは、省略可能な excludeclass
属性または selects-class
属性によって制御されます。
excludeclass
属性および selects-class
属性の既定値は true
です。
<includelist>
および <excludelist>
を使用する個々の要素を調べて、excludeclass
属性または selects-class
属性がそのオプションで使用されているかどうかを確認してください。
<classes name=".*" regex="true"/>
<classes name="library.Class1$NestedClass"/>
<classes name="myco.Test.MyOtherTest" excludeclass="false"/>
<method> 要素
<method>
要素は <classes>
要素内で使用されます。
メソッドは、名前(name
)と署名(signature
)を指定して選択できます。
<method>
の regex の設定は <classes>
要素から継承されます。囲っている <classes>
の regex の値が true
であれば、name
属性と signature
属性は正規表現です。
次の例は、正規表現を使用して、任意の数のパラメーターを持つ set
で始まるメソッドをすべて選択します。
<classes name=".*" regex="true">
<method name="set.*" signature=".*"/>
</classes>
signature
属性を選択の条件として使用することができます。
signature
属性は、メソッドのパラメーター一覧の型と一致する Java 型のカンマ区切りの一覧です。
パラメーターのクラス名は完全修飾名でなければなりません。
パラメーターのないメソッドを指定するには、空の文字列を使用します。
<classes name=".*" regex="true">
<method name="get[A-Z].*" signature=""/>
</classes>
<classes name=".*">
<method name="set*" signature="int,MyClass,MyClass[]"/>
</classes>
<classes name="AnalysisEngine">
<method name="compute" signature="int,java.util.List,float[]"/>
</classes>
<field> 要素
<field>
要素は <classes>
要素内で使用されます。
囲っている <classes>
の regex
の値が true であれば、name
属性は正規表現でなければなりません。
一部のオプションの操作はメソッドにのみ適用されるので、<field>
要素は、すべての対象選択リストおよび対象除外リストには適用できません。
<field>
要素が使用可能かどうかを確認するために、対象選択リストまたは対象除外リストを使用する個々のタグを調べてください。
次の例は、正規表現を使用して、counter
で始まるフィールドをすべて選択します。
<classes name=".*" regex="true">
<field name="counter.*"/>
</classes>
<method> と <field> の組み合わせ
<classes>
要素に複数の <method>
要素と <field>
要素を含めることで、プロジェクト内の多くの項目を選択する規則を作成することができます。
たとえば、次のように記述します。
<classes name="com\.yoyodyne\.beans\..*" regex="true">
<method name="get[A-Z].*" signature=""/>
<method name="set[A-Z].*" signature=".*"/>
<method name="is[A-Z].*" signature=""/>
<field name="CONST_.*"/>
</classes>
Modifiers 属性
<classes>
、<method>
、および <field>
要素はすべて modifiers 属性を持っています。
この属性は、項目が持つ Java の修飾子やキーワードによって項目を一致させるために使用されます。
複数の修飾子は、スペースで区切って指定できます。
modifiers が省略された場合、項目の修飾子は選択条件の一部として使用されません。
修飾子は次のとおりです。
public
– ソース コードにおける項目の参照範囲はpublic
です。protected
– ソース コードにおける項目の参照範囲はprotected
です。private
– ソース コードにおける項目の参照範囲はprivate
です。default
– これは、ソース コードでpublic
、protected
、private
のいずれも指定されていないときに、項目に与えられる既定の参照範囲を表します。abstract
– 項目は、ソース コードでabstract
に設定されています。<field>
で使用されている場合には意味を持ちません。final
– 項目は、ソース コードでfinal
に設定されています。static
– 項目は、ソース コードでstatic
に設定されています。native
– メソッドは、ソース コードでnative
に設定されています。<classes>
または<field>
で使用されている場合には意味を持ちません。strictfp
– 項目は、ソース コードでstrictfp
に設定されています。synchronized
– メソッドは、ソース コードでsynchronized
に設定されています。<classes>
または<field>
で使用されている場合には意味を持ちません。transient
– フィールドは、ソース コードでtransient
に設定されています。<classes>
または<method>
で使用されている場合には意味を持ちません。volatile
– フィールドは、ソース コードでvolatile
に設定されています。<classes>
または<method>
で使用されている場合には意味を持ちません。class
– 項目はclass
(クラス)です。 これは、<classes>
で使用される場合にのみ意味を持ちます。interface
– 項目はinterface
(インターフェイス)です。 これは、<classes>
で使用される場合にのみ意味を持ちます。enum
– 項目はenum
(列挙型)です。 これは、<classes>
で使用される場合にのみ意味を持ちます。annotation
– 項目は Javaannotation
(アノテーション)です。 これは、<classes>
で使用される場合にのみ意味を持ちます。synthetic
– Java コンパイラはこの項目を実装情報の詳細として作成しているため、ソース コードの一部として現れません。
修飾子の前に !
を加えることで、修飾子を否定として指定することもできます。
修飾子は大文字と小文字を区別しません。
DashO の修飾子入力では、1 つの修飾子または複数の修飾子入力エントリを検証します。不適切な修飾子入力エントリは、ツール ヒントで示され、また(基になるネイティブ ユーザーインターフェイス サブシステムがサポートしていれば)編集の背景色も変わります。
dox 構成ファイルで修飾子が正しく宣言されていない場合、コンパイラはコンパイル中かコンパイル開始時に例外で終了します。
<classes modifiers="public class" name="com.yoyodyne.*">
<method modifiers="!private !native" name="*" signature="**"/>
<field modifiers="!public final" name="*"/>
</classes>
<classes modifiers="!default !private !enum !annotation" name="**">
<method modifiers="!default !private" name="*" signature="**"/>
<field modifiers="!default !private" name="*"/>
</classes>
Annotations 属性
<classes>
、<method>
、<field>
などの <entrypoints> 要素は annotations 属性を持っています。
この属性は、項目が持つアノテーションによって項目と一致させるために使用されます。属性はリテラル、パターン、または正規表現を使用して指定することができます。
正規表現は、適切な regex
属性が設定されていればサポートされます。
詳細については、名前:リテラル、パターン、および正規表現を参照してください。
完全修飾名、パターン、または正規表現をセミコロンで区切った一覧を指定できます。
アノテーションの条件が複数指定されている場合は、すべての条件が項目のアノテーションに一致する必要があります。
個々のアノテーションの条件は、項目のアノテーションのうち少なくとも 1 つに一致していれば条件を満たすと見なされます。
アノテーションが付けられていない項目は、この属性が指定されていないか空の場合にのみ一致します。
空の値または存在しない値はすべてに一致します。
<classes annotations="com.yoyodyne.*" name="com.yoyodyne.**">
<method annotations="com.yoyodyne.Overthrust; com.yoyodyne.Oscillation" name="*" signature="**"/>
<field annotations="com.yoyodyne.EighthDimension" name="*"/>
</classes>
<classes annotations="com\.yoyodyne\.[^.]*" name="com\.yoyodyne\..*" regex="true">
<method annotations="com\.yoyodyne\.O[^.]*" name=".*" signature=".*"/>
<field annotations="com\.yoyodyne\.EighthDimension; com\.yoyodyne\.Oscillation" name=".*"/>
</classes>
メモ:
この属性を構成する場合は、@
記号を使用しないでください。繰り返しが可能なアノテーションは特別な構成を必要としません。
1 つの項目でアノテーションが再使用される回数に関係なく、条件は一致します。
繰り返しアノテーションを保持するアノテーションは、UI には表示されますが、通常、構成することはできません。
Supertype 属性
クラスを保護の対象として選択する規則や、クラスを保護の対象から除外する規則、クラスをエントリ ポイントとして指定する規則など、ほとんどの規則が supertype
属性をサポートしています。
この属性を使用して、規則に一致させるために、スーパータイプのクラスにする必要がある 1 つ以上のクラスまたはインターフェイスを指定することができます。
完全修飾名、パターン、または正規表現をセミコロンで区切った一覧を指定できます。
スーパータイプの条件が複数指定されている場合は、すべての条件が一致する必要があります。
空の値または存在しない値はすべてに一致します。
たとえば、次の規則は、android.app.Activity
クラスを直接的または間接的に拡張するすべてのクラスに一致します。
<classes supertype="android.app.Activity" name="**"/>
次の規則は、com.example.SampleInterface1
と com.example.SampleInterface2
の両方を拡張または実装する、com.example
パッケージ内のすべてのクラスおよびインターフェイスに一致します。
<classes supertype="com.example.SampleInterface1;com.example.SampleInterface2" name="com.example.*"/>
パターンと正規表現もサポートされます。
次の 2 つの規則は、java.io.Serializable
を実装し、かつ {任意のパッケージ}.AbstractStoredItem
(たとえば、com.foo.AbstractStoredItem
と com.bar.AbstractStoredItem
のどちらも一致します)を継承する、com.example
パッケージ内のすべてのクラスおよびインターフェイスに一致する異なる方法を示しています。
<classes supertype="java.io.Serializable;**.AbstractStoredItem" name="com.example.*"/>
<classes supertype="java\.io\.Serializable;.*\.AbstractStoredItem" name="com\.example\..*" isRegex="true"/>
<items> 要素
<items>
要素は、1 つ以上の項目を選択する規則を定義するために使用されます。
これが使用されるのは、Asset の暗号化と Raw リソースの暗号化のみです。
name
が正規表現として解釈される必要がある場合は、regex
属性を使用します。
name
属性には一致するパターンが含まれています。
<items regex="true" name="skip.*"/>
<items name="*.js"/>
<items name="*.html"/>
名前:リテラル、パターン、および正規表現
名前は、リテラル値、パターン(またはグロブ)、または正規表現のいずれかで指定できます。
リテラル値を使用すると、一致させる対象を正確に指定できますが、パターンや正規表現を使用すると、1 つのエントリに対して 1 つ以上の項目を一致させることができます。
既定では、?
または *
が含まれていない限り、名前はリテラル値として扱われます。
正規表現を指定するには、要素に regex="true"
属性を追加する必要があります。
正規表現の使用
入力される正規表現は、Java 正規表現サポートによってコンパイルできなければなりません。無効なパターンが使用された場合にはビルドが失敗します。 Java 正規表現でサポートされる構文の詳細については、Java Regular Expression Tutorial を参照してください。
メモ: 引数のないメソッド署名と一致させる場合は、正規表現に
^$
または\Q\E
を使用します。
パターンの使用
DashO で使用されるパターンは、グロビングのパターンに似ています。 パターンはリテラル値によく似ていますが、次に挙げるインジケーターを 1 つ以上含んでいます。
?
– 1 文字と一致します。*
– 制限付きで 0 個以上の文字と一致します。 一致させることができるものは、照合している項目の種類によって異なります。これについては、以降のセクションで説明します。**
– 制限なしで 0 個以上の文字と一致します。
クラス名のパターン
*
がクラス名で使用されている場合には、サブパッケージではなく単独のパッケージ内の項目と一致します。
**
パターンは、パッケージあるいは任意のサブパッケージ内の項目と一致します。
メソッド名とフィールド名のパターン
メソッド名やフィールド名で使用されている *
と **
の間に違いはありません。
どちらも 0 個以上の文字と一致します。
項目名のパターン
*
が項目名で使用されている場合には、サブディレクトリではなく、単独のディレクトリ内の項目と一致します。
**
パターンは、ディレクトリあるいは任意のサブディレクトリ内の項目と一致します。
/
文字は、ディレクトリの境界を指定するのに使用します。
メソッド署名のパターン
メソッド署名でパターンが使用されている場合は、*
と **
の間に違いがあります。
*
パターンはメソッドへの 0 または 1 個の引数と一致するのに対し、**
は任意の数の引数と一致します。
以下に、署名の一致の例を示します。
* |
** |
long,* |
long,** |
|
---|---|---|---|---|
() | ✓ | ✓ | ||
(int) | ✓ | ✓ | ||
(java.lang.String) | ✓ | ✓ | ||
(long,int) | ✓ | ✓ | ||
(long,boolean,int) | ✓ | ✓ |
メモ: 引数のないメソッド署名と一致させる場合は、パターンを空白のままにしておきます。
アノテーションのパターン
これはクラス名のパターンに似ています。 パターンは、アノテーションの完全修飾名と一致する必要があります。