...

DashO User`s Guide 7.1

by user

on
Category: Documents
166

views

Report

Comments

Transcript

DashO User`s Guide 7.1
バージョン
7.1
PREEMPTIVE SOLUTIONS
DASHO
ユーザーズ ガイド
© 1998-2013 by PreEmptive Solutions, LLC
All rights reserved.
Manual Version 7.1-06072013
www.preemptive.com
TRADEMARKS
DashO, Overload-Induction, the PreEmptive Solutions logo, and the DashO logo are trademarks of
PreEmptive Solutions, LLC
Java™ is a trademark of Oracle, Inc.
.NET™ is a trademark of Microsoft, Inc.
All other trademarks are property of their respective owners.
THIS PUBLICATION IS PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
THIS PUBLICATION COULD CONTAIN TYPOGRAPHIC ERRORS AND/OR TECHNICAL
INACCURACIES.UPDATES AND MODIFICATIONS MAY BE MADE TO THIS DOCUMENT AND/OR
SUPPORTING SOFTWARE AT ANY TIME.
PreEmptive Solutions, LLC has intellectual property rights relating to technology embodied in this
product.In particular, and without limitation, these intellectual property rights may include one or more
U.S. patents or pending patent applications in the U.S. and/or other countries.
This product is distributed under licenses restricting its use, copying, distribution, and
decompilation.No part of this product may be reproduced in any form by any means without prior
written authorization of PreEmptive Solutions, LLC.
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
目次
目次 ............................................................................................................................................................... 2
はじめに ........................................................................................................................................................ 4
難読化を行う理由 .................................................................................................................................. 4
難読化の目標 ........................................................................................................................................ 4
DashO の機能 ........................................................................................................................................ 4
概要 ............................................................................................................................................................... 6
DashO ユーザー インターフェイスの起動 ............................................................................................. 6
DashO の登録 ........................................................................................................................................ 7
DashO に関する FAQ ............................................................................................................................ 7
プロジェクトの種類の選択 ..................................................................................................................... 8
New Project Wizard ............................................................................................................................... 9
Spring Framework を使用したプロジェクト .......................................................................................... 19
ユーザー インターフェイス リファレンス ...................................................................................................... 21
メインのユーザー インターフェイス ウィンドウ...................................................................................... 21
Advanced モード ユーザー インターフェイス ...................................................................................... 24
Quick Jar ユーザー インターフェイス .................................................................................................. 73
User Preferences ................................................................................................................................... 82
スタック トレースのデコード .................................................................................................................. 85
Shelf Life トークンの生成 .................................................................................................................... 87
コマンド ライン インターフェイスの使用 ...................................................................................................... 88
DashO コマンド ライン .......................................................................................................................... 88
PreMark ウォーターマーク ツール....................................................................................................... 90
高度なトピック .............................................................................................................................................. 92
オーバーロード誘導によるメソッドの名前の変更 ............................................................................... 92
クラスの動的読み込み ......................................................................................................................... 93
シリアル化 ............................................................................................................................................ 95
PreEmptive Analytics .................................................................................................................................. 96
概要 ...................................................................................................................................................... 96
カスタム アノテーション ........................................................................................................................ 96
パフォーマンス情報の収集 ................................................................................................................. 99
環境情報の収集 .................................................................................................................................. 99
ユーザー定義データの送信 ............................................................................................................. 100
メッセージ データのダウンロード ....................................................................................................... 100
改ざんチェックと対応 ................................................................................................................................ 101
2
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
改ざんチェック.................................................................................................................................... 101
改ざんの対応 ..................................................................................................................................... 102
Shelf Life ................................................................................................................................................... 104
アクティブ化キー ................................................................................................................................ 104
Shelf Life トークン .............................................................................................................................. 104
期限切れチェック ............................................................................................................................... 105
例外レポート .............................................................................................................................................. 109
アプリケーションおよびスレッド レベルのレポート............................................................................. 109
メソッド レベルのレポート ................................................................................................................... 110
バージョン情報の取得 .............................................................................................................................. 112
カスタム暗号化の使用 .............................................................................................................................. 113
Encryption .......................................................................................................................................... 113
Decryption .......................................................................................................................................... 113
サンプル アプリケーション ........................................................................................................................ 114
プロジェクト ファイル リファレンス .............................................................................................................. 115
<dasho> .............................................................................................................................................. 115
<propertylist> セクション .................................................................................................................... 115
<global> セクション ............................................................................................................................ 119
<inputpath> セクション ....................................................................................................................... 123
<classpath> セクション ........................................................................................................................ 124
<entrypoints> セクション .................................................................................................................... 125
<report> セクション ............................................................................................................................. 132
<output> セクション ............................................................................................................................ 133
<removal> セクション ......................................................................................................................... 136
<methodCallRemoval> セクション ..................................................................................................... 138
<renaming> セクション ....................................................................................................................... 139
<optimization> セクション .................................................................................................................. 144
<controlflow> セクション .................................................................................................................... 144
<stringencrypt> セクション ................................................................................................................. 145
<make-synthetic> セクション .............................................................................................................. 147
<premark> セクション ......................................................................................................................... 148
<includenonclassfiles> セクション ...................................................................................................... 149
<preverifier> セクション ..................................................................................................................... 151
<signjar> セクション ........................................................................................................................... 151
<instrumentation> セクション ............................................................................................................. 152
<includelist> および <excludelist> 規則 ........................................................................................... 159
名前:リテラル、パターン、および正規表現 ...................................................................................... 162
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
3
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
はじめに
DashO は、Java の難読化、サイズ縮小、最適化、およびウォーターマーク作成の機能を備えたプログラムです。
このセクションでは、DashO を使用する利点について概要を説明します。
難読化を行う理由
Java は、表出的なファイル構文を使用して実行可能コードを配信します。このようなクラス ファイルは、バイナリ
のマシン語コードよりも高度なもので、ソース コードの復元を可能にする識別子のメタデータが含まれていま
す。アタッカーは、逆コンパイラを使用してコードをリバース エンジニアリングし、ライセンス供与されたコード、
コピー保護メカニズム、所有権を有するビジネス ロジックなどをむき出しにすることができます。
難読化は、アプリケーション内のシンボルの名前をシームレスに変更する技法であり、その他にも逆コンパイラ
を妨害する対策を備えています。難読化を正しく適用すると、アプリケーションを変えることなく、逆コンパイル
に対する保護を格段に高めることができます。
難読化の目標
難読化の目標は、混乱を引き起こすことです。混乱が生じると、クラス ファイルからソースを復元する能力が低
下します。これは、実行可能なロジックの変更について言及しているのではありません。そのロジックを理解不
能にするだけです。
バイト コード レベルで難読化ツールを適用すると、人間が解釈できなくなるほか、実行可能なロジックを保持
しながら逆コンパイラも機能しなくなります。結果として、リバース エンジニアリングを試みると、その命令は失
敗するか、またはコンパイルに失敗するコードが生成されます。
DashO の機能
PreEmptive Solutions は 1996 年より、Java 用の DashO ツールを皮切りに、中間コンパイル言語で作成された
ソフトウェアの保護および改善について取り組んできました。弊社の Java 用および .NET 用の製品は、その能
力、汎用性、および米国で特許取得済みの機能により、市場で成功を収めています。
不要コードの除去
DashO はアプリケーションのエントリ ポイントから始めて、アプリケーションが使用しているクラス、メソッド、およ
びフィールドを判別し、使用されている要素だけのパッケージを作成します。これは、サード パーティ製のライ
ブラリにも適用されるため、アプリケーションで使用する部分だけを取り付けることが可能になります。
4
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
名前の変更
DashO は 、 PreEmptive Solutions が 考 案 し た 、 米 国 で 特 許 取 得 済 み の ア ル ゴ リ ズ ム で あ る Overload
Induction™(オーバーロード誘導)を使用します。オーバーロード誘導は、できる限り多くのメソッドの名前を同
じ名前に変更します。次の例で、その技術を説明します。
元のソース コード:
例
private void calcPayroll(SpecialList employeeGroup) {
while (employeeGroup.hasMore()) {
employee = employeeGroup.getNext(true);
employee.updateSalary();
distributeCheck(employee);
}
}
オーバーロード誘導を行った後の、リバース エンジニアリングされたソース コード:
例
private void a(a b) {
while (b.a()) {
a = b.a(true);
a.a();
a(a);
}
}
DashO はまた、難読化された名前が後継のリリース間でも再適用できるように、名前の割り当てファイルを生成
します。これにより、以前に展開したシステムにパッチ ファイルを統合することが可能になります。
制御フローの難読化
DashO は、逆コンパイラがソース コードを再作成するのに使用するコード パターンを破壊することによって難
読化を行います。結果として生成されるコードは、意味的には元のコードと等価ですが、逆コンパイラを妨害し
ます。
文字列の暗号化
DashO は、アプリケーションの一部または全部の文字列を暗号化することにより、アプリケーション内の特定の
文字列を検索して登録やシリアル番号のロジックを探し出そうとするアタッカーに対する防御手段を提供しま
す。
バイト コードの最適化
アプリケーションの一部または全部に対して、バイト コードの最適化を実行することができます。DashO は、代
数恒等式や文字列の削減、ピープホールの最適化などを実行します。
ウォーターマーク
DashO は、ソフトウェアの不正コピーの出所を追跡できるよう、難読化された jar ファイルにウォーターマークを
追加することができます。ウォーターマークは、実行時の動作に影響を与えることなく、固有の顧客識別番号
や著作権情報などのデータをアプリケーションに目立たないように埋め込みます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
5
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
概要
DashO ユーザー インターフェイスの起動
DashO ディレクトリにある dashogui または dashogui.bat を実行して、DashO のユーザー インターフェイスを
起動します。
メモ
Windows 7®(およびそれ以前)では、[スタート|すべてのプログラム|DashO 7.0|DashO 7.0]メニュー
をクリックして、DashO ユーザー インターフェイスを起動できます。
Windows 8® では、スタート画面のすべてのアプリ ページに表示される DashO 7.0 で見つかります。
ユーザー インターフェイスについては、Advanced モードのユーザー インターフェイスおよび Quick Jar ユー
ザー インターフェイスに説明されています。インターフェイスを使用してプロジェクトを作成したら、そこから、も
しくはコマンド ラインからプロジェクトを実行できます。
6
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
DashO の登録
初めて製品を使用するとき、登録手続きをガイドするダイアログが表示され、登録を求められます。購入の確
認メールまたは評価の承認メールを介して提供されたシリアル番号を使用して、登録フォームに必要事項を
記入します。必須フィールドに有効な情報が入力されるまで、それらの欄は強調表示されます。
Web へのアクセスにプロキシ サーバーを使用する場合は、その情報も入力する必要が生じるかもしれません。
一般に、DashO はオペレーティング システムからプロキシ情報を取得するので、お客様は[登録]をクリックす
るだけで済みます。
登録が送信された後、DashO はカスタマー フィードバック プログラムへの参加を要求します。DashO の評価
中である場合は、自動的に登録されます。
お客様のインストールの確認メールをお送りします。
メモ
弊社のサポート部門に連絡する必要がある場合は、[Help|About DashO]をクリックして、シリアル番号を
探してください。PreEmptive Solutions のサポート部門には、電話番号 (216) 732-5895 内線 3、または電子
メール [email protected] で連絡できます。
DashO に関する FAQ
DashO に関する最新の FAQ は、オンラインの www.preemptive.com/products/dasho/FAQ.html(英語)で参照
できます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
7
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
プロジェクトの種類の選択
PreEmptive Solutions は、さまざまな状況でのニーズに応えられるように DashO を設計しています。DashO を
操作するための主要なモードが 2 つあります。
1.
Advanced(エントリ ポイント)モードのユーザー インターフェイスは、アプリケーションが複雑な場合、詳細な制
御を行いたい場合、不要コードの除去が望まれる場合に最適です。
2.
Quick Jar モードのユーザー インターフェイスは、main メソッドを含んでいる単純なスタンドアロン アプリケー
ションの場合や、不要コードの除去が必要ない場合に適しています。
以下は、Quick Jar と Advanced のどちらのモードを使用するかを決定する際に考慮すべき規準のリストです。
以下のすべてを満たす場合は
Quick Jar モードが適切
以下のいずれかを満たす場合は
Advanced モードが適切
アプリケーション
コンポーネント
アプリケーションまたはライブラリは、jar ファ
イルのみで構成されている。リフレクション
の使用が制限されている。
アプリケーションまたはライブラリは、jar ファイルと、
クラス ファイルのディレクトリを含んでいる。Spring
や Hibernate などのリフレクション ベースのフレーム
ワークを使用する。
制御の精度
粗い – 難読化をオンまたはオフにすること
ができる。
細かい – 難読化をオンまたはオフにすることがで
き、単独の難読化から特定のクラス/メソッド/フィー
ルドを除外することができる。
不要コードの除去
すべてのメソッドおよびフィールドを保持す
る必要がある。
使用されていないメソッドおよびフィールドを削除
する必要がある。
パッケージ化
難読化されたクラスを元のパッケージに保
持する必要がある。
難読化されたすべてのクラスを単一の jar に置く必
要がある。
規準
Quick Jar モードでは、DashO は入力 jar のそれぞれのマニフェストに Main-Class 情報が含まれているかど
うかを確かめます。マニフェストに Main-Class として指定されたクラスが、エントリ ポイントとして追加されま
す。入力 jar ファイルのいずれもマニフェストにメイン クラスがない場合は、入力 jar ファイル内のすべてのクラ
スがエントリ ポイントとして追加されます。エントリ ポイントは、入力およびサポート jar ファイルで必要とされるク
ラスを分析するために、DashO によって使用されます。
メモ
Quick Jar モードでは、DashO は入力 jar ファイルからどのクラスも削除しません。出力 jar ファイルは、すべ
ての入力クイック jar ファイルからすべてのクラスを受け取り、DashO はこれらのクラスの名前を変更すること
ができます。入力 jar ファイルの非クラス ファイルは、自動的に出力に含められます。
いずれのプロジェクトの種類も、グラフィカル ユーザー インターフェイスまたはコマンド ラインからビルドできま
す。DashO は、Apache Ant 用のタスクと、Eclipse IDE で使用するためのプラグインも提供しています。
8
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
New Project Wizard
DashO プロジェクトを作成するための最も簡単な方法は、New Project Wizard を使用することです。ウィザード
は、アプリケーションを調べて、そのアプリケーションを難読化するための設定を決定します。ウィザードを起動
するには、[File|New Project|Wizard]メニューを選択します。
ウィザードの最初のステップは、アプリケーションの特徴を明らかにすることです。アプリケーションを最もよく表
している種類を選択します。
その選択に基づいて、ウィザードはアプリケーションの種類に固有の一連の質問を尋ねます。以下のセクショ
ンでは、アプリケーションの種類ごとにウィザードを使用する方法を示します。
メモ
既定では、New Project Wizard はスタートアップ時に自動的に起動します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
9
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
ライブラリ アプリケーション
難読化の対象としてライブラリを選択すると、ウィザードは、ライブラリを含んでいる jar ファイルまたはディレクト
リの場所を聞いてきます。
ウィザードはライブラリを調べて、実行時または難読化の目的のために必要となる依存関係を決定します。難
読化する入力として、またはランタイム サポートの jar ファイルとして、追加の jar を加えることができます。
[Missing classes]一覧は、ライブラリによって参照されるクラスを示します。
10
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
次にウィザードは、ライブラリ内のエントリ ポイントについて尋ねます。ウィザードは、エントリ ポイントとして使用
される特別なクラスやメソッドと一緒に、ライブラリ全体を 1 つのエントリ ポイントとして表示します。
最後にウィザードは、結果として生じるプロジェクト ファイルを保存する場所を尋ねます。既存のプロジェクト
ファイルを上書きする場合、ウィザードは新しい選択内容を使ってプロジェクト ファイルを更新します。この上
書きにより、[Make Synthetic]オプションは[Only private and package]の設定に更新されますが、他の難
読化および PreEmptive Analytics の設定は保持されます。
メモ
ライブラリを難読化するときは、[Make Synthetic]オプションの Never、Only private and package、
または If not public を使用します。Always を選択すると、エンド ユーザーにライブラリが正しく公開
されなくなります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
11
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Jar 内のアプリケーション
難読化の対象としてアプリケーション jar を選択すると、ウィザードは、アプリケーションを含んでいる jar ファイ
ルの場所を聞いてきます。
ウィザードはアプリケーションを調べて、実行時または難読化の目的のために必要となる依存関係を決定しま
す。難読化する入力として、またはランタイム サポートの jar ファイルとして、追加の jar を加えることができます。
[Missing classes]一覧は、アプリケーションによって参照されるクラスを示します。
12
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
次にウィザードは、アプリケーションのエントリ ポイントについて尋ねます。jar のマニフェストに Main-Class
属性が含まれている場合は、それがエントリ ポイントとして挙げられます。それに加えてウィザードは、エントリ
ポイントとしても使用できる特別なクラスやメソッドを表示します。DashO はこれらのエントリ ポイントを使用して、
難読化された出力から除去する、使用されていない項目を決定します。DashO をフォローするために希望す
るだけのエントリ ポイントを選択できます。エントリ ポイントは、少なくとも 1 つは選択する必要があります。
最後にウィザードは、結果として生じるプロジェクト ファイルを保存する場所を尋ねます。既存のプロジェクト
ファイルを上書きする場合、ウィザードは新しい選択内容を使ってプロジェクト ファイルを更新します。他の難
読化および PreEmptive Analytics の設定は保持されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
13
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
WAR ファイル
難読化の対象として WAR ファイルを選択すると、ウィザードは、難読化する WAR ファイルの場所と名前を聞
いてきます。
ウィザードは、WAR に含まれるクラスや jar ファイルについて、WAR ファイルを調べます。これらの項目には、
JNLP ファイルによって参照される jar ファイルだけでなく Web コンテナによっても使用される、WEB-INF 内の
特別な場所が含まれています。WAR ファイル内のどの項目を難読化するかを選択できます。
14
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
WAR ファイルに格納されている jar ファイルに加えて、DashO はサーブレットと JSP API の一部であるクラスを
必要とします。ウィザードは、既知の場所でこれらの jar ファイルを探し、難読化されないサポート jar ファイル
の一覧にこれらを追加します。アプリケーションが Web コンテナに対し、log4j ログ サービスなどの Web アプリ
ケーション間で共有されるその他すべてのクラスを提供することを期待している場合は、それを jar ファイルの
一覧に追加する必要があります。
最後にウィザードは、ウィザードの出力を保存するディレクトリを尋ねます。ウィザードは、プロジェクト ファイル
に加えて、いくつかのファイルを作成します。

obfuscate.xml:WAR ファイルを開き、DashO プロジェクト ファイルを実行してから、WAR ファイルを
再アセンブルする Ant スクリプト。

obfuscate.properties:obfuscate.xml が読み取る、Java のプロパティ ファイル。場所の既定値を変
更するには、このファイルを使用します。
obfuscate.xml ファイルは、Ant を起動して実行することができます。
例
ant -f obfuscate.xml
または、別の Ant ファイルから呼び出すこともできます。
例
<ant antfile="obfuscate.xml"/>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
15
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
3 つのタスクを実行します。

WAR ファイルをディレクトリに解凍します。既定のディレクトリは .unwar です。

.unwar ディレクトリの内容に対して、ウィザードで生成されたプロジェクト ファイルを実行します。結果は、
一時的に .obfus ディレクトリに格納されます。

難読化された結果を新しい WAR ファイルに入れ、元のファイル名に _dashoed を加えた名前で WAR
を再作成します。
メモ
DashO プロセスに割り当てられている既定のメモリは 192M です。この値や、その他 WAR ファイルの処理で
使用される既定値は、obfuscate.properties を編集して変更することができます。
既存のプロジェクト ファイルを上書きする場合、ウィザードは新しい選択内容を使ってプロジェクト ファイルを
更新します。他の難読化および PreEmptive Analytics の設定は保持されます。
難読化を実行するには、DashO の Ant タスクをインストールする必要があります。詳細については、DashO の
Ant タスクのドキュメントを参照してください。
16
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Android アプリケーション
難読化の対象として Android アプリケーションを選択すると、ウィザードは Android プロジェクトの場所を聞い
てきます。
必要条件
● Android SDK Tools Revision 10 以降
● Apache Ant 1.8 以降
● DashO Ant タスクのインストール - 詳細については、Ant タスクのドキュメントを参照してください。
Apache Ant によって使用される AndroidManifest.xml および build.xml ファイルが Android プロ
ジェクトに含まれている場合、ウィザードは、プロジェクトの場所とするディレクトリを検討します。IDE を使用し
て Android アプリケーションを作成した場合は、build.xml が存在しないことがあります。Android SDK を使
用して必要な build.xml を作成してから、アプリケーションをコンパイルします。
android update project --path projectpath [--target {targetID}]
ant debug
Android アプリケーションのソースを既に含んでいるディレクトリでこれを実行しても、ファイルは上書きされませ
ん。
ウィザードはアプリケーションを調べて、実行時または難読化の目的のために必要となる依存関係を決定しま
す。難読化する入力として、またはランタイム サポートの jar ファイルとして、追加の jar を加えることができます。
Android アプリケーションで Google API のようなアドオンのターゲットを使用する場合、これらのライブラリはサ
ポート ファイルとして自動的に追加されます。[Missing classes]一覧は、アプリケーションによって参照されて
いるが、見つからなかったクラスを示します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
17
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
ウィザードは、AndroidManifest.xml、リソース、およびコンパイルされたクラスを分析して、アプリケーショ
ンのエントリ ポイントを決定します。Android アプリケーションの場合は、ウィザードが提示するすべてのエントリ
ポイントを使用する必要があります。
ウィザードは、いくつかのファイルを作成または変更します。

project.dox:プロジェクト固有の設定をすべて含んでいる、DashO の構成ファイルです。これは、プ
ロジェクトのソース コードに直接関係します。このファイルは、DashO のユーザー インターフェイスを使っ
て操作することができます。

build.xml:Android ツールによって作成される、Ant スクリプトです。ウィザードはこのファイルを変更
して、特定のビルド タスクを追加します。変更には、dasho.xml の呼び出しが含まれます。これはプロジェ
クト固有ではありません。ただし、DashO のバージョンが違えば(DashO に新しい機能が追加されているの
で)、異なる変更を行う可能性はあります。

dasho.xml:メインの build.xml によって参照される、Ant スクリプトです。これは、難読化する対象を提
供します。このファイルには、プロジェクト固有のデータは含まれません(project.dox への参照を除く)が、
DashO のバージョンが違えば(DashO に新しい機能が追加されているので)、異なるバージョンのファイル
が作成されます。

AntDroid.xml:これを Eclipse に入れると、Ant スクリプトの実行が簡単になり、Eclipse 内から難読化を
行えるようになります。ウィザードで 1 度作成されたら、その後は変更されません。プロジェクト名が含まれ
ていることを除いて、大部分は一般的なものです。
メモ
[Finish]をクリックした後、${out.classes.dir} の隣にある赤い 'X' に気が付くかもしれません。まだ新しいスクリ
プトを使用してアプリケーションをビルドしていないので、これは正常です。
18
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
プロジェクトのビルド
DashO のユーザー インターフェイスを使用して、難読化およびインストルメンテーションを構成します。アプリ
ケーションを難読化するには、アプリケーションのビルドや配置にターゲットを使用する前に、ターゲットの難読
化を実行する必要があるだけです。

ant obfuscate debug

ant obfuscate release

ant obfuscate debug install
PreEmptive Analytics 用として、追加の instrument ターゲットを Ant ファイルで使用することもできます。こ
れらを上記の obfuscate の代わりに使用した場合、難読化に使用されるのと同じプロジェクト ファイルが実
行されますが、すべての難読化の変換は行われません。
メモ
debug、release、install およびその他の ant ターゲットは Android SDK で定義されていますが、これらは
SDK の間で異なる場合があります。
DashO は、クラスの名前の変更が可能になるように AndoidManifest.xml ファイルを書き換えます。生成された
ant スクリプトは、元のマニフェスト ファイルを自動的にバックアップし、SDK のパッケージ手順後に復元します。
表示されるファイルは次のとおりです。

AndroidManifest.xml – アプリケーションを記述するために、Android とそのさまざまなツールによっ
て使用されるマニフェスト ファイル。このファイルは、DashO の処理の一環として書き換えられ、パッケージ
手順後に元の状態に戻されます。

AndroidManifest_pre_ob.xml – これは、DashO の完了時に元のファイルを復元するために使用
される、あらかじめ難読化されたバージョンのコピーです。

AndroidManifest_ob.xml – これは、パッケージ アプリケーションの AndroidManifest.xml の内容を
含んでいるマニフェストの難読化されたバージョンです。
メモ
上記のファイルは ant スクリプトが管理します。DashO の GUI を使用してプロジェクトを難読化した場合、
AndroidManifest.xml ファイルは元の状態に戻されません。そのため、GUI を使って Android プロジェクトを
難読化することはお勧めしません。
Spring Framework を使用したプロジェクト
DashO における Spring Bean のサポートは、主として Spring Bean の特殊クラスによって提供されます。これは、
クラス名(または名前のパターン)と任意のエントリ ポイント(たとえば、init、destroy、および factory メソッド)で
構成されています。処理中、プロパティ メソッド(get*()、is*()、および set*(*))、パブリック コンストラクター、お
よび構成されているエントリ ポイントが後に続いて、使用されていないメソッドを決定します。クラス、構成され
ているエントリ ポイント、プロパティ メソッド、および非プロパティ メソッドの名前は、変更されるように設定するこ
とができます。
DashO は、各ビルド中に Spring XML ファイルをスキャンして、対応する Java クラスの名前を変更した場合に
は、XML ファイル内のすべてのクラス参照を更新します。これは、直接クラス参照を更新するだけでなく、パラ
メーターや引数の型に挙げられているクラス名も更新します。また DashO は、Bean プロパティの名前やエント
リ ポイント メソッドの名前を変更した場合は、それらも更新します。抽象 Bean(たとえば、クラスのない Bean 定
義)では、関連するプロパティやメソッドの名前も、名前変更された Bean に関係していると見なされて更新され
ます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
19
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
DashO の Spring サポートを最大限に有効利用するためには、New Project Wizard を使用してプロジェクトを
開始してから、必要に応じて、特殊クラスに対して個別調整を行うことをお勧めします。
New Project Wizard では、Spring XML ファイルを識別し、それらのファイルで Bean クラスの参照をスキャンし
て、Spring Bean の特殊クラスを構成します。New Project Wizard は、Spring XML ファイル内の Bean 定義を
検出すると、次のことを行います。

識別されたクラスの、新しい Spring Bean 特殊クラスを作成します。

XML で構成されている init-method 属性または destroy-method 属性を探して、それらをエント
リ ポイントとして特殊クラスに追加します。init-method 属性も destroy-method 属性も見つからな
かった場合は、それぞれ default-init-method 属性または default-destroy-method 属性
を調べて、代わりにそれらをエントリ ポイントとして特殊クラスに追加します。

Bean に直接構成されている factory-method を探して、エントリ ポイントとして特殊クラスに追加しま
す。

構成されている lookup-method 要素または replaced-method 要素を探して、それらをエントリ ポ
イントとして特殊クラスに追加します。

util:constant static-field ま た は org.springframework.beans.factory.config.FieldRetrievingFactoryBean
Bean を使用して参照されている定数値を探します。
SpringBean サンプル プロジェクトで DashO のサポートの例が示されているので、そちらをご覧ください。
メモ
factory-bean 属性を使用している場合は、対応する factory-method をエントリ ポイントとして適切なクラスに
手動で追加する必要があります。
replaced-method 機能を使用している場合は、名前を変更した後に正しいメソッドが識別されるよう、署名を指
定する必要があるかもしれません。
FieldRetrievingFactoryBean を使用している場合、targetObject 属性はサポートされません。
20
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
ユーザー インターフェイス リファレンス
メインのユーザー インターフェイス ウィンドウ
DashO を起動すると、デスクトップにユーザー インターフェイスが表示されます。既定のビューは、下図で示す
ように、Advanced モードのユーザー インターフェイスの Input パネルです。
DashO のユーザー インターフェイスは、5 つのアクティビティ領域で構成されています。
1
メニュー バー
ウィンドウの上部には、通常のメニュー バーがあります。
2
ツール バー
メニュー バーの下には、頻繁に使用する操作のアイコンを含んでいるツール バーがあります。
3
ナビゲーション
ツリー
ツール バーの下、作業領域の左には、プロジェクトの設定項目とコマンドを実行するためのイ
ンターフェイスを体系化するナビゲーション ツリーがあります。
4
作業領域
作業領域は、メイン ウィンドウのうち最も大きい場所を占有します。名前が示すように、これは
作業活動が起こる場所です。
5
コンソール
ウィンドウの最下部のスクロール可能なコンソール ペインには、処理の出力が表示されます。
DashO ユーザー インターフェイスから、いずれのユーザー インターフェイスを使用するかを選択できます。

jar モードのユーザー インターフェイス – Quick Jar エントリ ポイントを使用して DashO プロジェクトを作成、
編集する場合。

Advanced ユーザー インターフェイス – 従来のエントリ ポイントを持つ DashO プロジェクトの場合。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
21
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
メニュー バー
メニュー
項目
サブ メニュー項目
説明
File
New Project
新しい Advanced または Quick Jar プロジェクトを作成するか、または Wizard を選
択して、DashO でプロジェクトを作成します。
Open Project
既存のプロジェクトを開きます。
Recent Projects
最近アクセスしたプロジェクトの一覧を見たり、開いたりします。
Save Project
新しい、または変更したプロジェクトを保存します。
Save Project As
既存の、または変更したプロジェクトを別の名前で、あるいは別の場所に保存しま
す。
Exit
DashO を閉じて終了します。
Build Project
プロジェクトを難読化します。
Cancel
プロジェクトをビルドまたは更新するときにのみ利用できます。[Cancel]を使用す
ると、ビルドや再読み込みを取り消すことができます。
Reload Class List
新しいクラスがプロジェクトに追加されたときに利用できます。
Convert
Quick Jar プロジェクトを Advanced プロジェクトに変換します。
View Project
プロジェクトを変更または作成した後、保存するときにのみ利用できます。既存の
プロジェクトをテキスト ファイルとして表示することができます。
View Report File
レポートを変更または作成した後、保存するときにのみ利用できます。既存のレ
ポートを表示することができます。
View Renaming
Report File
名前の変更レポート ファイルを変更または作成した後、保存するときにのみ利用
できます。既存の名前の変更レポートを表示することができます。
Decode
Stack Trace
難読化されたプログラムからスタック トレースを復元します。スタック トレースのデ
コードを参照してください。
Shelf Life Token
ファイルに保存することができる、Shelf Life トークンを作成します。Shelf Life トー
クンの生成を参照してください。
User Preferences
全般および DashO エンジンのオプションを選択します。User Preferences(ユー
ザー設定)を参照してください。
Help
DashO アシスタンスにすぐにアクセスできます。
Register Product
登録手続き時にのみ利用できます。ユーザーが自身の DashO バージョンを登録
できるようにします。
Check for Updates
最新バージョンの DashO を使用しているか確認します。
Customer
Feedback Options
DashO の匿名によるカスタマー フィードバック プログラムへ参加します。
About DashO
インストールされている DashO に関する情報を提供します。
Project
Window
Help
ツール バー
アイコン
22
アイコン名
機能
New Project
プロジェクト ウィザードを使用して、新しいプロジェクトを作成します。
Open Project
既存のプロジェクトを開きます。
Save Project
新しい、または変更したプロジェクトを保存します。
Project Save As
既存の、または変更したプロジェクトを別の名前で、あるいは別の場所に保存します。
Reload Class
List
新しいソースがクラス一覧に追加されたときに、その一覧を更新します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Build Project
プロジェクトを難読化します。
Cancel Build
進行中のプロジェクトのビルドを取り消します。
Help
この『ユーザーズ ガイド』にアクセスします。
作業領域
作業領域の内容は、ナビゲーション ツリーで選択された項目によって決まります。
メモ
作業領域には切り替えボタンがあります。 を使用すると、コンソールが折りたたまれて作業領域のサイズ
が大きくなります。 をクリックすれば、コンソールを展開できます。
コンソール
コンソール領域には 2 つのタブがあります。

Console – プロジェクトの作成およびビルドの進行状況が表示されるほか、エラー、警告、および情報メッ
セージの数が提供されます。

Problems – 難読化中に発生したあらゆる情報、警告、エラー、および致命的なメッセージを一覧表示し
ます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
23
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Advanced モード ユーザー インターフェイス
このセクションでは、Advanced モード プロジェクト用の DashO インターフェイスの使用方法について説明しま
す。このインターフェイスでは、新しいプロジェクトの作成または既存プロジェクトの編集を実行できます。作成
または編集したプロジェクトを保存して、後からコマンド ライン インターフェイスや Ant で使用することもできま
すが、インターフェイス内で難読化を実行して、その結果を表示することも可能です。
Input セクション
Input セクションは、プロジェクトへの入力を構成するために使用されます。これには、処理される jar ファイル
の場所とクラスのディレクトリ、およびアプリケーションの動的な流れを分析するために使用される、これらのクラ
スへのエントリ ポイントが含まれます。
Input – Jars and Classes
Input セクションは、処理するクラスの場所から始まります。DashO はディレクトリや、クラスパス内のクラス、zip
ファイル、および jar ファイルを処理することができます。エントリは、[Add]ボタンを使用してファイル システム
からそれらを選択することによって追加できます。[New]ボタンを使ってエントリを作成し、名前を編集すること
もできます。入力の項目を追加または削除した後、ツール バーにある「クラス一覧の更新」アイコンを使用する
か、ショートカット メニューから[Refresh List]を使用してください。
メモ
エントリを追加または削除すると、クラス ツリーは自動的に更新されます。ただし、手で名前を入力した場合
は自動的に更新されません。名前の編集が終わったら、更新ボタンを使用してください。
24
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
入力エントリの作成の詳細については、<inputpath> セクションを参照してください。
Input – Supporting Classpath
DashO は、Java ランタイムのクラスと、サード パーティの jar ファイル内のクラスにアクセスする必要があります。
ここで参照されるクラスは、DashO の分析に必要なだけで処理されません。エントリは、[Add]ボタンを使用し
てファイル システムからそれらを選択することによって追加できます。[New]ボタンを使ってエントリを作成し、
名前を編集することもできます。
既定で、DashO が使用する Java ランタイムの場所はパスに追加されます。J2ME や Android の API を使用す
るプロジェクトは、クラスパスにランタイム jar ファイルを追加しないでください。このようなプロジェクトは、これら
特定の環境用のランタイム jar ファイル、たとえば midpapi10.jar や Android.jar を必要とします。提
供したエントリに環境のクラスパスを Append(末尾に追加)したり、Prepend(先頭に追加)したりすることもで
きます。
新しいクラスパス エントリの作成の詳細については、<classpath> セクションを参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
25
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Input – Included Non-Class Files
Intput – Included Non-Class Files パネルでは、アプリケーションに含まれていなければならないイメージ、プロ
パティ、構成ファイルなどの、非クラスの内容のソースを指定できます。
[Add]ボタンを使って既存のファイルを選択することにより、ディレクトリ、個々のファイル、または jar ファイルを
一覧に追加することができます。[New]ボタンを使ってエントリを作成し、名前を編集することもできます。ディ
レクトリおよび jar ファイルの場合、非クラスのすべてのファイルは DashO の出力にコピーされます。ディレクト
リ エントリには、特定のファイルの種類を選択するための * 文字を使ったワイルドカード パターンを含めること
ができます。
ディレクトリ、zip、および jar ソース内部の非クラス ファイルは、それらの相対的な内部ディレクトリを保持して出
力先にコピーされます。指定した非クラス ファイルが出力先にコピーされます。詳細については、
<includenonclassfiles> セクションを参照してください。
メモ
非クラス ファイルの処理中に検出された XML 構成ファイルは、クラス名やメソッド名を変更できるように更新
されることがあります。
入力をマージするとき、入力に非クラス ファイルが含まれている場合は、[Auto Copy]をオンにするか、ここ
でそれらを参照することができます。入力をマージしない場合は、DashO が入力 jar ファイル内のすべての
非クラス ファイルを自動的にコピーします。ただし、入力ディレクトリに現れる非クラス ファイルはコピーされま
せん。詳細については、Auto copy を参照してください。
26
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Input – Options
このパネルは、DashO が入力クラスの分析時に使用するいくつかの基本的なオプションを制御します。
Ignore Missing Classes
DashO は、アプリケーションが呼び出そうとするすべてのクラスの分析を試みます。このオプションを選択する
ことで、これらのクラスを無視するよう DashO に指示できます。ただし、DashO は、アプリケーションが拡張また
は実装するクラスとインターフェイスをスキップできないことに注意してください。
Ignore Missing Methods
DashO は分析の一環として、メソッドの具体的な実装を探そうとします。このオプションをオンにすると、目的の
メソッドを見つけられない場合でも処理が進められるようになります。このオプションは慎重に使用してください。
Use Exit Behavior from DashO 6.x and Earlier
DashO のコマンド ラインおよび Ant タスクは、終了コードとしてエラー数を返します。このオプションをオンにす
ると、致命的なエラーがないときは終了コードとして 0 を使用するように設定されます。
Halt on First Error
DashO は、入力の処理中にエラー、警告、および情報メッセージを生成します。このオプションをオンにすると、
エラーが発生したら直ちに処理を停止するように構成されます。
Bypass DashO Processing
このオプションをオンにすると、DashO は何も処理を実行しないように構成されます。単に、入力が出力にコ
ピーされます。入力をマージして出力にするときは、このオプションはサポートされません。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
27
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Reflection Halts Build
DashO の分析では、リフレクションのターゲットを識別できるように、アプリケーションでのリフレクションの使用
状況を記録します。アプリケーションのどの部分がリフレクションを使用しているか判断している場合には、この
オプションをオンにします。
Determine Reflected Classes
DashO は、リフレクションの一部のターゲットを決定し、これらのクラスが確実に出力に現れるよう、自動的に追
加することができます。この処理によって、ビルド時間が長くなる可能性があることに注意してください。
Rename Reflected Classes
既定では、リフレクションのターゲットの名前は変更されません。これらのクラスの名前を変更できるようにする
には、このオプションを使用します。
28
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Entry Points – Methods and Fields
フィールドとメソッドは、アプリケーションへのエントリ ポイントを示すために使用されます。DashO の分析はエ
ントリ ポイントの場所から始まり、これらを使用して、アプリケーションの呼び出し先を詳しく検討します。これに
より、DashO は使用されていないクラスやメンバーを除去することが可能になります。既定では、エントリ ポイン
トとして使用されるメソッドやフィールドの名前は変更不能です。クラスおよびメンバーの名前を変更可能にす
るには、項目を右クリックして[Properties]ダイアログ ボックスを表示し、[Rename]チェック ボックスをオンにし
ます。
メソッドやフィールドに基づくエントリ ポイントを定義する規則を構成するには、グラフィカルな規則エディター
の使用セクションを参照してください。
条件付き対象選択
ときには、クラス ファイルをプロジェクトに手作業で含める必要が生じることがあります。Class.forName()
コンストラクトがプロジェクトのどこかで使用されている場合、DashO は必要とされる可能性のあるすべてのクラ
スを判断できません。この場合には、forName() コンストラクトで参照されるあらゆるクラスは、エントリ ポイン
トとして手動で含める必要があります。これらのクラスの名前を変更可能にしてはいけません。forname 検出
の詳細については、高度なトピックを参照してください。
メモ
エントリ ポイントが定義されていない場合、DashO は、入力 jar ファイルのマニフェストにエントリ ポイントを見
つけられないかどうか調べます。何も見つからない場合は、既定値である "ライブラリ モード" になります。こ
のモードでは、すべての public および protected のクラスとメンバーがエントリ ポイントとして使用されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
29
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Entry Points – Libraries
クラスの jar ファイルやディレクトリを、ライブラリのエントリ ポイントとして使用することができます。DashO は、ク
ラスの全パブリック メンバーを名前変更可能でないエントリ ポイントとして使用します。任意で、プロテクト メン
バーを名前変更可能でないエントリ ポイントとして追加することもできます。
ライブラリは、[Add]ボタンを使用してファイル システムからそれらを選択することによって追加できます。
[New]ボタンを使ってライブラリ エントリを作成し、名前を編集することもできます。ライブラリ エントリの名前に
プロパティ参照を含めることができます。
ライブラリのエントリ ポイントの詳細については、<library> エントリ ポイントを参照してください。
メモ
ライブラリとして追加された jar ファイルやフォルダーを入力一覧に追加する必要はありません。ライブラリは
入力一覧と組み合わさって、処理するクラスを決定します。ライブラリのエントリを追加または削除したら 、
ツール バーまたはメニューから更新オプションを使用して、入力クラスの一覧を更新することができます。
30
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Entry Points – Special Classes
特殊クラスのエントリ ポイントを使用すると、クラスの仕様として、インターフェイスの実装や、アプリケーション
へのエントリ ポイントを定義するクラスの拡張を含めることが可能になります。これらのエントリ ポイントは、通常、
Spring、J2ME、アプレットの類のフレームワークによって定義されます。これらのクラスの名前は、完全一致、
パターン、あるいは正規表現で指定することができます。
既定では、特殊クラスの名前は変更不能です。クラスとそのメンバー(ほとんどの場合、メンバー)の名前を変
更可能にするには、編集する項目を右クリックして[Properties]ダイアログ ボックスを表示し、[Rename Class]
または[Rename Members]チェック ボックスをオンにします。
Applet
DashO では、アプレットは、直接的または間接的に java.applet.Applet を拡張するクラスです。アプ
レットのクラスの名前は変更可能にできますが、java.applet.Applet によって定義されるメソッドの名前
は変更可能になりません。詳細については、<applet> セクションを参照してください。
Servlet
DashO では、サーブレットは、直接的または間接的に javax.servlet.Servlet を実装するクラスです。
サーブレットのクラスの名前は変更可能にできますが、java.applet.Servlet によって定義されるメソッド
の名前は変更可能になりません。詳細については、<servlet> セクションを参照してください。
Enterprise JavaBeans - EJB
Enterprise JavaBeans は、分散型オブジェクト指向の企業アプリケーションを作成するために使用できる、Java
で書かれたサーバー側のコンポーネントです。DashO の目的としては、EJB は、Bean のホームと主要なクラス
を含む javax.ejb パッケージで定義されているインターフェイスを拡張するクラスです。詳細については、
<ejb> セクションを参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
31
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
MIDlet と iAppli
MIDlet は、Java ME、CLDC、または MIDP を使用して、埋め込みデバイスで動作する Java クラスです。
MIDlet クラスは、直接的または間接的に javax.microedition.midlet.Midlet を拡張する必要があ
ります。iAppli クラスも似ていますが、こちらは NTT ドコモの i アプリ フレームワークを使用して、直接的または
間接的に com.nttdocomo.ui.IApplication を拡張します。MIDlet および iAppli のクラスの名前は
変 更 可 能 に で き ま す が 、 javax.microedition.midlet.Midlet ま た は
com.nttdocomo.ui.IApplication によって定義されるメソッドの名前は変更可能になりません。詳細
については、<midlet> と <iappli> セクションを参照してください。
Android
Android は 、 Android ア プ リ ケ ー シ ョ ン の ク ラ ス を 識 別 す る た め に 使 用 さ れ ま す 。 こ れ ら の ク ラ ス は 、
android.app.Application 、 android.app.Activity 、 android.app.Service 、
android.content.BroadcastReceiver、または android.content.ContentProvider を拡
張します。これらはそれぞれ AndroidManifest.xml 内に、アプリケーション、アクティビティ、サービス、レシー
バー、またはプロバイダーとして指定されています。詳細については、<android> セクションを参照してください。
SpringBean
SpringBean は、Spring Bean として使用されているクラスを識別するために使用されます(これらのクラスは、
spring xml 構成ファイルで参照されます)。init-method や destroy-method など非プロパティ メソッド
のための、Additional Entry Points の設定があります。他の特殊クラスとは異なり、名前を変更するメンバーは
さまざまなカテゴリに分けられます。

Rename Property Methods – プロパティ メソッドおよびフィールドの名前の変更を制御します。

Rename Entry Points – 指定された Additional Entry Points の名前の変更を制御します。

Rename Other Members – その他すべてのメソッドおよびフィールドの名前の変更を制御します。
詳細については、<springbean> セクションと Spring Framework を使用したプロジェクト セクションを参照してく
ださい。
Class public fields/methods
DashO は、クラス内のすべてのパブリック フィールドおよびメソッドをエントリ ポイントとして使用します。クラスと
そのパブリック メンバーの名前は変更されません。詳細については、<publics> セクションを参照してください。
Class all fields/methods
DashO は、クラス内のすべてのフィールドおよびメソッドをエントリ ポイントとして使用します。クラスとその全メ
ンバーの名前は変更されません。このようにクラスを指定すると、クラスの対象選択が無条件で実行されます。
詳細については、<unconditional> エントリ ポイント セクションを参照してください。
32
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
User Properties
User Properties パネルでは、プロジェクトで参照できるプロパティを作成し、値を割り当てることができます。こ
れを使用すると、テンプレートとして機能するプロジェクトを作成できます。プロパティは、他のプロパティの条
件に基づいて定義したり、他のプロパティの値を操作したり、既定値を提供したりすることができます。プロパ
ティの値は、環境変数への参照も含め、1 つまたは複数のプロパティ参照を使用して指定できます。このプロ
パティ参照として、既定値、間接参照、置換構文が挙げられます。詳細については、プロパティ参照を参照し
てください。再帰的なプロパティを定義することはできません。
プロジェクトでのプロパティの使用については、<propertylist> セクションを参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
33
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Removal – Options
Removal – Options パネルでは、入力に含まれる使用されていないクラスとメンバーに起こることと、メタデータ
の除去について制御します。
Unused Classes
これは、使用されていないクラスの処理を制御します。オプションには、未使用のクラスをすべて除去する、パ
ブリックでない未使用クラスのみ除去する、除去を実行しない、があります。詳細については、<removal> を参
照してください。
Unused Members
これは、使用されていないメソッドとフィールドの処理を制御します。オプションには、未使用のメンバーをすべ
て除去する、パブリックでない未使用メンバーのみ除去する、除去を実行しない、があります。詳細については、
<removal> を参照してください。
Debug Information
これは、コンパイラによって挿入されるデバッグ情報の除去を制御します。ほとんどの情報はデバッガーが使
用するためのものですが、保持する最も有用な情報は行番号とソース ファイルです。行番号を含むスタック ト
レースを生成するには、これら 2 つが保持されている必要があります。詳細については、<debug> セクションを
参照してください。
34
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
メモ
[Local Variables]および[Local Variable Types]のフィールドの名前は変更されません。製品リリースでこれ
らの属性をそのままにしておくと、難読化を損なう可能性があります。
Attributes
Java コンパイラは、クラスとそのメンバーの追加のメタデータを生成し、その情報をクラス ファイル内の属性に
格納します。この情報の一部は、コンパイラがライブラリに対してコンパイルを実行する際に、あるいはリフレク
ションを使用するアプリケーションで必要となります。クラス ファイルのサイズを縮小するために、これらの設定
を使用して、アプリケーションが実行時に必要としない情報を選択的に除去することができます。詳細につい
ては、<attributes> セクションを参照してください。
Removal – Exclude
Removal – Exclude パネルでは、クラスや、クラスのメソッドおよびフィールドを名前の変更対象から除外する規
則を構成できます。個々のメソッド、フィールド、クラス、またはパッケージ全体を除外することができます。
正規表現を使用して、個々のクラスやクラスのグループ、あるいはパッケージ全体を除外する規則を作成する
ことができます。詳細については、グラフィカルな規則エディターの使用を参照してください。
メモ
ここで参照されるクラスは、Classes セクションで参照されていても除去されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
35
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Removal – Classes
単体テストやサンプルなどのような、結果の出力に現したくないクラスが入力に含まれている場合は、DashO
でそれらを除去することができます。これらの規則に一致するクラスは、DashO の出力に現れないようになりま
す。それらがほかの入力クラスの参照である場合は、サポート クラスであるかのように扱われます。
正規表現を使用して、個々のクラスやクラスのグループ、あるいはパッケージ全体に一致する規則を作成する
ことができます。詳細については、グラフィカルな規則エディターの使用を参照してください。
メモ
ここで参照されるクラスは、さらに Exclude セクションで参照されていても除去されます。
36
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Removal – Method Calls
ログやコンソール出力などのような、結果の出力に存在してほしくないメソッドの呼び出しが入力に含まれてい
る場合は、DashO でそれらを除去することができます。ここで指定されたメソッドの呼び出しは、入力クラスから
除去されます。除去できるのは、'void' を返すメソッドの呼び出しだけです。メソッド自体は除去されません。そ
れらメソッドの呼び出しのみが除去されます。
正規表現は、クラス名、メソッド名、および署名ではサポートされません。ただし、クラス名「**」のエントリは、す
べてのクラスの当該メソッドと一致します。
メモ
クラス名に '**' を使用する場合は、それらのメソッドが名前の変更対象から除外されるように、該当メソッドに
類似した規則を追加するようにしてください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
37
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Obfuscation – Options
Obfuscation – Options パネルでは、プロジェクトの基本的な難読化設定を制御します。Obfuscation 下にある
他のパネルを使用して、各操作の仕様を変更したり、アプリケーションの一部または全部に対して難読化技法
を適用したりすることができます。
Control Flow
制御フローの難読化のグローバルな適用を有効または無効にします。対象選択規則および対象除外規則を
使用することにより、制御フローが適用されるアプリケーションの部分を制御することができます。規則を何も指
定しなければ、すべてのメソッドに制御フローが適用されます。
Renaming
クラス、メソッド、およびフィールドの名前の変更をグローバルに適用するかどうか(有効または無効)を指定し
ます。対象除外規則を使用して、名前の変更が適用されるアプリケーションの部分を制御できるだけでなく、
パッケージ、クラス、およびメソッドの名前の変更を制御することができます。オーバーロード誘導(Overload
Induction™)は、同じ名前のメソッドを多く生成するために、メソッドの署名に基づいてメソッドの名前を変更し
ます。単純な名前の変更(Simple)は、オーバーロードがないようにメソッドの名前を変更します。
Encrypt Strings
文字列の暗号化のグローバルな適用を有効または無効にします。対象選択規則および対象除外規則を使用
することにより、文字列の暗号化が適用されるアプリケーションの部分を制御することができます。規則を何も
指定しなければ、すべてのメソッドの文字列が暗号化されます。
38
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Members オプション
このセクションには、クラスのメンバー、つまりメソッドとフィールドに影響を与える難読化オプションがあります。
Make Synthetic
この難読化は、メソッドとフィールドを、Java コンパイラによって生成される合成としてマークします。これは、一
部の逆コンパイラを混乱させます。使用可能な設定は 4 つあります。

Never – メソッドもフィールドも影響を受けません。

Only private and package – private または package-private のメソッドとフィールドは合成とされます。

If not public – private、package-private、または protected のメソッドとフィールドは合成とされます。

All – すべてのメソッドとフィールドが合成とされます。
この設定は、プロジェクト ファイルの <make-synthetic> セクションに格納されます。
Control Flow – Options
Control Flow – Options パネルでは、逆コンパイラをさらに混乱させるために、Try/Catch ハンドラーをメソッド
に追加する必要があるかどうかを決定することができます。また、メソッドに追加するハンドラーの最大数を選
択することもできます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
39
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Control Flow – Include および Exclude
Control Flow – Include および Exclude パネルでは、アプリケーションのどの部分で制御フローの難読化をメ
ソッドに適用させるかを決定する規則を構成できます。メソッド、クラス、またはパッケージ全体を選択すること
ができます。パフォーマンス問題の可能性について不安がある場合は、項目を除外する必要があります。
詳細については、グラフィカルな規則エディターの使用を参照してください。
40
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Renaming – Options
名前の変更を有効にした場合は、Renaming – Options パネルで、アプリケーションに含まれる項目の名前の
変更をより詳細に制御できます。
Renaming
クラス、メソッド、およびフィールドの名前の変更をグローバルに適用するかどうか(有効または無効)を指定し
ます。対象除外規則を使用して、名前の変更が適用されるアプリケーションの部分を制御できるだけでなく、
パッケージ、クラス、およびメソッドの名前の変更を制御することができます。オーバーロード誘導(Overload
Induction™)は、同じ名前のメソッドを多く生成するために、メソッドの署名に基づいてメソッドの名前を変更し
ます。単純な名前の変更(Simple)は、オーバーロードがないようにメソッドの名前を変更します。
Rename Annotations
内部定義されたアノテーションの名前の変更を有効または無効にします。
Classes/Packages
クラスの名前を変更するか、または元の名前を保持するかを選択できます。これは、すべての制御コースのレ
ベルに用意されています。対象除外を使用して、個々のクラス、パッケージ全体、または特定の条件を満たす
クラスの名前を保持することができます。[Randomize]がオンになっている場合は、利用可能な最も短い識別
子の一覧の中から、新しいクラス名がランダムに割り当てられます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
41
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
クラスの名前が変更される場合は、パッケージの階層をフラット化 1 する必要があるか、またはパッケージの階
層の名前付けを保持するかどうかを指定できます。
クラスの名前が変更される場合は、新しい名前に任意のプレフィックスを付けることができます。プレフィックス
でピリオドを使用すると、名前変更されたクラスを別のパッケージに置くことができます。
Members
すべてのメソッドおよびフィールドの名前を変更するか、またはパブリック メンバーの名前を保持するかを選択
できます。これは、すべての制御コースのレベルに用意されています。対象除外を使用して、メソッドの名前、
引数、およびその他の条件を基に特定のメソッドの名前を保持することができます。[Randomize]がオンに
なっている場合は、利用可能な最も短い識別子の一覧の中から、新しいメソッド名およびフィールド名がランダ
ムに割り当てられます。
Alphabets
クラスやメンバーの新しい名前を作成するために使用される文字集合を指定できます。定義済みの文字集合
の中から 1 つを選択するか、または独自の文字集合を入力することができます。独自の文字集合を作成する
際は、次の制限が適用されます。
42

文字集合の最小の長さは 2 文字です。大きなプロジェクトに対しては、3 文字以上が推奨されます。

文字集合の初めの文字は、Java 識別子の開始文字として有効でなければなりません。少なくとも 1 つは
開始文字がある必要があります。

文字集合の残りの文字は、Java 識別子で有効な文字でなければなりません。
1
このオプションは、名前変更されたすべてのクラスを既定のパッケージに置きます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Renaming – Exclude
Renaming – Exclude パネルでは、クラスや、クラスのメソッドおよびフィールドを名前の変更対象から除外する
規則を構成できます。個々のメソッド、フィールド、クラス、またはパッケージ全体を除外することができます。
クラスの規則が定義されている場合は、それを使用して、クラス自体を名前の変更対象から除外したり、メソッ
ドおよびフィールドの規則に一致するメンバーのみを除外したりすることができます。この設定を変更するには、
プロパティを編集する規則を右クリックして[Properties]を選択し、表示されるダイアログで[Selects Class]設
定を変更します。
詳細については、グラフィカルな規則エディターの使用を参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
43
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Renaming – Map Files
Renaming – Map Files パネルは、プロジェクトの名前変更情報の読み取りと書き込みを DashO に指示するた
めに使用されます。この情報は、増分名前変更を実行する場合や、難読化されたアプリケーションからスタック
トレースをデコードする場合に使用されます。
Map Input File
指定される入力割り当てファイルは、前回の DashO の実行で作成されたファイルです。このファイルによって、
DashO は前回の実行で使われた名前を使用することができます。割り当てレポート ファイルは、検出された変
更と、これらの変更に対する名前変更機能の対応を記録します。
Map Output File
このファイルで作成された情報は、今後 DashO を実行する際に入力割り当てファイルで利用できます。また、
難読化されたアプリケーションからスタック トレースをデコードする際にも利用できます。このファイルを不注意
で失ってしまうと、将来のアプリケーションの増分更新の機会を失う可能性があるため、DashO はこのファイル
を自動的に上書きしません。[Overwrite]オプションをオンにすると、DashO は既存のファイルを上書きできる
ようになります。
44
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
String Encryption – Options
String Encryption – Options パネルでは、文字列の暗号化および暗号化技術を制御するほか、復号メソッドが
置かれる場所を制御することができます。
Encrypt Strings
文字列の暗号化のグローバルな適用を有効または無効にします。対象選択規則および対象除外規則を使用
することにより、文字列の暗号化が適用されるアプリケーションの部分を制御することができます。規則を何も
指定しなければ、すべてのメソッドの文字列が暗号化されます。
Level
このコントロールは、使用する文字列暗号化のレベルを選択します。レベル 1 は単純で高速な復号技術を使
用し、レベル 10 はより複雑でより低速な技術を使用します。値が増えるに従って、逆コンパイルの複雑さを高
めるためにさまざまな表現法が用いられるだけでなく、復号メソッドの実装にランダム性の要因を追加します。
Decrypters
これは、入力クラスへ生成、追加される復号メソッドの数を制御します。メソッドの名前と署名はランダムに選択
されます(入力ファイルを使用する場合を除く)。
Decrypter Class
この設定により、復号メソッドをどのクラスに配置するかを正確に制御したり、それの配置可能場所を制限する
一連の条件を制御したりすることができます。値を何も指定しなければ、DashO が入力内のパブリック クラスか
らクラスを選択します。選択条件を変更するには、[Edit]ボタンをクリックしてプロパティ ダイアログを表示しま
す。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
45
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Input
指定される入力割り当てファイルは、前回の DashO の実行で作成されたファイルです。このファイルによって、
DashO は前回の実行で使われた復号と同じ復号を作成することができます。これは、増分難読化では必須で
す。名前変更割り当てファイルに加えて使用されます。入力ファイルが提供された場合は、Decrypters の数と
Decrypter Class の設定は無視されます。
Output
このファイルで作成された情報は、今後 DashO を実行する際に入力割り当てファイルで利用できます。これに
は、復号の種類、使用されるメソッドの名前、およびそれが置かれているクラスに関する情報を格納します。
46
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
String Encryption – Include および Exclude
String Encryption – Include および Exclude パネルでは、アプリケーションのどの部分で文字列を暗号化させ
るかを決定する規則を構成できます。メソッド、クラス、またはパッケージ全体を選択することができます。文字
列の暗号化は、サイズと実行時のパフォーマンス コストを増やすことから、選択的に、機密事項に関連する文
字列情報が位置するアプリケーションの部分を対象として選択したり、パフォーマンスが実行時復号によって
影響を受ける可能性があるセクションを除外したりすることができます。
詳細については、グラフィカルな規則エディターの使用を参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
47
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Custom Encryption
Custom Encryption パネルでは、使用する独自の暗号化/復号メソッドを構成できます。独自の暗号化レベル
を提供することができます。暗号化メソッドおよび復号メソッドの要件については、カスタム暗号化の使用を参
照してください。
Use Custom Encryption
カスタム暗号化の難読化のグローバルな使用を有効または無効にします。対象選択規則を使用することによ
り、カスタムな文字列の暗号化が適用されるアプリケーションの部分を制御することができます。カスタム暗号
化が動作するためには、少なくとも 1 つは規則を指定する必要があります。
Encryption Jar
jar ファイルには、暗号化のクラスとメソッドが含まれています。この jar ファイルはプロジェクトの外部にあります。
文字列の暗号化による難読化を行うときに使用されます。
Encryption Class and Method
テキストを暗号化するために使用されるクラスおよびメソッドです。このメソッドは、出力の一部にはなりません。
[Choose]をクリックすると、暗号化 jar ファイル内の要件を満たすすべてのメソッドを含むダイアログ ボックス
が表示されます。
Decryption Class and Method
テキストを復号するために使用されるクラスおよびメソッドです。これらのクラスは、プロジェクトの入力の一部で
なければなりません。指定したクラスとメソッドは出力に残ります(ただし、他のプロジェクト設定を基に、名前変
48
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
更または難読化される可能性があります)。[Choose]をクリックすると、入力内の要件を満たすすべてのメソッ
ドを含むダイアログ ボックスが表示されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
49
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Custom Encryption – Include
Custom Encryption – Include パネルでは、アプリケーションのどの部分でカスタム暗号化を使って文字列を暗
号化させるかを決定する規則を構成できます。メソッド、クラス、またはパッケージ全体を選択することができま
す。これは、文字列の暗号化全体のサブセットを考慮する必要があります。ここで指定されたクラス/メソッドは
どれも、文字列の暗号化から除外してはいけません。
詳細については、グラフィカルな規則エディターの使用を参照してください。
50
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Make Synthetic – Options
Make Synthetic – Options パネルでは、合成フラグをフィールドおよびメソッドにどのように追加するかを制御で
きます。合成フラグは、一部の逆コンパイラを混乱させます。
Make Synthetic
この難読化は、メソッドとフィールドを、Java コンパイラによって生成される合成としてマークします。これは、一
部の逆コンパイラを混乱させます。使用可能な設定は 4 つあります。

Never – メソッドもフィールドも影響を受けません。

Only private and package – private または package-private のメソッドとフィールドは合成とされます。

If not public – private、package-private、または protected のメソッドとフィールドは合成とされます。

All – すべてのメソッドとフィールドが合成とされます。
この設定は、プロジェクト ファイルの <make-synthetic> セクションに格納されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
51
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Make Synthetic – Exclude
Make Synthetic – Exclude パネルでは、アプリケーションのどの部分が合成とマークされないかを決定する規
則を構成できます。メソッド、クラス、またはパッケージ全体を選択することができます。
詳細については、グラフィカルな規則エディターの使用を参照してください。
52
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Optimization – Options
Optimization – Options パネルでは、プロジェクトの最適化の設定を制御します。
Optimize Byte Codes
バイト コードの最適化のグローバルな適用を有効または無効にします。対象選択規則および対象除外規則を
使用することにより、バイト コードの最適化が適用されるアプリケーションの部分を制御することができます。
Make Public
これは、パブリックへのアクセス制御の変更を制御します。オプションには、パブリック アクセスへの変換を強
制する、または禁止する、DashO で自動的に判定する、があります。既定値は、「DashO で自動的に判定する」
です。詳細については、Makepublic および Nomakepublic グローバル オプションを参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
53
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Byte Code Optimization – Include および Exclude
Byte Code Optimization – Include および Exclude パネルでは、アプリケーションのどの部分が最適化されるか
を決定する規則を構成できます。メソッド、クラス、またはパッケージ全体を選択することができます。
詳細については、グラフィカルな規則エディターの使用を参照してください。
54
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
PreMark
PreMark パネルは、DashO によって生成された jar ファイルに、ウォーターマークを追加するために使用され
ます。ウォーターマークは jar ファイルにのみ適用できるため、DashO の出力先がディレクトリである場合には、
この機能は無効になります。複数の jar ファイルが作成される場合は、すべての jar ファイルに同じウォーター
マークが追加されます。
Watermark Jar
ウォーターマーク機能を有効または無効にします。
Watermark
これは、jar ファイルに適用されるウォーターマーク文字列です。ウォーターマークで使用できる文字は、文字
コードの設定によって決まります。
On overflow
DashO は、ウォーターマーク文字列が長すぎて jar ファイルに適用できない場合に、文字列を切り捨てて処理
を進めるか、またはビルドを中止することができます。
Character Map
文字コードは、最小限のビット セットにウォーターマーク文字列をエンコードするために使用されます。
Passphrase
パスフレーズの指定は任意で、ウォーターマーク文字列を暗号化してから jar に適用するために使用されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
55
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Instrumentation – Options
Instrumentation – Options パネルは、PreEmptive Analytics 用にアプリケーションをインストルメントするための
設定を制御する場所です。PreEmptive Analytics 用のクラスのインストルメントを有効にして、アノテーション処
理を定義し、アプリケーションの Java ランタイム環境を選択します。
Instrument Classes
この機能を有効または無効にします。インストルメンテーションは、アプリケーションに分析メッセージと Shelf
Life の期限切れを追加するために使用されます。
Send Messages
アプリケーションがオンラインであるときは、メッセージを PreEmptive Analytics サーバーへ送信します。そうで
なければ、後で送信するようにメッセージを格納しておきます。
Store Off-line Messages
アプリケーションがオフラインであるか、または[ Send Messages]が無効になっているために PreEmptive
Analytics サーバーへ送信できないメッセージを、後で送信するように保存しておきます。オフライン記憶域は、
モバイル デバイスではサポートされていません。
Gather Full Data
パフォーマンス プローブやシステム プロファイルなどの一部の PreEmptive Analytics 操作では、完全なデー
タと部分的なデータのいずれかを返すことができます。マシンの製造元やモデルなどの詳細な情報を必要とし
ない場合は、部分的なデータを返すように選択できます。これにより、メッセージを生成するために必要な時間
だけでなく、要求される送信や記憶域を減らすことができます。
56
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Honor Annotations
コードに含まれる PreEmptive インストルメンテーション アノテーションの参照を使用するか、または無視します。
コード内のアノテーションは仮想アノテーションとマージされ、行われるインストルメンテーションを決定します。
Strip Annotations
PreEmptive インストルメンテーション アノテーションの参照を入力クラスから除去します。アノテーションが除去
されない場合は、アプリケーションにアノテーション jar ファイルを含める必要があるかもしれません。
Java Environment
これは、アプリケーションのランタイム環境を選択し、アプリケーションで使用される PreEmptive Analytics の実
装 jar ファイルを決定します。
Merge Runtime
PreEmptive Analytics クラスを実装する jar ファイルをアプリケーションとマージするか、または別個の jar ファイ
ルとして残します。アプリケーションとマージした場合、DashO は最初に入力 jar ファイルの 1 つとマージしよう
とします。利用できる jar ファイルがない場合、または jar 内のクラスが対象から除外されている、あるいは jar
が空になるまでクラスが除去されている場合は、最初のディレクトリを選択します。ランタイム jar ファイルをマー
ジしない場合は、それをアプリケーションとは別に出荷する必要があります。
メモ
[Send Messages]と[Store Off-line Message]がオフになっている場合、メッセージの生成は無効になりま
す。これらのグローバル値は、実際または仮想のアノテーションでオーバーライドすることができます。どちら
のオプションの値も、固定のブール値を指定するか、または動的ソースから指定できます。
Offline Storage Customization
既定では、メッセージは、マシン上のユーザーのホーム ディレクトリに位置する ".psrios" というディレクトリに格
納 さ れ ま す ( 例 : C:\Users\{username}\.psrios ま た は /usr/home/{username}/.psrios ) 。 基 本 の 場 所 は 、
dasho_offline_ri_dir 変数を設定することによって変更できます。これは、環境変数または java のシステム変
数として設定できます。両方設定されている場合は、java システム変数が優先されます。指定する場所は、イ
ンストルメントされたアプリケーションを実行するユーザーが、ファイルの読み取り、書き込み、および削除のア
クセス許可を持っているディレクトリでなければなりません。設定する方法の例は次のとおりです。


環境変数を設定します。
o
Windows:set dasho_offline_ri_dir={必要とする完全なパス}
o
Unix(csh):setenv dasho_offline_ri_dir {必要とする完全なパス}
o
Unix(bash):export dasho_offline_ri_dir={必要とする完全なパス}
java コマンド ラインで設定します。
o

-Ddasho_offline_ri_dir={必要とする完全なパス}
コードベース内で次のように設定します。
o
System.setProperty("dasho_offline_ri_dir", {必要とする完全なパス});
o
ただし、このメソッド呼び出しは、アプリケーションのインストルメンテーションが始まる前に発生する必
要があります。
メモ
dasho.offline.ri.dir に設定された場所が無効な場所であったり、ユーザーが適切なアクセス許可を持ってい
ないディレクトリであったりした場合、オフライン メッセージは保存されません。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
57
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Instrumentation – Properties
Instrumentation – Properties パネルは、アプリケーションおよびアプリケーション所有者の一意識別子を入力
する場所です。この情報を入力すると、分析メッセージが適切な場所にルーティングされ、 PreEmptive
Analytics サーバーに正しく表示されるようになります。
End Point
これは、PreEmptive Analytics サーバーの場所です。PreEmptive によって提供されるエンドポイントの一覧か
ら選択するか、または自己ホスト型のサーバーがある場合は、カスタム エンドポイントを入力することができま
す。エンドポイントは URL に似ていますが、プロトコルが含まれていません。
Use SSL
エンドポイントへデータを送信する際に、HTTP または HTTPS プロトコルを使用します。
Company ID
これは、PreEmptive Solutions によって企業に割り当てられた一意の ID です。ID の横にある緑色の矢印をク
リックすると、User Preferences で入力した情報が、Company 欄のフィールドに自動的に設定されます。
Company Name
これは、お客様の企業の名前です。
Application ID
このフィールドに、PreEmptive Analytics 用にインストルメント化されたアプリケーションの一意の ID を自動的
に設定するには、緑色の矢印をクリックします。ID の横にある緑色の矢印をクリックすると、アプリケーションに
使用できるランダムな識別子が ID フィールドに自動的に設定されます。
58
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Application Name
これは、PreEmptive Analytics サーバーに送信され、識別の目的で使用されるアプリケーションの名前です。
Version
これは、PreEmptive Analytics サーバーに送信され、識別の目的で使用されるアプリケーションのバージョン
番号です。
Type
これは、PreEmptive Analytics サーバーに送信され、識別の目的で使用されるアプリケーションの種類を識別
します。
メモ
このパネル上のデータはすべて省略可能です。データは、コード内のアノテーションによって、または DashO
の仮想アノテーションによって結合またはオーバーライドすることができます。このパネルの値は、アノテー
ションによって置き換えられない場合にのみ使用されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
59
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Instrumentation – Shelf Life
Instrumentation – Shelf Life パネルは、アプリケーションの期限切れチェックの追加を構成する場所です。
DashO はこの情報を使用して、期限切れのポリシーを実施するためにコード内に配置される、期限切れトーク
ンを作成します。チェックは、コード内の ExpiryCheck アノテーションが現れる場所で、あるいは仮想アノ
テーションによって実行されます。このパネルのエントリを空白のままにしておいた場合には、
ExpiryTokenSource アノテーションを使用して、外部のファイルまたはリソースから期限切れトークンを読
み取ることもできます。
Key File
PreEmptive Solutions から受け取った、Shelf Life のキー ファイルの場所を入力します。このファイルは、アプリ
ケーションに期限切れチェックを追加することを許可します。
Expiration Date
アプリケーションは、明示的な日付、または動的に決定される開始日から特定の日数後に期限が切れるよう構
成することができます。明示的な日付のタイプが選択されているときは、[Select]ボタンから、日付を選択する
カレンダーをポップアップ表示できます。日付の書式は、地域の設定に関係なく常に MM/DD/YYYY 形式に
なります。
Warning Date
アプリケーションは、明示的な日付、または期限切れになる予定の特定の日数前に期限切れの警告を発する
よう構成することができます。明示的な日付のタイプが選択されているときは、[Select]ボタンから、日付を選択
するカレンダーをポップアップ表示できます。日付の書式は、地域の設定に関係なく常に MM/DD/YYYY 形
式になります。
60
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Properties
アプリケーションで取得できる期限切れトークンに、任意のプロパティを追加することができます。この機能を
使用するには、ExpiryCheck にユーザー定義の操作を提供する必要があります。この処置法は、これらの
プロパティを取得できる期限切れトークンに渡されます。ここで留意すべきは、プロパティ名と値の両方に
DashO のプロパティ参照を含むことができるということです。
メモ
このパネルで提供される情報は、コード内のアノテーションによって、または DashO の仮想アノテーションに
よってオーバーライドまたは補完することができます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
61
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Instrumentation – Virtual Annotations
DashO は、インストルメンテーションを実行するためにアノテーションを使用します。アノテーションは、インスト
ルメント化されるもの(クラスやメソッドなど)を識別し、それらをインストルメントする方法について指示するもの
です。これらのアノテーションは、クラス ファイル内にあるアノテーションを拡大またはオーバーライドします。
Virtual Annotations 画面は、グラフィカルな規則エディターと同じように動作します。
Name
これは、クリックされたか強調表示されているクラス、メソッド、またはアノテーションの名前です。
Signature
これは、メソッドのパラメーター リストの型と一致する型のリストです。
Value
これは、アノテーション固有の値です。FeatureStart や FeatureStop などのアノテーションは、これを
機能の名前として使用します。すべてのアノテーションが Value を使用するわけではありません。
Annotate ボタン
これを使用して、メソッドやクラスに適用されるアノテーションを追加することができます。また、クラス一覧内の
項目や規則を右クリックして、アノテーションを追加することもできます。
62
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Output – Options
Output – Options パネルでは、DashO がビルドの結果を配置する場所と、それらの結果がとる形式を制御しま
す。
Merge inputs
DashO は、難読化された結果を結合して単一のディレクトリまたは jar に入れるか、または入力クラスの元の
パッケージを保持することができます。
Auto copy
Auto copy は、入力をマージするときに非クラス ファイルをどのように処理するかを制御します。これはマージ
に関係して利用でき、次のように機能します。

Merge Off
o

jar 入力の非クラス ファイルはコピーされます。入力ディレクトリの非クラス ファイルはコピーされません。
Merge On
o
Auto Copy On – 入力ディレクトリと入力 jar の両方の非クラス ファイルが出力にコピーされます。
o
Auto Copy Off – 非クラス ファイルは出力にコピーされません。
メモ
非クラス ファイルの処理中に検出された XML 構成ファイルは、クラス名やメソッド名を変更できるように更新
されることがあります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
63
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Create Directory/Single Jar
マージを行う場合には、DashO はビルドの結果をディレクトリか単一 jar のいずれかに置くことができます。
マージをオフにすると、出力はディレクトリである必要があります。出力をディレクトリまたは jar ファイルへ書き
出す方法については、<output> セクションを参照してください。
Name と Manifest
[Name]フィールドには、出力ディレクトリまたは jar の名前を指定します。マージがオフの場合にのみ、ディレ
クトリを使用できます。DashO は、出力のルートとしてこれを使用し、元の入力 jar ファイルとディレクトリの階層
を再作成しようとします。
マージされた単一の jar ファイルを DashO で作成した場合、DashO はその jar ファイルにマニフェスト ファイル
を追加することができます。マニフェストは、テキスト ファイルの形式でも、DashO が jar ファイルからマニフェス
トを抽出できる形式でもかまいません。
Jar Options

Compress:データを格納するだけでなく圧縮もします。

Level:ファイルの圧縮を実行するレベル。有効な値の範囲は、0(圧縮なし/最速)から 9 です。既定値は
6 です。

Exclude Directory Entries:ファイルのエントリのみ格納し、ディレクトリのエントリは格納しません。

Preserve Jars With No Classes:クラスが残っていない jar を出力します。これは、リソース jar を出力す
る場合に使用できます。
Constant Pool Tag
結果として生じる出力のすべてのクラスに、任意の定数プールのタグ テキストが挿入されます。詳細について
は、<constpooltag> を参照してください。
SourceFile Tag
結果として生じる出力のすべてのクラスの SourceFile 属性が、指定した値に設定されます。詳細については、
<sourcefile> を参照してください。
64
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Output – Reports
Output – Reports パネルでは、ビルドの結果を詳述するレポートの生成を構成します。
Report file
DashO によって実行された、クラスとメンバーの除去および名前の変更を概説するレポートの名前と場所を指
定します。全体のメソッド/フィールド/定数プール エントリだけでなく、DashO 実行後における最終的な削減の
数とパーセンテージを詳述する要約が提供されます。また、これには、リフレクションや Class.forName()
呼び出しも含め、動的に読み込まれるクラスに関する情報も含まれます。
Renaming Report File
これは、名前変更されたクラスとそれらの名前変更されたメンバーの、古い名前と新しい名前を列挙するレ
ポートの名前と場所を指定します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
65
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Output – Preverification
DashO がクラス ファイルの処理を完了した後、CLDC アプリケーションに対して Preverifier を実行するかどう
かを選択できます。[Run Preverifier]チェック ボックスをチェックすることにより、事前検証を有効または無効
にできます。
既定では、DashO はシステム パスで事前検証アプリケーション preverify を探そうとします。特定のバー
ジョンの Preverifier を実行する必要がある場合は、実行するアプリケーションを明示的に指定することができ
ます。
No Finalize
preverifier に -nofinalize を渡す:入力でファイナライザーは許可されません。
No Floating Point
preverifier に -nofp を渡す:入力で浮動小数点演算は許可されません。
No Native Methods
preverifier に -nonative を渡す:ネイティブ メソッドは許可されません。
66
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Output – Signing
DashO が生成する出力 jar ファイルに署名させることができます。[Sign Jars]チェック ボックスをオンにするこ
とにより、署名を有効または無効にできます。
既定では、DashO はシステム パスで署名アプリケーション jarsigner を探そうとします。特定のバージョン
の jar 署名を実行する必要がある場合は、実行するアプリケーションを明示的に指定することができます。
Key Store
この情報は、署名に使用される非公開鍵を格納するキー ストアを定義します。必須項目は[Password]のみ
です。[Type]は既定値として、グローバル keystore.type セキュリティ プロパティに指定されているタイプ
が使用されます。[Location]は既定値として、ホーム ディレクトリにある .keystore ファイルが使用されます。
プロパティ参照を含んでいないパスワードは、暗号化された形式でプロジェクト ファイルに格納されます。
Signing Key
この情報は、署名を実行するために使用される非公開鍵を指定します。必須項目は[ Alias]値のみです。
[Password]は既定値として、キー ストアで指定したパスワードが使用されます。このパスワードも、プロパティ
参照を含んでいなければ、暗号化されてプロジェクト ファイルに格納されます。
Options
これらの値は、jarsigner の -sigFile、-internalsf、および -sectionsonly オプションに対応し
ています。これらの使い方の詳細については、jarsigner - JAR 署名および検証ツールを参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
67
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Building
ユーザー インターフェイスでのビルド方法は 2 つあります。ツール バーにある[Build Project]ボタンをクリック
するか、またはメニューで[Project|Build Project]を選択します。
ビルド中およびビルド後に、DashO の出力をコンソール領域で見ることができます。
ビルドは、メソッド/フィールドの除去、名前の変更、制御フロー、文字列の暗号化、最適化、および最終的なク
ラスの書き込みとパッケージ化を行います。これは、DashO が処理する必要のあるクラスの数によっては、数分
かかる場合があります。
ビルドが完了すると、DashO は自動的に作業領域の画面に結果のパネルを表示します。ビルドでエラーが発
生した場合は、コンソールの表示が[Problems]タブに切り替わります。
68
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Output – DashO Results
Output – DashO Results パネルには、プロジェクトの入力クラスのクラス階層と、名前の変更の結果が表示され
ます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
69
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
グラフィカルな規則エディターの使用
DashO のユーザー インターフェイスのパネルの多くは規則エディターで、これらは主として、難読化の変換処
理における、アプリケーション内の要素の対象除外と対象選択を行います。規則エディターは 2 つの一覧に
分かれています。左側のクラス一覧は、入力のクラスとメンバーを表示し、右側では規則の一覧を表示します。
規則では、操作の影響を受ける入力の部分と、場合によっては実行される操作を指定します。規則エディター
は、以下の操作について規則を設定するために使用されます。

名前の変更の対象除外規則

除去の対象除外規則

制御フローの難読化の対象選択規則と対象除外規則

文字列の暗号化の対象選択規則と対象除外規則

Make Synthetic の対象除外規則

最適化の対象選択規則と対象除外規則
DashO の、エントリ ポイントなどの他の部分は、規則エディターに非常に似たインターフェイスを使用します。
規則の作成
インターフェイスで規則を作成する方法はいくつかあります。

クラス一覧の項目を右クリックする – クラス一覧の項目をクリックすると、ショートカット メニューが表示され
ます。そこから、選択した項目に一致する規則を構築することができます。Shift キーを押した状態で規則
を作成すると、その規則は正規表現になります。メソッドまたはフィールドの規則を作成した場合、DashO
はその新しい規則を既存のクラスの規則に追加します。必要であれば、クラスの規則を作成します。

クラス一覧から項目をドラッグ アンド ドロップする – クラス一覧から項目をドラッグして、規則の上にドロッ
プすることができます。メソッドまたはフィールドをドラッグ アンド ドロップした場合、DashO はその新しい規
則を既存のクラスの規則に追加します。必要であれば、クラスの規則を作成します。

ボタンを使用する – 規則一覧の右にある[New xxx]ボタンをクリックして、新しいエントリを作成することが
できます。新しい規則は、編集可能なダミーの名前で作成されます。
規則の編集
規則の基本部分は、エディターで直接変更することができます。あらゆる項目の名前と、署名やメソッドは、規
則一覧の直下にあるテキスト フィールドを使用して変更できます。また、専門のエディターでこれらの値を直接
編集することもできます。
1 つのルールのすべての設定にアクセスするには、ルールを右クリックし、ショートカット メニューの[Properties]
項目を選択します。[Properties]ダイアログ ボックスには、次のような値の設定があります。
70

Modifiers – Java の修飾子、またはその否定。この規則が項目と一致するようにするために必要です。ここ
で使用できる値については、Modifiers 属性の説明を参照してください。

Name – 規則が影響を与える項目の名前。これには定数値、パターン、または正規表現を指定できます。

Signature – メソッドの署名。

Type – 名前および署名が解釈される方法を決定します。詳細については、パターンと正規表現を参照し
てください。

Selects Class – クラス自体だけでなく、そのメンバーにも影響を与える規則の場合、この設定は、規則が
クラスに適用されるかどうか、あるいは、クラスは入れ子になったフィールドやメソッドの規則のための単な
るコンテナーであるかどうかを判断します。

Renaming controls – 既定では、エントリ ポイントの名前は変更不能です。エントリ ポイントの種類によっ
ては、名前を変更可能にすることができるため、これらのコントロールは、クラスとそのメンバーの名前を変
更できるかどうかを決定します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™

ユ ー ザ ー ズ
ガ イ ド
Values for annotations – 仮想アノテーションには、特殊化した値を多数含めることができます。いくつか
は、一般的な値(value)しか含んでいません。その使用を決定するために、ツール ヒントの表示を利用し
ます。操作を実行するアノテーションは、where 値も備えています。これは、操作を実行するメソッド内の場
所を決定します。
規則のプレビュー
規則の影響を受けるものを確認するために、プレビュー機能を使用することができます。単一の規則をプレ
ビューするか、すべての規則をプレビューするかを選択できます。規則を右クリックしてショートカット メニュー
を表示し、[Preview Rule]または[Preview All]を選択します。クラス一覧内で、規則の影響を受ける項目が
太字で表示されます。どちらの一覧のショートカット メニューからも、規則の強調表示をクリアできます。
パターンと正規表現
単純な規則は、項目の名前を文字どおりに使用して、クラスなどの特定の項目を選択します。規則でパターン
や正規表現を使用して、項目を選択することもできます。
正規表現は自動的に調べられます。式にエラーがある場合は、赤い X 印が式の横に表示されます。マウス
ポインターを規則の上に移動させると、ツール ヒントにエラーの場所とその説明が表示されます。
メモ
正規表現は、全体として規則に適用されます。クラス名が正規表現で指定された場合は、すべてのメンバー
の名前が正規表現として扱われます。パターンには、この制限はありません。
対象選択規則と対象除外規則の結合
DashO では、難読化するアプリケーションの部分を決定するために、対象選択規則と対象除外規則を組み合
わせて使用することができます。難読化の変換処理が、対象選択と対象除外の両方の定義を許可している場
合は、両者を結合させる方法を覚えておくことは重要です。

対象選択規則が何も定義されていない場合は、既定ですべての項目が対象として選択されます。

対象除外規則が何も定義されていない場合は、既定でどの項目も対象から除外されません。

初めに対象選択が決定されてから、次に対象除外が決定されます。項目は、少なくとも 1 つの規則から
対象として選択され、変換処理を適用させるどの規則によっても対象から除外されない必要があります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
71
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
カスタマー フィードバックのオプション
DashO は、匿名による使用状況レポート システムを提供しています。このプログラムへ参加するかどうかは
ユーザーが選択できます。このプログラムへ参加すると、PreEmptive Solutions によって高レベルな使用状況
データが匿名で収集されるようになります。これは DashO を改良することを目的としています。このオプション
は、[Help|Customer Feedback Options]メニューからいつでも変更することができます。
72
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Quick Jar ユーザー インターフェイス
このセクションでは、Quick Jar プロジェクト用の DashO インターフェイスの使用方法について説明します。この
インターフェイスでは、新しい Quick Jar プロジェクトの作成、または既存プロジェクトの編集を実行できます。
Input Jars
Input Jars パネルは、処理する jar ファイルを指定するために使用されます。DashO は、Main-Class エントリが
含まれているマニフェストについて、これらの jar ファイルを調べます。これらのエントリは、アプリケーションへ
のエントリ ポイントとして使用されます。Main-Class エントリがない場合、jar ファイルはライブラリとして処理され
ます。入力 jar 内の非クラス ファイルはすべて、出力 jar にコピーされます。
[Add]ボタンをクリックすると、参照ダイアログ ボックスが表示されます。このダイアログ ボックスで、ファイル シ
ステムへ移動して、1 つまたは複数の jar ファイルを選択することができます。また、[New]ボタンをクリックして
新しい jar を追加し、[Name]フィールドでその jar の名前を入力することもできます。
メモ
入力 jar 名はプロパティをサポートしています。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
73
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Input – Options
Input – Options パネルでは、入力 jar に適用される操作を制御します。
Ignore Missing Classes
DashO は、アプリケーションが呼び出そうとするすべてのクラスの分析を試みます。このオプションを選択する
ことで、これらのクラスを無視するよう DashO に指示できます。ただし、DashO は、アプリケーションが拡張また
は実装するクラスとインターフェイスをスキップできないことに注意してください。
Ignore Missing Methods
DashO は分析の一環として、メソッドの具体的な実装を探そうとします。このオプションをオンにすると、目的の
メソッドを見つけられない場合でも処理が進められるようになります。このオプションは慎重に使用してください。
Use Exit Behavior from DashO 6.x and Earlier
DashO のコマンド ラインおよび Ant タスクは、終了コードとしてエラー数を返します。このオプションをオンにす
ると、致命的なエラーがないときは終了コードとして 0 を使用するように設定されます。
Halt on First Error
DashO は、入力の処理中にエラー、警告、および情報メッセージを生成します。このオプションをオンにすると、
エラーが発生したら直ちに処理を停止するように構成されます。
Bypass DashO Processing
このオプションは、Quick Jar プロジェクトではサポートされません。
74
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Reflection Halts Build
DashO の分析では、リフレクションのターゲットをアドレス指定できるように、アプリケーションでのリフレクション
の使用状況を記録します。アプリケーションのどの部分がリフレクションを使用しているか判断している場合に
は、このオプションをオンにします。
Determine Reflected Classes
DashO は、リフレクションのシンプルなターゲットを決定し、これらのクラスを対象選択されるクラスの一覧に自動
的に追加することができます。この動作によって、ビルド時間が長くなる可能性があることに注意してください。
Rename Reflected Classes
既定では、リフレクションのターゲットの名前は変更されません。これらのクラスの名前を変更できるようにする
には、このオプションを使用します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
75
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Input – Supporting classpath
Supporting classpath は、アプリケーションで使用されているファイルのうち、難読化したくない、あるいは最終
の jar ファイルに含めたくない、サード パーティ製の jar ファイルやクラス ファイルの一覧を含んでいます。これ
らのファイルは DashO にとって重要です。なぜなら、サード パーティ製のライブラリからクラスを拡張できたり、
名前変更システムが安全に名前を変更する方法を決定するために、それらのクラスを調べる必要があったりす
るからです。
サポートする jar を追加するには、[Add]ボタンをクリックして、必要な jar を選択します。また、[New]ボタンを
クリックして新しい jar を追加し、[Name]フィールドでその jar の名前を入力することもできます。
メモ
Supporting Classpath の名前は、プロパティをサポートしています。
76
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
User Properties
User Properties パネルでは、プロジェクトで参照できるプロパティを作成し、値を割り当てることができます。こ
れを使用すると、テンプレートとして機能するプロジェクトを作成できます。プロジェクトでのプロパティの使用に
ついては、<propertylist> セクションを参照してください。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
77
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Obfuscation – Options
Rename Classes and Members
プロジェクト内のクラスおよびメソッドの名前の変更を有効または無効にします。Main-Class エントリを持つ
マニフェストが入力に含まれている場合は、それらのクラスと main() メソッドの名前は変更されません。jar
ファイルがライブラリとして処理される場合は、パブリックでない項目のみ名前が変更されます。
Rename Annotations
内部定義されたアノテーションの名前の変更を有効または無効にします。jar ファイルがライブラリとして処理さ
れる場合、アノテーションの名前は変更されません。
Control Flow
制御フローの難読化のグローバルな適用を有効または無効にします。
Encrypt Strings
文字列の暗号化のグローバルな適用を有効または無効にします。
Optimize Byte Codes
バイト コードの最適化のグローバルな適用を有効または無効にします。
78
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Options – Renaming Exclude
Options – Renaming Exclude パネルでは、名前の変更対象から除外されるクラスおよびメソッドを指定できます。
Excluded Classes
[Excluded Classes]一覧にクラスやパッケージを追加することで、そのクラスの名前を変更してはいけないとい
うことを DashO に知らせます。クラスのメソッドの名前は変更できます。詳細については、<classes> エントリ ポ
イントを参照してください。
Excluded Classes + Methods
[Excluded Classes + Methods]一覧にクラスやパッケージを追加することで、そのクラスとメソッドの名前を変更
してはいけないということを DashO に知らせます。詳細については、<unconditional> セクションを参照してくだ
さい。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
79
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
PreMark
PreMark パネルは、DashO によって生成された難読化済みの jar ファイルに、ウォーターマークを追加するた
めに使用されます。ウォーターマークは jar ファイルにのみ適用できるため、DashO の出力先がディレクトリで
ある場合には、この機能は無効になります。
詳細については、Advanced インターフェイスの PreMark セクションを参照してください。
80
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Output – Options
[Destination]では、出力 jar ファイルを指定します。DashO は、難読化されたすべてのクラスを出力 jar に書
き込みます。使用する出力 jar ファイルの名前とパスがわかっている場合は、テキスト ボックスにそれらを直接
入力できます。もう 1 つの方法として、[Browse]ボタンを使ってファイル システムを参照し、ファイルを出力す
る適切な場所を選択することもできます。jar オプションがいくつかあります。

Compress:データを格納するだけでなく圧縮もします。

Level:ファイルの圧縮を実行するレベル。有効な値の範囲は、0(圧縮なし/最速)から 9 です。既定値は
6 です。

Exclude Directory Entries:ファイルのエントリのみ格納し、ディレクトリのエントリは格納しません。
メモ
指定された入力 jar ファイルの数に関係なく、出力 jar は 1 つしか生成されません。
Report file
DashO によって実行された、メソッド/フィールドの除去および名前の変更を概説するレポートの名前と場所を
指定します。全体のメソッド/フィールド/定数プール エントリだけでなく、DashO 実行後における最終的な削減
の数とパーセンテージを詳述する要約が提供されます。また、これには、リフレクションや forName 呼び出し
も含め、動的に読み込まれるクラスに関する情報も含まれます。
Renaming Report File
これは、名前変更されたクラスとそれらの名前変更されたメンバーの、古い名前と新しい名前を列挙するレ
ポートの名前と場所を指定します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
81
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
User Preferences
User Preferences ダイアログでは、DashO のユーザー インターフェイスのいくつかの側面を構成したり、難読
化エンジンにオプションを渡したりすることができます。これらの値は、プロジェクト ファイルに保存されず、
DashO が読み込んだプロジェクトに対して適用されます。
全般オプション
Text editor
これは、DashO によって生成されたプロジェクト ファイルやレポートを表示するために使用されるアプリケー
ションの名前です。テキスト エディターの名前を設定するときは、プロパティ参照を使用できることに留意してく
ださい。
Show Toolbar
ツール バー ボタンの表示/非表示を制御します。
Tree Collapsible
左側のナビゲーション ペインにおける、セクションの折りたたみを有効または無効にします。
Show wizard on startup
DashO を開くときに、新規プロジェクト ウィザードを自動的に起動するかどうかを制御します。
Auto update check
最新版の DashO を入手できるかどうかを起動時に確かめる、更新のチェックを有効にします。
82
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
DashO エンジン オプション
Verbose output
これは、DashO のコマンド ライン版に --verbose を渡すのと同じことです。詳細については、DashO コマン
ド ラインを参照してください。[Verbose output](詳細な情報の出力)を有効にすることで、ビルド時間が長くな
る可能性があることに注意してください。
Print Stack Traces
これは、DashO のコマンド ライン版に --printStackTraces を渡すのと同じことです。詳細については、
DashO コマンド ラインを参照してください。
Debug output
これは、デバッグ出力を生成するよう DashO に要求します。通常、PreEmptive のサポート スタッフの指示がな
い限り、このオプションはオフにしておく必要があります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
83
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Instrumentation オプション
PreEmptive Analytics 製品(Runtime Intelligence Service や PreEmptive Analytics for TFS など)を使用して起
動すると、インストルメント化されたアプリケーションを使用するための企業 ID が PreEmptive Solutions から送
られてきます。
インストルメンテーションを構成するには
84

[ Preferences] ダ イ アログ ボックスを開くには、[Window|Preferences ] メニ ューをクリ ックし ます。
[Instrumentation]タブをクリックします。

Company ID と会社の名前(Name)を適切なフィールドに入力します。ID と Name はプロジェクトの既定
値になります。Instrumentation – Properties ページの矢印を使用して、これらをプロジェクトにコピーす
ることができます。

[OK]をクリックします。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
スタック トレースのデコード
難読化の持つ潜在的な欠点の 1 つは、名前が改変されることにより、難読化されたアプリケーションのトラブル
シューティングが困難になる可能性があることです。DashO はこの欠点を解決するために統合ツールを提供し
ています。このツールを使用すると、出力割り当てファイルを基に、難読化されたスタック トレースから元のシン
ボルを復元できます。
たとえば、難読化処理済みのアプリケーションを顧客に発送し、顧客の 1 人からスタック トレースを受け取った
場合、そのスタック トレースは次のようなものになるでしょう。
例
Unhandled Exception: java.lang.Exception:A bad thing happened!
at b.a(Unknown Source)
at d.b(Unknown Source)
**FIX** leavedebugginginfo グローバル オプションを使用すると、スタック トレースに行番号を保持で
きるということを覚えておいてください。このツールとそのオプションにより、難読化されたプログラムをデバッグ
する能力を非常に高めることができます。
割り当てレポート ファイルを使用すれば、手動で元の名前を復元できますが、これは退屈で時間のかかる処
理です。
スタック トレースの変換ツールは、出力割り当てファイルを指定し、スタック トレースをウィンドウに貼り付けて
[Decode]ボタンを押すことにより、この処理を自動化します。変換されたスタック トレースが[Translation
Report]タブに表示されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
85
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
難読化されたスタック トレースのうち、いくつかのメソッドはあいまいになる可能性があります。つまり、オーバー
ロード誘導を使用した場合、難読化されていないメソッドで一致するものが複数存在することがあるからです。
このような場合は、すべての可能性が表示されます。
特定の型やメソッドを名前で検索したい場合は、[Decode Specific Element]タブをクリックします。変換した
い特定の項目の難読化処理後の名前を入力できる画面が表示されます。
86
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Shelf Life トークンの生成
DashO のユーザー インターフェイスを使用して、実行時にアプリケーションで読み取られる Shelf Life トークン
を生成することができます。トークンを作成するために必要な情報は、DashO が直接アプリケーションにトーク
ンを差し込むものと似ています。Instrumentation – Shelf Life を参照してください。
Save
[Save]ボタンにより、構成したトークンをファイルに保存することができます。
Copy
[Copy]ボタンは、トークンをテキストとしてクリップボードにコピーするので、それをソース コードやリソース、プ
ロパティ ファイルに貼り付けることができます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
87
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
コマンド ライン インターフェイスの使用
このセクションは、DashO をコマンド ライン プログラムとして使用する方法について説明します。コマンド ライン
インターフェイスは、以下の操作を実行できるように設計されています。

構成ファイルの作成を必要とせずにコマンド ラインから難読化処理を実行する。

コマンド ライン オプションを使用して、既存の構成ファイルで指定されているオプションをオーバーライド
または補完する。

jar にウォーターマークを追加する。
DashO コマンド ライン
コマンド ライン オプションは先頭にハイフン(-)を付けます。
例
dashocmd [options] [projectfile]
以下に、コマンド ライン オプションの概要を示します。
オプション
説明
projectfile
DashO プロジェクト ファイル
-h, --help
コマンド ライン ヘルプを表示する
-e, --printStackTraces
例外のスタック トレースを出力する
-v, --verbose
詳細な情報を出力する
-q, --quiet
最小の量のメッセージを出力する
-f, --force
強制的に実行する
projectfile は構成ファイルで、Quick Jar モードが指定されていない限り、DashO の毎回の実行に必要
なファイルです。エントリ ポイント メソッドはコマンド ラインからは指定できないことに注意してください。これら
の情報は構成ファイルに記述しておく必要があります。
–h, --help オプションは、コマンド ライン ヘルプをオン デマンドで表示します。
–e, --printStackTraces オプションは、例外のスタック トレースを出力します。
–v, --verbose オプションを指定すると、DashO は、実行中に処理の進行状況に関する詳細なメッセージ
の出力を提供します。
–q, --quiet オプションは DashO に対して、最小量のメッセージを出力して実行するように指示します。こ
のオプションは、アプリケーションのビルド工程に組み込んで使用する場合に適しています。このオプションを
指定すると、詳細出力モードはオーバーライドされます。
–f, --force オプションは、DashO が Class.forName() メソッド(高度なトピックで詳しく説明します)を
見つけた場合でも、強制的に実行します。force グローバル オプションの使用は、コマンド ラインでのこのオプ
ションの使用よりも優先されます。
88
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
コマンド ラインからのプロジェクトのビルド
DashO は、コマンド ラインからプロジェクト ファイルを実行することができます。これを行うには、次を使用しま
す。
例
dashocmd [options] projectfile
プロジェクト ファイルには、Advanced モードと Quick Jar モードのどちらのプロジェクトも指定できます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
89
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
PreMark ウォーターマーク ツール
PreMark ツールを使用して、ウォーターマークの追加、読み取りを行うことができます。これは、DashO を起動
しなくても jar にウォーターマークを入れることができるコマンド ライン ツールです。このツールを使用すると、
DashO によって難読化されていない jar ファイルであっても PreMark 処理することができます。
コマンド ライン PreMark ツールを実行するには、次のコマンドを使用します。
例
premark [options] inputfile
コマンド ライン オプションは先頭にハイフン(-)を付けます。以下に、オプションの概要を示します。
既存のオプション
説明
-h, --help
コマンド ライン ヘルプを表示する
-e, --printStackTraces
例外のスタック トレースを出力する
-v, --verbose
詳細な情報を出力する
-q, --quiet
最小の量のメッセージを出力する
--version
バージョンを表示して終了する
-r, --read
ウォーターマークを読み取る
-m, --mark <watermark>
ウォーターマークを追加する
-o, --output <file>
ファイルを出力する
-p, --passphrase
<passphrase>
ウォーターマーク文字列を暗号化/復号する際に使用す
るパスフレーズ
-t, --truncate
ウォーターマークが大きすぎる場合は切り捨てる(既定:
失敗する)
-c, --charmap <charmap>
文字コード名(6bit-a|6bit-b|7bit-a|4bit-a|utf8)
–h, --help オプションは、コマンド ライン ヘルプをオン デマンドで表示します。
–e, --printStackTraces オプションは、例外のスタック トレースを出力します。.
–v, --verbose オプションを指定すると、PreMark ツールは、実行中に処理の進行状況に関する詳細な
メッセージの出力を提供します。
–q, --quiet オプションは DashO に対して、最小量のメッセージを出力して実行するように指示します。こ
のオプションは、アプリケーションのビルド工程に組み込んで使用する場合に適しています。このオプションを
指定すると、詳細出力モードはオーバーライドされます。
--version オプションを指定すると、PreMark ツールは、アプリケーションのバージョンを表示した後、その
アプリケーションを終了します。
–r, --read オプションは、指定された入力ファイルからウォーターマーク文字列を読み取ります。
–m, --mark <watermark> オプションは、特定の入力 jar に指定されたウォーターマーク文字列を埋め
込みます。
–o, --output <file> オプションでは、ウォーターマーク処理された出力 jar へのパスを指定することが
できます。
–p, --passphrase <passphrase> オプションでは、パスフレーズを設定します。PreMark ツールは、
ウォーターマーク文字列を暗号化/復号する場合にこのパスフレーズを使用します。
–t, --truncate オプションは、ウォーターマーク文字列が長すぎる場合には文字列を切り捨てます。この
オプションが指定されていない場合は、既定として、ファイルをウォーターマーク処理しないで失敗します。
90
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
-c オプションは、PreMark ツールに対し、指定された入力 jar にウォーターマーク文字列を埋め込むためにど
の文字コードのエンコードを使用する必要があるかを指示します。
メモ
charmap の値には、6bit-a、6bit-b、7bit-a、4bit-a、または utf8 を指定できます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
91
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
高度なトピック
このセクションでは、Java アプリケーションとライブラリを難読化処理する場合のさまざまなシナリオや問題点に
ついて説明します。
オーバーロード誘導によるメソッドの名前の変更
DashO は、メソッドの名前を変更する Overload Induction™(オーバーロード誘導)という米国で特許を取得し
たテクノロジを実装しています。名前変更システムの大部分が、単に古い名前 1 つにつき新しい 1 つの名前
を割り当てる(つまり、getX() が a() に、getY() が b() になる)のに対し、オーバーロード誘導はメソッ
ドのオーバーロードを最大限に誘導します。その根底にある考え方は、アルゴリズムに可能な限り多くの名前
をまったく同じ名前に変更させようというものです。
難読化前のソース コード:
例
private void calcPayroll(SpecialList employeeGroup) {
while (employeeGroup.hasMore()) {
employee = employeeGroup.getNext(true);
employee.updateSalary();
distributeCheck(employee);
}
}
オーバーロード誘導を行った後の、リバース エンジニアリングされたソース コード:
例
private void a(a b) {
while (b.a()) {
a = b.a(true);
a.a();
a(a);
}
}
この例についておそらく気付くことの 1 つは、難読化後のコードの方がよりコンパクトになっていることです。名
前の変更による好ましい副作用は、サイズの縮小です。たとえば、20 文字の長さの名前がある場合、それを
a() に変更すると、領域は大幅に(具体的には 19 文字分)節約されます。また、これは文字列ヒープ エントリ
を節約することでも領域を節約します。すべての名前を a に変更するということは、a が 1 度だけ格納されるこ
とを意味し、名前が a に変更されたメソッドあるいはフィールドは、それぞれがその名前をポイントできるのです。
オーバーロード誘導は、最短の識別子を連続的に再使用するので、この効果を高めます。
92
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
クラスの動的読み込み
java.lang.Class の forName() メソッドは、実行時にクラスを動的に読み込むための方法です。DashO
では、いかなる場合でも、どのクラスが動的に読み込まれるかを判断することは不可能です。次のコードを考え
てみましょう。
例
public Object getNewClass() {
String newClassName = getUserInputString();
try {
Object newClass = Class.forName(newClassName).newInstance();
return newClass;
}
catch(Exception e) {
// handle
}
}
このコードは名前で指定されたクラスを読み込み、そのクラスのインスタンスを動的に作成します。さらに、その
名前はユーザーが入力する文字列によって指定されます。ユーザーがどのクラスの名前を入力するかは、
DashO では予測できません。その解決策として、読み込める可能性のあるすべてのクラスの名前を対象から
除外します。そうしても、メソッドおよびフィールドの名前を変更することは可能です。これは、手作業による構
成が必要になります。
メモ
動的に読み込むクラスの指定を誤ると、難読化したアプリケーションでエラーが発生する可能性があります。
予測可能な動的読み込み
最も単純なケースは、あなたが、動的読み込みを介して読み込まれる可能性のあるクラスを正確に把握してい
るほど、あなたのアプリケーションを理解している場合です。動的に読み込まれるクラスは、基本クラスまたは
共通インターフェイスを共有します。
例
String s = getShapeName();
Shape myShape = (Shape)Class.forName(s).newInstance();
myShape.draw();
この例では、DashO は自動的にこのパターンを検出し、すべての Shape クラスを対象として選択することがで
きます。別の種類の作成パターンが使用された場合は、DashO 構成ファイルの entrypoints セクションにクラス
を個別に追加する必要があります。
例
<entrypoints>
<classes name="Triangle"/>
<classes name="Rectangle"/>
</entrypoints>
この場合は、DashO は Shape 階層から使用されていないメソッドを除去することができます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
93
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
予測不能な動的読み込み
動的に読み込まれるクラスが、アプリケーションが難読化される時点でわからないというケース、たとえば、ユー
ザー インターフェイスのアプリケーションの構築で、アプリケーションのユーザーが独自のコンポーネントや
サード パーティ製コンポーネントを含める可能性がある場合などは、既存のクラスを無条件のエントリ ポイント
として追加する必要があります。
例
<entrypoints>
<unconditional name="Triangle"/>
<unconditional name="Rectangle"/>
</entrypoints>
これにはいくつかの影響があります。

除去オプションにかかわらず、無条件に選択されるクラスのメソッドおよびフィールドは除去されません。

名前の変更オプションにかかわらず、クラスとそのメンバーのどちらの名前も変更されません。

クラス内のすべてのメソッドは、エントリ ポイント メソッドとして扱われます。
これらの法則は、未知のクラスへのインターフェイスは元の状態のままになるという考えを強要します。
リフレクション レポート
DashO には、動的に読み込む方法や対象を指定できる機能がいくつか用意されています。 DashO の
fornamedetection オプションは、動的に読み込まれるクラス インスタンスのほとんど、あるいはすべてを
処理します。
例
<global>
<option>fornamedetection</option>
</global>
DashO は、forName() の使用を見つけたすべての場所を報告します。これは、レポート ファイルの一部とし
て、依存関係分析後の出力として提供されます。fornamedetection オプションは、間違った答えを返す
ことはありませんが、まったく答えを返さないこともあるので注意してください。DashO が動的に読み込まれたク
ラスを判断できない("unable to determine")と報告するインスタンスには、手作業による構成が必要です。
例
NOTE:
Reflection use public void com.yoyodyne.Application.getInterface() –
java.lang.Class.newInstance() [BaseInterface Possible: InterfaceImplementor]
Reflection use public boolean com.yoyodyne.Test.connect() Class.forName()
Reflection use public float com.yoyodyne.Test.calculate() Class.forName() - [com.yoyodyne.Linker]
DashO は、メソッド connect() で動的に読み込まれたクラスを判断できないため、手動による構成が必要に
なります。このメソッドで動的に読み込まれたクラスは、<entrypoints> セクション下で <classes> タグを使用
して、対象選択される必要があります。
DashO がリフレクションの使用を見つけた場合に、force グローバル オプションが指定されていないと、DashO
は出力クラスも出力 jar も作成しません。
94
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
シリアル化
アプリケーションが新しい、つまり、アプリケーション内に既存のシリアル化されたオブジェクトがない場合は、
あなたにとってシリアル化は問題ではないかもしれません。DashO が難読化する前にシリアル化されたクラス
は、難読化後も依然としてシリアル化されます。
既に持続的なオブジェクトが存在する場合は、DashO を実行する前に、それらのオブジェクトがどのクラスから
作成されたかを識別する必要があります。メソッド/フィールドの除去と名前の変更は、これらのオブジェクトの
再読み込みを不可能にします。簡単な解決法は、無条件にクラスを対象選択することです。そこに、シリアル
化されるオブジェクトをすべて列挙します。
DashO は、バージョン間の互換性を容易にするために、serialVersionUID という名前を持つフィールド
を自動的にそのまま(除去も名前の変更もしない)にしておきます。さらに、シリアル化可能なフレームワークの
readObject()、writeObject()、writeReplace()、または readResolve() メソッドが使用されて
いる場合は、DashO は自動的にそれらをエントリ ポイントとして扱います。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
95
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
PreEmptive Analytics
このセクションでは、PreEmptive Analytics を使用する場合の開発プロセスについて説明します。カスタム属性
および拡張属性で利用できるさまざまなオプションについて説明し、その実例を提示します。
概要
PreEmptive Analytics の一連の製品は、アプリケーションの作成者に対し、アプリケーションの使用実態を見
抜く力を与える技術であり、サービスです。DashO を使用して Java アプリケーションやコンポーネントをインスト
ルメントし、PreEmptive Analytics サーバーへ情報を送信することができます。
アプリケーションが開始および停止する際、または指定されている機能が使用される際にメッセージを送信す
るよう、アプリケーションをインストルメントすることができます。Runtime Intelligence Service へ送信されたデー
タは、アプリケーションのこのライフサイクル データを集約し、サブスクライバーが利用できる Runtime
Intelligence ポータルを通じてこれを公開します。
DashO は、カスタム アノテーションから提供される指示に従って、アプリケーションに分析サポートを追加しま
す。適切にアノテーションが付けられた Java アプリケーションで DashO を実行すれば、DashO はそのアノ
テーションを処理し、適宜にアプリケーションをインストルメントします。結果として生じる出力アプリケーション
は、いつでも分析データをサービスへ送信できる状態になっています。
メッセージの種類
メッセージの種類がいくつかあります。

アプリケーションおよびセッションの開始

アプリケーションおよびセッションの終了

機能

パフォーマンス プローブ

システム プロファイル
アプリケーションとセッションの開始および停止メッセージ("アプリケーション ライフサイクル メッセージ")は、
アプリケーションが実行を開始したときとシャットダウンしたときに送信されるものです。これらのメッセージに含
まれる情報は、アプリケーションの動作および基本的な使用パターンを追跡します。機能、パフォーマンス プ
ローブ、システム プロファイルのメッセージを使用することにより、派生的な使用法や環境情報が得られます。
メッセージからのデータが Runtime Intelligence ポータルのダッシュボードを動かします。アプリケーションにこ
れらのメッセージを送信させるには、以下のことを実行する必要があります。

Runtime Intelligence Service のサブスクライバーになります。これにより、ポータルのダッシュボードおよび
データにアクセスできるようになります。

アプリケーションに、アプリケーションの開始および停止のアノテーションを付けます。

インストルメンテーションをオンにした DashO を介してアプリケーションを実行します。
カスタム アノテーション
すべてのインストルメンテーション アノテーションは、dasho-annotations.jar 内に定義されています。
このファイルは、DashO のインストール場所の lib フォルダーにあります。インストルメンテーション アノテーショ
ンをアプリケーションに追加するには、この jar ファイルへの参照を追加して、コンパイル時に利用できるように
しておかなければなりません。インストルメンテーション コードを差し込むときに、DashO はこれらのアノテー
96
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
ションへの参照を解除します。そのため、アプリケーションの実行時に jar は必要なく、jar をアプリケーションと
共に配布する必要はありません。
カスタム アノテーションを使用するほかに、DashO ユーザー インターフェイスを使用して、すべてのインストル
メンテーション アノテーションを仮想アノテーションとして指定できます。仮想アノテーションを使用すれば、ア
プリケーションのソース コードを変更する必要はありません。プログラマー向けのリファレンスについては、
javadocs を参照してください。
機能の利用状況の追跡
DashO では、feature アノテーションによって機能の利用状況を追跡するサポートが追加されています。開発
者は、機能の開始、停止、あるいは全体を割り当てるすべてのメソッドに feature アノテーションを追加できます。
DashO は処理中に feature アノテーションを見つけると、分析メッセージを送信するためのコードをそのメソッド
に追加します。
機能名
機能レベルの分析を理解するには、機能は名前で識別される必要があります。名前は、問題となっている機
能の名前を定義する文字列値です。この名前は特定の規約に従う必要はありませんが、わかりやすい一意の
名前にしてください。ただし、これは当該の feature アノテーションが開始/停止ペアの一方である場合を除きま
す。この場合には、機能名は一致している必要があります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
97
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
機能のイベントの種類
DashO は、イベントの種類を示すための 3 つのアノテーションを持っています。

FeatureTick – 機能が実行されました。

FeatureStart – 機能が開始されました。

FeatureStop – 以前に開始された機能は終了しました。
FeatureStart と FeatureStop は、機能が使われた回数を集計するだけでなく、機能の実行時間を計
算するために使用されます。FeatureTick は、利用状況を集計するためだけに使用されます。
例
@FeatureStart("Find")
private void beginFind() {
// ...
}
メソッドのロジックが機能を完全に含んでいる場合は、そのメソッドに開始と停止のアノテーションを置くことが
できます。DashO は、メソッドの開始時に開始メッセージを送信し、メソッドの完了時に停止メッセージを送信し
ます。
例
@FeatureStart("Find")
@FeatureStop("Find")
private void doFind() {
// ...
}
98
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
パフォーマンス情報の収集
PreEmptive Analytics コードを使用して、アプリケーションの実行中にパフォーマンスに関連する情報を収集し、
送信することができます。アプリケーションにこのサポートを追加するには、アプリケーション内の 1 つ以上のメ
ソッドに PerformanceProbe アノテーションを配置します。DashO は処理中にこのアノテーションを見つけ
ると、パフォーマンス情報を取得して、PreEmptive Analytics サーバーへメッセージを送信するためのコードを
追加します。
収集されるパフォーマンス データには次のものが含まれます。

CPU 使用率

利用可能なメモリ

現在のプロセスで使用されているメモリ
例
@PerformanceProbe
public void doSomething() {
// ...
}
収集されたパフォーマンス データは、Runtime Intelligence ポータルの Data Extract レポートで入手できます。
File Feeds セクションからダウンロードすることも可能です。
環境情報の収集
PreEmptive Analytics コードを使用して、アプリケーションが実行されているシステムに関する情報を収集し、
送信することができます。アプリケーションにこのサポートを追加するには、アプリケーション内の 1 つのメソッド
に SystemProfile アノテーションを配置します。DashO は処理中にこのアノテーションを見つけると、シス
テム プロファイルを収集して、PreEmptive Analytics サーバーへメッセージを送信するためのコードを追加しま
す。通常、このデータは、アプリケーションの実行中に 1 回だけ収集する必要があります。
以下は、収集されるシステム データの種類の概要です。

Processors – プロセッサ数、クロック速度、製造元、プロセッサ ID

Logical Disks – 論理ディスク数、ボリューム名、サイズ、空き領域、ファイル システム

Memory - 速度、容量

Network Adapters - IP アドレス、MAC アドレス

Domain2 - ドメインの名前と役割

Display - 名前、リフレッシュ レート、垂直方向および水平方向の解像度

Video - 名前、メモリ サイズ、色数

Terminal Services3 - 許可されている接続数

Sound – 名前、製造元

Modem – モデル、デバイスの種類
2
3
Windows のみ。
Windows のみ。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
99
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
@SystemProfile
public void initialize() {
// ...
}
収集されたデータは、Runtime Intelligence ポータルの Data Extract レポートで入手できます。File Feeds セク
ションからダウンロードすることも可能です。
ユーザー定義データの送信
インストルメンテーション メッセージのほとんどの種類では、ユーザー定義データ(キーと値のペアの形式)を
収集し、メッセージと一緒に送信することができます。この情報を送信するには、メソッドに
PropertySource を指定します。
DashO は PropertySource を利用して、実行時にキーと値のペアを収集するためのコードを生成します。
PropertySource は Properties インスタンス、つまりフィールドまたはメソッドのいずれかのソースです。詳細
については、ソースおよび操作の指定を参照してください。
例
@FeatureTick("Click")
@PropertySource("getProperties()")
private void buttonClick(JComponent sender) {
// ...
}
// Creates and populates custom properties
private Properties getProperties() {
Properties props = new Properties();
props.setProperty("key1", "val1");
props.setProperty("key2", "val2");
props.put("numeric", new Integer(934));
return props;
}
アプリケーションによって送信された Properties は、Runtime Intelligence ポータルの Data Extract レポートで
入手できます。File Feeds セクションからダウンロードすることも可能です。
メッセージ データのダウンロード
Runtime Intelligence ポータルは、インストルメント化されたアプリケーションから発信される生のメッセージ
データを安全にダウンロードする機能を提供します。データは、MS Excel や OpenOffice Calc と互換性のある
CSV ファイルで入手できます。
生のメッセージ データを取得するには、http://runtimeintelligence.com の Runtime Intelligence ポータルにアク
セスします。PreEmptive Solutions から提供されたユーザー名とパスワードを入力し、Data Extracts の下にあ
る File Feeds にアクセスします。
100
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
改ざんチェックと対応
DashO は、アプリケーションが改ざんされているかどうかを検出し、改ざんされている場合には PreEmptive
Analytics サーバーへメッセージを送信するようにアプリケーションをインストルメントすることができます。改ざ
んチェックでは、アプリケーションが DashO によって、あるいは DashO によるインストルメンテーションに続く別
のプロセスによって署名されている必要があります。改ざんチェックと対応は、インストルメンテーションのカスタ
ム アノテーションを使用して実装されます。このアノテーションは、ソース コードに置くか、仮想アノテーション
を使って追加することができます。
改ざんチェック
改ざんを検出するには、アプリケーション内の 1 つ以上のメソッドに TamperCheck を設定します。DashO は、
コードが特定の証明書によって著名されていることを検証する、ランタイム チェックを実行するコードを追加し
ます。チェックに失敗したら、1 つ以上の方法でそれに対応することができます。チェックが実行される時点で、
次のうちの 1 つまたはすべてを選択できます。

改ざんメッセージを送信する。
改ざんメッセージが PreEmptive Analytics サーバーへ送信されます。既定では、メッセージは送信されま
せん。アプリケーションが分析を使用しており、アプリケーションに ApplicationStart が含まれてい
る場合は、これ以上の構成は必要ありません。TamperCheck のみを使用している場合は、他のアノテー
ションを用いて会社とアプリケーションの ID を供給するか、または Instrumentation Properties パネルでそ
れらを提供する必要があります。

メソッドを呼び出すか、またはフィールドを設定する。
単一の boolean を取るメソッドを呼び出すか、または boolean 型のフィールドを設定することによって、
改ざんの状態をアプリケーションに渡し返すことができます。改ざんチェックが失敗した場合のブール値
は true です。改ざんチェックが成功した場合は、false が使用されます。アプリケーションは、この情
報に基づいて直ちに行動するか、あるいは後で TamperResponse アノテーションとやり取りするために格
納しておくことができます。

対応を行う。
即時に取ることができる対応がいくつかあります。exit – ランダムにゼロ以外のリターン コードを生成して
アプリケーションを終了します。hang – 現在のスレッドをハングさせます。error – ランダムに選択された
エラーをスローします。exception – ランダムに選択された、チェックされていない例外をスローします。
値を空白のままにすると、既定の対応である none が取られます。リターン コードと Throwable のラン
ダム化は、実行時ではなく、チェックが差し込まれた時点で実行されます。エラーと例外は、その出所を隠
すために、空のスタック トレースを伴ってスローされます。
これらの動作を複数選択した場合は、上記の順序で実行されます。これらのうちのどれも要求せず、none が
有効になる場合は、改ざんチェックは省かれ、DashO が警告メッセージを生成します。
アプリケーションには、さまざまな構成の TamperCheck をいくつでも含めることができます。複数のチェック
を使用したり、対応を混合したりすることにより、アタッカーの侵入を妨げられるでしょう。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
101
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
private static boolean tamperFlag;
@TamperCheck(sendMessage=true, action="@tamperFlag")
public static void main(final String[] args){
}
@TamperCheck(response="hang")
private int computeResult(){
}
署名との相互作用
改ざんチェックは、実行時に、コードが特定の証明書によって署名されているかどうかを検証することにより実
行されます。結果として生じる jar ファイルへの署名に DashO が使われる場合は、これ以上の構成は必要あり
ません。DashO を使って改ざんチェックを追加した後、別のプロセスによって jar ファイルが署名される場合は、
SignerInfo アノテーションを使用して、署名情報について DashO へ伝える必要があります。これにより、
DashO はランタイム改ざんチェックを行うために必要なキー情報を取得することができます。SignerInfo で
は、Output Signing パネルで見られる内容と同様の情報を指定できます。
例
@SignerInfo(storepass="${master.psw}", storetype="JKS", alias="ProdKey")
@TamperCheck(sendMessage=true, action="@tamperFlag")
public static void main(final String[] args){
}
ユーザー インターフェイスを使用して storepass 値のパスワードを入力したとき、パスワードにプロパティ参
照が含まれていない場合は、DashO は暗号化された形式でパスワードを格納します。
改ざんの対応
検出と対応を分離すると、アタッカーにとってより困難になります。複数の異なる対応をアプリケーション中に散
在させることで、アプリケーションの困難さが増します。それらの対応を非決定的なものにすると、プロセスをイ
ライラさせるものにすることができます。DashO では、改ざんされたアプリケーションへの対応を、単純にでも複
雑にでも望みどおりに構成することができます。
TamperResponse アノテーションは、検出と対応のコードを分離するために TamperCheck と対話する
コードを追加します。1 つ以上の TamperResponse をアプリケーションに追加することができます。
TamperResponse は、boolean 値を介して TamperCheck に合わせられます。TamperCheck の動作
を使用する値セットは、TamperResponse のソースを使って取得されます。取得された値が true であれば、
対応が実行されます。
TamperCheck と同様に、TamperResponse はメッセージを送信し、かつ対応を行うことができます。さらに、
対応動作には、0.0(なし)から 1.0(常時)までの確率係数に基づいて条件を付けることができます。既定値
は 1.0 です。
102
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
private static boolean tamperFlag;
@TamperCheck(action="@tamperFlag")
public static void main(final String[] args){
}
@TamperResponse(source="@tamperFlag", sendMessage=true)
private void init() {
}
@TamperResponse(source="@tamperFlag", response="exit", probability=.05)
private int computeResult(){
}
@TamperResponse(source="@tamperFlag", response="error", probability=.1)
private FileInputStream readInput(){
}
TamperResponse によって分析メッセージを送信することを要求している場合は、いくつか追加の構成情報
を 提 供 す る 必 要 が あ る か も し れ ま せ ん 。 ア プ リ ケ ー シ ョ ン が 分 析 を 使 用 し て お り、 ア プ リ ケ ー シ ョ ン に
ApplicationStart が含まれている場合は、これ以上の構成は必要ありません。メッセージの送信に
TamperResponse を使用している場合は、他のアノテーションを用いて会社とアプリケーションの ID を供給
するか、または Instrumentation Properties パネルでそれらを提供する必要があります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
103
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Shelf Life
Shelf Life(使用期限)はアプリケーションの在庫管理機能で、期限切れや通知のロジックをアプリケーションに
追加することを可能にするものです。このロジックは、アプリケーションを終了したり分析メッセージを送信したり
することによって、期限切れポリシーを実施します。たとえば、ベータ版のアプリケーションを特定の日で期限
切れになるようにすることができます。アプリケーションの期限切れを特定の日、あるいは開始日からの日数で
スケジュールできます。また、オプションとして、期限切れになる前の警告期間を指定できます。期限切れの情
報は、アプリケーション内に置くことも、暗号化された外部のトークン ファイルから読み取ることもできます。後
者では、アプリケーションを再構築するのではなく、新しいトークン ファイルを発行することにより、アプリケー
ションの有効期限を延長することができます。期限切れチェックは、アプリケーション内の 1 つ以上の場所に追
加できます。
アクティブ化キー
Shelf Life の使用を開始するには、PreEmptive Solutions から Shelf Life Activation Key を入手する必要があ
ります。このキーは、期限切れの情報を含んでいるトークンを生成するために使用されます。PreEmptive は、
トークンを生成し、Runtime Intelligence ポータルでアプリケーションを識別するためのキーを含むデータ ファ
イルを発行します。このキーは、コードがインストルメント化されており、ユーザー インターフェイスまたは Shelf
Life アノテーションを介して指定できる場合には、DashO によって読み取られます。
Shelf Life トークン
Shelf Life トークンは、アプリケーションおよび期限切れ情報を含んでいる暗号化されたデータのセットです。
アプリケーションに挿入するか、またはアプリケーションの外部に保存することができます。外部に保存された
トークンを作成するために、DashO ユーザー インターフェイスまたは Ant タスクを使用できます。
トークンの期限切れと警告の情報は、ユーザー インターフェイスを介して、あるいは Shelf Life アノテーション
を介して入力されます。アノテーションは、ソースに追加するか、DashO の仮想アノテーションを使って追加す
ることができます。期限切れと警告の日付は、2 つの異なる方法で指定できます。
絶対日付 – 有効期限が切れる日、または警告期間が始まる日の固定日付を指定できます。
相対日付 - 有効期限は開始日からの日数です。警告期間は、期限切れの前の日数です。
絶対日付と相対日付を組み合わせることができます。たとえば、2021/1/1 に有効期限が切れ、期限切れにな
る 30 日前に警告を発する、とすることができます。期限切れの情報はトークンを作成するために必要ですが、
警告の情報は任意です。
104
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
期限切れチェック
ExpiryCheck アノテーションは、期限切れチェックが行われるアプリケーション内の位置を定義するために
使用されます。ExpiryCheck は、ソースに追加するか、DashO の仮想アノテーションを使って追加すること
ができます。ソースにアノテーションを追加した場合は、DashO をインストールした場所の lib フォルダーにあ
る dasho-annotations.jar と共にインストールする必要があります。既定では、DashO はこれらのアノ
テーションへの参照を解除します。そのため、アプリケーションの実行時に jar は必要なく、jar をアプリケー
ションと共に配布する必要はありません。
期限切れの情報が Instrumentation – Shelf Life パネルで設定される場合、期限切れチェックを追加するには、
最低でもキー ファイルと有効期限、そしてアノテーションが 1 つだけ必要です。
例
@ExpiryCheck
public static void main(final String[] args){
if(args.length == 0){
System.out.println("Hello no name");
}else{
System.out.println("Hello " + args[0]);
}
}
これは、main() の冒頭でアプリケーションに期限切れチェックを追加します。また、すべての情報をアノテー
ションとして指定することができます。
例
@ExpiryKeyFile("yoyodyne.slkey")
@ExpiryDate("01/01/2021")
@WarningPeriod("30")
@ExpiryCheck
public static void main(final String[] args){
// ...
}
アノテーション、日付、期間の値はすべて文字列です。これにより、DashO のプロパティや環境変数の値を使
用して、それらをパラメーター化することが可能です。
例
@ExpiryKeyFile("${key_dir}/yoyodyne.slkey")
@ExpiryDate("01/01/${exp_year}")
@WarningPeriod("${warn_period}")
@ExpiryCheck
public static void main(final String[] args){
// ...
}
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
105
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
相対的な有効期限
期限切れは、動的な開始日からの日数で指定することができます。開始日には、インストールの日付、アプリ
ケーションが最初に実行された日付などが挙げられます。開始日は、アプリケーションによって実行時に提供
されます。
例
@StartDateSource("getInstallDate()")
@ExpiryPeriod("90")
@ExpiryCheck
public static void main(final String[] args){
// ...
}
private static Date getInstallDate(){
return new Date(Preferences.userRoot().node("MyApp").
getInt("installDate", 0));
}
開始日のソースとして、静的メソッドやインスタンス メソッド、あるいはフィールドを使用できます。詳細について
は、ソースおよび操作の指定を参照してください。
外部に保存されたトークン
前の例では、DashO は Shelf Life トークンをアプリケーションに埋め込みました。トークンは、ファイルやリソー
スとして外部に保存しておき、実行時に読み取ることもできます。
例
@ExpiryTokenSource("getToken()")
@ExpiryCheck
public static void main(final String[] args){
// ...
}
private static Reader getToken(){
return new InputStreamReader(HelloWorld.class.getClassLoader().
getResourceAsStream("expiry.dat"));
}
トークンのソースは、トークン データを提供する java.io.Reader を返す、静的メソッドまたはインスタンス
メソッドです。詳細については、ソースおよび操作の指定を参照してください。
期限切れの操作
ExpiryCheck が実行される場合、既定の操作は、メッセージを System.out に出力し、ゼロ以外のリター
ン コードで終了することです。
例
このアプリケーションは 2013 年 1 月 1 日に有効期限が切れました。
106
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
アプリケーションが警告期間に入っている場合は、メッセージが System.out に出力され、実行は継続され
ます。
例
このアプリケーションは 2014 年 1 月 1 日に有効期限が切れます。
より洗練されたアプリケーションにするために、カスタムのアプリケーション操作を指定することができます。
例
@ExpiryCheck(action="check()")
public static void main(final String[] args){
// ...
}
private static void check(Token token) {
if(token.isExpired()){
JOptionPane.showMessageDialog(null,
"The application expired on " + token.getExpirationDate(),
"Expired",
JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
if(token.isInWarning()){
JOptionPane.showMessageDialog(null,
"The application will expire in " +
token.getDaysTillExpiration() + " days",
"Expiration Warning",
JOptionPane.WARNING_MESSAGE);
}
}
操作は、その後で実行する操作を決定するために使用される Shelf Life トークンに渡されます。
Shelf Life の Analytics メッセージ
有効期限が間もなく切れる、もしくは切れたアプリケーションを追跡できるよう、Shelf Life は Analytics メッセー
ジを送信することができます。ExpiryCheck には sendMessage プロパティがあります。
例
@ExpiryCheck(sendMessage=true)
public static void main(final String[] args){
// ...
}
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
107
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
アプリケーションに ApplicationStart が既に含まれている場合は、さらにアノテーションを加える必要は
ありません。PreEmptive Analytics を使用して期限切れを追跡する場合は、アプリケーションを識別するアノ
テーションを加える必要があります。
例
@ExpiryCheck(sendMessage=true)
@CompanyId("DF29A894-C1AB-5947-E0A2-0D9779CFFB63")
@ApplicationId("F0000FDA-9500-1B92-9564-A9DA3D8C3CF0")
public static void main(final String[] args){
// ...
}
その後、ExpiryCheck は自動的に ApplicationStart と ApplicationStop を処理し、期限切れの
メッセージを Runtime Intelligence ポータルへ送信します。
メモ
また、アプリケーションを識別するために、ExpiryCheck を使って次のいずれかを追加することができま
す。Company; CompanyId; CompanyName; Application; ApplicationId; ApplicationName;
ApplicationType; ApplicationVersion; ApplicationVersionSource;
ApplicationInstanceIdSource; UseSsl
108
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例外レポート
DashO は、PreEmptive Analytics サーバーに対し、アプリケーションでスローされたハンドルされない例外を報
告し、任意でメッセージを送信するようにアプリケーションをインストルメントすることができます。さらに、キャッ
チされた例外、キャッチされない例外、あるいはスローされた例外の報告をメソッド レベルで行うようにアプリ
ケーションをインストルメントすることができます。例外レポートは、インストルメンテーションのカスタム アノテー
ションを使用して実装されます。このアノテーションは、ソース コードに置くか、仮想アノテーションを使って追
加することができます。
アプリケーションおよびスレッド レベルのレポート
ハンドルされない例外をインターセプトして、アプリケーション レベルまたはスレッドごとに報告することができ
ま す 。 ユ ー ザ ー に よ る 操 作 の な い 非 GUI ア プ リ ケ ー シ ョ ン の た め に 、 ハ ン ド ル さ れ な い 例 外 を 直 接
PreEmptive Analytics サーバーに送信することができます。GUI アプリケーションでは、アプリケーションの
ユーザーがレポートを送信するかどうかを選べるよう、ダイアログ ボックスが提示されるように選択することがで
きます。また、例外が発生する前に実行していた活動に関する情報だけでなく、いくつかの連絡先情報も入力
できます。この情報は任意ですが、入力すれば、Runtime Intelligence ポータルで例外情報と一緒に利用でき
ます。
アプリケーションおよびスレッド レベルのレポートは、AddUncaughtExceptionHandler アノテーションに
よって追加されます。ハンドラーは、既定のハンドラーと現在のスレッド専用のいずれとしてインストールされて
いるか、また、ユーザーにダイアログが表示されるかどうかは、アノテーションのプロパティが決定します。
例
@AddUncaughtExceptionHandler(showDialog=true)
public static void main(final String[] args){
// ...
}
new Thread() {
@AddUncaughtExceptionHandler(thread=true)
public void run() {
// ...
}
}.start();
ユーザーがダイアログと対話できるようにすると、グローバルの opt-in 設定をオーバーライドする機会が与えら
れます。ユーザーがレポートを送信するように選択した場合は、その他の Analytics メッセージの opt-out 設定
がオーバーライドされます。それでもアプリケーションは、PreEmptive Analytics サーバーでアプリケーションが
識別されるようにするために、構成情報を必要とします。非 GUI アプリケーションでダイアログが要求された場
合は、ユーザーがメッセージを送信するよう選択している場合にのみレポートが送信されます。
ユーザーによる操作なしでレポートを送信するよう選択した場合は、ユーザーが分析メッセージを送信するよう
選択している場合にのみレポートが送信されます。
メモ
これらの機能は、ExceptionHandler クラスの API として利用できます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
109
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
メソッド レベルのレポート
例外のレポートによりきめ細かいアプローチを求める場合は、アノテーションを使ってメソッド レベルで例外を
追跡できます。DashO は、メソッド レベルの例外レポートを追加するために使用される 3 つのアノテーション、
ReportCaughtExceptions 、ReportThrownExceptions 、ReportUncaughtExceptions を提
供します。3 つのアノテーションはすべて次の動作をサポートしています。

分析のエラー メッセージを送信する。
エラー メッセージが PreEmptive Analytics サーバーへ送信されます。これは sendMessage プロパティ
です。既定では、メッセージを送信することになっています。メッセージを送信するには、アプリケーション
に ApplicationStart が含まれており、ユーザーがメッセージを送信することを選択する必要がありま
す。

メソッドを呼び出すか、またはフィールドを設定する。
Throwable を取るメソッドを呼び出すか、または Throwable のフィールドを設定することによって、例
外をアプリケーションに渡し返すことができます。これは action プロパティです。
どちらの動作も使用する場合は、メッセージの送信が実行されてから操作(action)が行われます。次の例は、
例外のレポートがクラス内のすべてのメソッドに適用されるよう、クラス レベルに例外レポートを追加する方法を
示しています。この例では、メッセージは PreEmptive Analytics サーバーへ送信されるだけでなく、Log4J を使
用してローカルに記録されます。
例
import org.apache.log4j.Logger
@ReportCaughtExceptions(action="@onCatch()")
@ReportThrownExceptions(action="@onThrow()")
class MyClass {
private final static Logger log = Logger.getLogger(MyClass.class)
public void execute(){
// ...
}
private static void onCatch(Throwable t){
log.info("MyClass caught " + t.getClass().getName(), t);
}
private static void onThrow(Throwable t){
log.warn("MyClass threw " + t.getClass().getName(), t);
}
}
110
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
前述のプロパティに加え、ReportUncaughtExceptions アノテーションでも、ハンドルされない例外を無
視することができます。数値を返すメソッドは、ハンドルされない例外が無視された場合にはゼロを返します。
オブジェクトまたは配列を返すメソッドは、null を返します。
次の例では、div(x, 0) を呼び出すと、ArithmeticException がスローされて System.err が出力
されますが、メソッドはゼロを返します。
例
@ReportUncaughtExceptions(sendMessage=false, action="onErr()",
ignore=true)
int div(int num, int denom){
return num / denom;
}
void onErr(Throwable t){
t.printStackTrace();
}
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
111
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
バージョン情報の取得
自動プロセスの中で DashO を使用している場合は、DashO 内のクラスでメソッドを呼び出すことによって、
バージョン情報を得ることができます。DashOPro.jar に、バージョン情報を返す静的メソッドを持つクラスが
含まれています。このようなクラスには、DashOPro、DashOProGui、Watermarker があります。
これらのクラスは、次の静的メソッドを含んでいます。
static String getVersion()
N.N.N 形式のバージョン番号。例:6.12.0
static int getVersionMajor()
メジャー バージョン番号。例:6
static int getVersionMinor()
マイナー バージョン番号。例:12
static int getVersionRevision()
リビジョン番号。例:0
static String getFullVersion()
バージョン番号の判読可能なバージョン。これには、N.N.N 形式のバージョンに加えてテキストが含まれてい
る場合があります。
static String getFileVersion()
このリリースで使用されている DashO プロジェクト ファイルの、N.N.N 形式のバージョン番号。これは、
getVersion() で返されるバージョンとは異なる場合があります。
さらに、Lucidator.jar には Lucidator クラスが含まれています。これは、getFileVersion() を除
く上記のすべてのメソッドを含んでいます。
112
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
カスタム暗号化の使用
文字列の暗号化フェーズで検出された文字列を処理するとき、独自の暗号化アルゴリズムを使用するように
DashO を構成できます。実装は、単純にでも複雑にでも望みどおりにできます。ただし、長時間実行される復
号メソッドは結局、アプリケーションの速度を低下させるということを覚えておいてください。この処理には
Encryption(暗号化)と Decryption(復号)の 2 つの部分があります。暗号化メソッドは、DashO がプロジェクトを
処理するときに使用されます。暗号化のクラスとメソッドは、別個の jar にパッケージ化し、プロジェクトから使え
るように構成する必要があります。復号メソッドは、アプリケーションと一緒にパッケージ化されます。復号のクラ
スとメソッドは、プロジェクトの入力の一部であり、プロジェクトから使えるように構成する必要があります。
Encryption
暗号化アルゴリズムは public static メソッドである必要があります。引数として、プレーン テキストである単一の
文字列を取り、鍵と暗号文の 2 つの null でない文字列の配列を返します。
例
public static String[] encrypt (String plainText) {
String key = {好きなように決定します};
String cipherText = {好きなように作成します};
return new String[]{key,cipherText};//順序が重要です!
}
Decryption
復号アルゴリズムは public static メソッドである必要があります。引数として、鍵と暗号文の 2 つの文字列を取
り、プレーン テキストの null でない文字列を 1 つ返します。暗号化メソッドで作成された暗号文を正しく復号で
きる必要があります。
例
public static String decrypt (String key, String cipherText) {
String plainText = {好きなように決定します};
return plainText;
}
メモ
復号クラスは、名前変更されて難読化されますが、カスタムの文字列暗号化からは除外されます。復号クラス
が入力内の他のクラスを使用している場合は、実行時に無限再帰的な呼び出しが発生しないように、それら
を文字列の暗号化対象から手作業で除外する必要があるかもしれません。カスタム暗号化は、Quick Jar プ
ロジェクトではサポートされません。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
113
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
サンプル アプリケーション
DashO には、DashO の使い方により精通していただけるよう、いくつかのサンプル アプリケーションが用意さ
れています。これらのサンプルは DashO と一緒にインストールされ、samples ディレクトリに置かれます。アプ
リケーションは次のとおりです。

AndroidPA – PreEmptive Analytics を使用してメッセージを送信する Android アプリケーション。

Applet – 電卓アプレット。

Instrumentation – PreEmptive Analytics を使用したインストルメンテーションのサンプル。

Jsp-PA – JSP で PreEmptive Analytics の taglib を使用する方法を示す WAR ファイルのサンプル(メモ:
このサンプルは、PA Taglib がインストールされている場合にのみインストールされます)。

Log4j – インストルメンテーションなしで、log4j を使用して PreEmptive Analytics メッセージおよび例外報
告を生成します。

Multidir – merge="false" 出力オプションを使用した、複数ディレクトリにまたがる難読化。

Multijar – merge="false" 出力オプションを使用した、複数 jar にまたがる難読化。

PA-api – Java PA の API を使用した簡単な例。

Shelflife – いくつかの例があります。
o
Authorized-app – Shelf Life を使用して、既存のアプリケーションに認証チェックと無料の試用期間
を追加します。
o
Basic – Shelf Life を使用して、hello world アプリケーションに有効期限を追加します。
o
CustomAction – 満了時のカスタム動作を使用して、アプリケーションの有効期限が切れたときにダイ
アログを表示します。
o
RelativeStart – 動的な開始日から一定の日数でアプリケーションの期限が切れます。
o
TokenSource – 外部ソース(この場合はリソース)から期限切れトークンを読み取ります。

SimpleApp – 「hello world」タイプのアプリケーション。

SimpleAppJar – Quick Jar プロジェクトを使用した、「hello world」タイプのアプリケーション。

SpringBean – DashO で Spring Beans を処理する方法を示す、Spring アプリケーション。
メモ
多くのサンプルには特別な構成手順があるため、readme ファイルを参照してください。
114
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
プロジェクト ファイル リファレンス
このセクションでは、DashO の XML プロジェクト ファイルについて説明します。ユーザー インターフェイスを
使用してファイルを生成している場合にもリファレンスとして役立つように、各オプションを詳しく解説します。
DashO プロジェクト ファイルには、どのような名前や拡張子を付けてもかまいませんが、優先される拡張子
は .dox です。プロジェクト ファイルには、指定したアプリケーションがどのように難読化処理されるかについ
ての情報が含まれています。プロジェクト ファイルは、DashO と一緒に配布される dasho.xsd に準拠する
XML ドキュメントです。
<dasho>
<dasho> タグは、.dox ファイルの最も外側のタグです。
Version 属性
ファイル バージョンは必要な属性です。プロジェクト ファイルを読み取ることができる最も古い DashO のバー
ジョンを指定します。たとえば、version="6.9" プロジェクトは、プロジェクトを編集しなくても、バージョン
7.0 の DashO で使用することができます。
例
<dasho version="7.0.0">
メモ
DashO は、アプリケーションのバージョンと異なるバージョンでプロジェクト ファイルを作成することができま
す。ファイル バージョンは、プロジェクト ファイルを使用することができる DashO の最小バージョンを表します。
<propertylist> セクション
省略可能な <propertylist>(プロパティ リスト)セクションでは、プロパティと呼ばれる変数の定義および値の代
入を行うことができます。これらは、プロジェクト ファイルで使用したり、他のプロパティの値を定義するために
使用したりすることができます。
例
<propertylist>
<property name="projectname" value="myproject"/>
<property name="projectdir" value="c:\myprojects"/>
</propertylist>
プロジェクト ファイルが存在するディレクトリを示す、dasho.basedir と呼ばれる組み込みの外部プロパティ
があります。保存されていない新しいプロジェクトでは、dasho.basedir は適用できません。
プロパティは、複数のプロジェクトや同じプロジェクトのさまざまなバージョン、あるいはさまざまなビルド環境間
での移植を容易にするためのテンプレートとしての役割を果たすプロジェクト ファイルの作成に役立ちます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
115
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
プロパティ参照
プロパティは、次の構文で参照されます。
例
${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:-} を使用して空の文字列を代入することができます。
116
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
動的プロパティ
プロジェクト ファイルのいくつかの場所で、動的プロパティを使用することができます。このプロパティの値には、
処理されているクラスやメソッドに関する情報が含まれます。

${CLASS_NAME} – パッケージ名を含む、現在のクラスの完全な名前。

${CLASS_SIMPLENAME} – クラスの簡易名。つまり、パッケージ名のないクラス名。

${CLASS_PACKAGE} – 末尾のピリオドを含む、クラスのパッケージ名。これは、既定のパッケージのクラ
スでは空の文字列になります。プロパティが展開されるようにするには、${CLASS_PACKAGE:-} を使用
します。

${METHOD_NAME} – 現在のメソッドの名前。コンストラクターの場合、これは ${CLASS_SIMPLENAME}
と同じです。

${PROP_NAME} – メソッドが setter または getter である場合は、関連するプロパティの名前。コンストラク
ターの場合、これは ${CLASS_SIMPLENAME} と同じです。
以下のプロパティ値は、プロジェクト ファイルの場所と名前によって異なります。

${dasho.file} – プロジェクト ファイルの絶対パス。

${dasho.basedir} – プロジェクト ファイルがあるディレクトリへの絶対パス。

${dasho.project} – プロジェクト ファイルの、パスも拡張子もない名前。
以下のプロパティ値は、実行環境によって異なります。

${dasho.java.version} – DashO が検出した JVM バージョン。"1.5"、"1.6"、または "1.7"。

${jce.jar} – Java Cryptography Extension jar の絶対パス。

${jsse.jar} – Java Secure Socket Extension jar の絶対パス。

${javaws.jar} – Java Web Start jar の絶対パス。
タイムスタンプ プロパティ
DashO では、現在の日付および時刻に関する情報を挿入できるように、tstamp プロパティが用意されていま
す。tstamp プロパティは、次の 2 つの異なる方法で使用できます。

${tstamp} はロケールの既定の書式を使用して、日付の情報を挿入します。

${tstamp[pattern]} は書式指定を使用して、日付の情報を挿入します。pattern は、Java の
SimpleDateFormat クラスで使用されるものと同じです。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
117
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
プロパティの優先順位
プロジェクト ファイルに定義されているプロパティ、Java のシステム プロパティ、または環境プロパティの値を
参照することができます。プロパティの値を解決するために、DashO は次の順序でソースを調べます。

Java のシステム プロパティ

環境プロパティ

プロジェクト ファイルのプロパティ
このように、Java コマンド ラインの –D オプションを使用するか、Ant を介せば、プロジェクト ファイルに定義さ
れているプロパティをオーバーライドすることができます。
プロパティは、次のタグと共に使用することができます。
118

<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>/<quickjar> の path 属性

<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 属性

<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 属性

<expiry> の period、warningperiod、date、および warningdate 属性

<expiry>/<property> の name および value 属性
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<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>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
119
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Ignorenotfoundclasses グローバル オプション
ignorenotfoundclasses オプションは、DashO がクラスパスに存在しないクラスへの参照に遭遇した場
合でも、アプリケーションを処理できるようにします。DashO は、見つからないすべてのクラスを無視できるわけ
ではありません。スーパー クラスやスーパー インターフェイスが見つからない場合は、続行できません。
このオプションは、実行からの情報を収集できるように、DashO が終了することを可能にするための手段として
のみ使用する必要があります。すべてのクラスにアクセスせずに、必要なすべての依存関係を安全に判断す
ることはできません。
例
<global>
<option>ignorenotfoundclasses</option>
</global>
Ignorebrokencalls グローバル オプション
ignorebrokencalls オプションは、DashO が見つけることができないクラスのメソッドへの参照に遭遇した
場合でも、アプリケーションを処理できるようにします。これは、クラスパス内のエラーによって、または最新のも
のでない jar ファイルによって発生する場合があります。DashO がクラスを処理できるとしても、クラスパスと jar
に期待するクラスが含まれていることを確かめるために、それらをチェックしたいと思うでしょう。
例
<global>
<option>ignorebrokencalls</option>
</global>
Force オプション
DashO は、クラスのリフレクションの使用を検出すると、リフレクション コードの場所とターゲットをメモしておき、
その分析を続行します。分析の終わりに、リフレクション レポートを出力して、ビルド処理を中止します。プロ
ジェクト内のすべてのリフレクション問題に対処したら、DashO がビルドを完了できるように、force オプションを
追加することができます。force オプションは、プロジェクト ファイルで指定するか、またはコマンド ラインの -force オプションを介して DashO に渡すことができます。前者をお勧めします。
例
<global>
<option>force</option>
</global>
Makepublic および Nomakepublic グローバル オプション
既定では、DashO はディスクに書き込む前に、公開するすべてのクラス、非公開でないメソッド、および非公開
でないフィールドのアクセス修飾子を変更します。これにはいくつかの影響があります。
120

これは、パッケージのメンバーシップを変更し、既定のメソッドを含んでいるクラスの問題を解決します。

一般に、DashO はプログラムにメソッド呼び出しを組み込まないので、これは危険ではありません。結局の
ところ、コンパイラがコンパイル時にアクセス制限を強制します。

都合よく、パブリック メソッドの動的リンクは、より制限されたアクセス レベルよりも高速です。そもそもパブ
リックには制限がないので、相当するパッケージやクラスのメンバーシップを検証するランタイムは必要あ
りません。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
この動作を止めるには、nomakepublic オプションを使用します。この動作を強制するには、makepublic
オプションを使用します。既定の動作を使用する、つまり、どのように動作するかを DashO に決めさせるには、
どちらのオプションも含めないでください。
メモ
nomakepublic を使用すると、保護された/既定のメソッドでアクセス エラーが発生するかもしれません。つ
まり、指定されたパッケージにあったクラスは現在、名前が変更された新しいパッケージにある可能性があり
ます。しかし、それでもまだ、アクセスの例外を引き起こす元のパッケージからパブリックでないクラスにアクセ
スすることができます。
DashO の既定の動作は、この問題をおおむね回避しており、ほとんどのアプリケーションにとって安全と見ら
れています。
例
<global>
<option>nomakepublic</option>
</global>
Renameforname グローバル オプション
renameforname オプションは、動的に読み込んだクラスの名前を変更できるようにします。DashO がクラス
を読み込むために使用される文字列を明白に判断できない場合には、そのクラスを <entrypoints> セクション
に列挙する必要があります。こうしたあいまいな場合は、fornamedetection オプションが possible の信頼
度で報告するものに対応します。
メモ
コードの中で Java の assert キーワードを使ってアサーションを使用すると、クラスが内省的になります。
renameforname オプションを使用しない限り、DashO はそのクラスの名前を変更不能にします。
例
<global>
<option>renameforname</option>
</global>
グローバル <exclude>
exclude オプションでは、入力クラスの一部として表示されるが、DashO の最終出力に含めてはいけないクラス
またはメソッドを指定できます。グローバル exclude の正規表現に一致するクラスは、処理されず、最終出力の
対象として選択されません。
たとえば、サード パーティ製の jar ファイル内に存在するテストやサンプルを対象から除外することができます。
例
<global>
<exclude classname="com\.thirdparty\.tests\..*"/>
<exclude classname="com\.thirdparty\.sample\..*"/>
</global>
除外されるクラスの名前は、常に正規表現として指定されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
121
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
Pre_7_0_exit_behavior グローバル オプション
pre_7_0_exit_behavior オプションは、リターン コードとしてエラー メッセージの数ではなく 0(ゼロ)が
使用されるようにします。これは、GUI で実行している場合には影響ありません。影響があるのは、obfuscate
および obfuscate-jar Ant タスクを実行しているときや、コマンド ラインから DashO を実行しているときです。
例
<global>
<option>pre_7_0_exit_behavior</option>
</global>
Haltonfirsterror グローバル オプション
haltonfirsterror オプションは、最初のエラー メッセージが発生したときに処理を停止させるようにしま
す。
例
<global>
<option>haltonfirsterror</option>
</global>
Bypassdasho グローバル オプション
bypassdasho オプションは、入力を処理しないように DashO を構成します。入力 jar ファイルとディレクトリは、
直接出力にコピーされるようになります。このオプションは、出力での merge 属性が false に設定されている場
合にのみ使用することができます。
例
<global>
<option>bypassdasho</option>
</global>
122
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<inputpath> セクション
<inputpath> セクションには、DashO が処理するクラスの場所が含まれます。DashO は、ディレクトリ、zip
ファイル、および jar ファイルを処理することができます。
例
<inputpath>
<pathelement location="c:\test\app.jar"/>
<pathelement location="c:\test\classes"/>
</inputpath>
メモ
c:\test\classes は、パッケージ指定のどの部分にもなりません。パッケージが格納されるディレクトリに
なります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
123
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<classpath> セクション
<classpath> セクションには、入力クラスを分析する際に DashO が必要とするかもしれないクラスの場所が
含まれます。これらのクラスは、通常、サード パーティ製のパッケージであるか、または Java ランタイム環境の
一部である jar ファイルです。DashO は、クラスパス内のディレクトリ、zip ファイル、および jar ファイルを処理
することができます。
例
<classpath>
<pathelement location="c:\test\app.jar"/>
<pathelement location="c:\test\classes"/>
</classpath>
メモ
c:\test\classes は、パッケージ指定のどの部分にもなりません。パッケージが格納されるディレクトリに
なります。
Systemclasspath 属性
任意で、<classpath> セクションで指定されたディレクトリと jar ファイルに加え、システム クラスパス4 を
append または prepend することができます。次のオプションは、<classpath> セクションで指定された
ディレクトリと jar ファイルの一覧の末尾に、システム クラスパスを追加します。
例
<classpath systemclasspath="append">
<pathelement location="c:\test\classes"/>
...
</classpath>
Appendrtjar 属性
既定では、DashO は、現在使用している Java のバージョンのランタイム jar ファイルを追加します。別のバー
ジョンを使用する必要がある場合は、この動作を制御できます。
例
<classpath appendrtjar="false">
<pathelement location="c:\Java\jre1.5.0_12\lib\rt.jar"/>
</classpath>
メモ
J2ME または Android API を使用するプロジェクトでは、このオプションを使用する必要があります。このよう
な プ ロ ジ ェ ク ト は 、 こ れ ら 特 定 の 環 境 用 の ラ ン タ イ ム jar フ ァ イ ル 、 た と え ば midpapi10.jar や
Android.jar を必要とします。
4
システム クラスパスは、sun.boot.class.path プロパティと、利用可能な CLASSPATH 環境変数内の
値で構成されています。
124
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<entrypoints> セクション
エントリ ポイントとは、DashO がアプリケーションで使用されているクラスや、メソッド、およびフィールドを判断
するために行う依存関係の分析の開始点です。言い換えれば、これらがアプリケーションのエントリ ポイントで
す。
エントリ ポイントは DashO によって分析され、クラスが機能するにはどのクラス、メソッド、およびフィールドが必
要であるかを判断します。たとえば、エントリ ポイントが呼び出すすべてのメソッド、およびこれらのメソッドが呼
び出す後続のメソッドは、DashO で必要であると判断されます。つまり、DashO に対して特定の Main メソッド
が必要であると通知した場合は、その Main メソッドが呼び出すすべてのメソッドも必要であるということです。
<quickjar> エントリ ポイント
Quick Jar エントリ ポイントは、JAR ファイルにカプセル化されたプログラムや API ライブラリを難読化するため
に使用されることがあります。
こ の オ プ シ ョ ン を ア プ リ ケ ー シ ョ ン で 機 能 さ せ る に は 、 JAR フ ァ イ ル の マ ニ フ ェ ス ト に Main-Class:
classname 形式の行が含まれている必要があります。ここで、classname は、アプリケーションの開始点と
なる public static void main(String[] args) メソッドを持つクラスを識別します。
DashO は、静的依存関係の分析を行うために、マニフェストでこの情報を使用します。マニフェストに MainClass 情報がない場合は、DashO は jar ファイルをライブラリとして処理します。DashO は自動的に、jar ファ
イル内のすべてのパブリック メソッドをエントリ ポイントとして使用します。
入力 jar には、Main-Class エントリを持つマニフェスト ファイルが含まれているものと仮定します。
例
Main-Class: test.MyApplication
この場合は、クラス test.MyApplication の main メソッドがエントリ ポイントと見なされます。

複数の Quick Jar エントリ ポイントを指定することができます。ただし、Quick Jar エントリ ポイントを他の種
類のエントリ ポイントと混在させることはできません。

DashO の不要コードの除去、つまり除去機能は、Quick Jar モードでは停止されており、<removal> セク
ションに入れた値は無視されます。

エントリ ポイントとして複数の Quick Jar を指定した場合、DashO は、単一の出力 jar ファイルまたはディレ
クトリにのみ難読化されたクラスを書き込みます。

入力 jar ファイル内の非クラス ファイルはすべて、自動的に出力に含められます。

制御フロー、最適化、および文字列の暗号化の対象選択と対象除外は無視されます。
例
<entrypoints>
<quickjar path="c:\myapp.jar"/>
</classpath>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
125
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<method> および <field> エントリ ポイント
エントリ ポイント メソッドは、アプリケーションがどこから開始するのかを示しています。もしコードを見ていて、
誰かにそのコードがどんな処理をするものかを尋ねられたら、まず最初にどこに注目するでしょうか?おそらく、
そのコードに main メソッドが含まれているかどうかをチェックするでしょう。その main は、そのアプリケーション
におけるエントリー ポイント メソッドです。一般に、指定されたクラスの main を使用します。
例
<entrypoints>
<classes name="test.MyApplication">
<method name="main" signature="java.lang.String[]"/>
</classes>
</entrypoints>
メソッドの署名を指定するときは、上記の例のように、String[] ではなく java.lang.String[] を用い
て、完全修飾のクラス名を使用します。複数のパラメーターは、スペースを入れずにカンマで区切る必要があ
ります。また、メソッド名として特別な <init> 表記法を使用すると、コンストラクターをエントリ ポイントとして指
定することができます。プロジェクト ファイルは XML なので、忘れずに &lt; と &gt; を使用してください。
クラス、メンバー、およびメソッドの署名の名前は、リテラル、パターン、あるいは正規表現として指定することが
できます。詳細については、名前:リテラル、パターン、および正規表現を参照してください。
Rename 属性
エントリ ポイントは、いくつかの外部メカニズムによって参照されているため、既定では名前を変更できません。
場合によっては、エントリ ポイントの名前を変更することができます。たとえば、DashO は、名前が変更されたク
ラスを使って jar ファイルのマニフェストの Main-Class 属性を更新します。この場合、クラスの名前は変更
できますが、main メソッドの名前は変更できません。<classes>、<method>、および <field> タグはす
べて、項目の名前変更機能を制御する rename 属性を持っています。
例
<entrypoints>
<classes name="test.OtherApplication" rename="true">
<method name="main" signature="java.lang.String[]"/>
</classes>
</entrypoints>
126
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<publics> エントリ ポイント
<classes> エントリ ポイントと同様、name 属性にはリテラル、パターン、または正規表現を指定できます。と
きには、クラスがアプリケーションへのインターフェイスである場合があります。そのクラスは、アプリケーション
へのエントリ ポイントである多くのメソッドを含んでいるかもしれません。指定したクラスのすべてのパブリック メ
ソッドをエントリ ポイントとして指定したい場合は、それぞれを個別に指定するか、あるいは <publics> タグ
を使用することができます。
例
<entrypoints>
<publics name="test.MyApplet"/>
</entrypoints>
<publics> で指定されたクラスやメンバーも、rename-class および rename-members 属性を使用し
て、名前を変更可能にすることができます。どちらの属性も省略可能で、既定値は false です。
例
<entrypoints>
<publics name="com.yoyodyne.**Bean" rename-class="true"
rename-members="false"/>
</entrypoints>
<library> エントリ ポイント
API ライブラリでは、library オプションを使用することにより、ディレクトリまたは jar ファイル内のすべてのクラス
のすべてのパブリック メソッドおよび保護されたメソッドを指定できます。
例
<entrypoints>
<library public="off">
<dir path="myAPIDirectory"/>
</library>
</entrypoints>
メモ
ディレクトリまたは jar ファイルをライブラリとして追加する場合は、それを <classpath> に追加する必要はあり
ません。DashO はこれを自動的に行います。
<entrypoints>
<library public="off">
<jar path="myAPI.jar"/>
</library>
</entrypoints>
public の値は on または off になります。省略した場合は、on と見なされます。
myAPIDirectory 下にあるすべてのディレクトリの、再帰下降によって見つかったすべてのクラスの全パブ
リック メソッドは、トリガーとして使用されます。myAPIDirectory は、パッケージ指定の一部であってはなり
ません。それは、パッケージが存在するディレクトリになるということです。つまり、クラスパスに置くものと同じ
ディレクトリになります。jar ファイルを使用すると簡単です。jar で見つかったすべてのクラスが使用されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
127
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
パブリック メソッドのみをエントリ ポイントとして使用したい場合は、library タグの public を on に設定し
て使用します。
<classes> エントリ ポイント
含まれるメソッドをあれこれ推測せずにクラスを対象として選択することも可能です。一部のアプリケーションを
正確にパッケージ化するために、ここに手動でクラスを指定することは極めて重要です。アプリケーションで
Class.forName() コンストラクトを使用している場合、DashO は必要とされる可能性のあるすべてのクラス
を判断することができません。このような場合、DashO は forName(s) の場所を知らせて、終了します。その
後、手動でここにそれらのクラスを入力し、force オプションを設定して DashO を再実行する必要があります。
ここで指定されたすべてのクラスは、メソッドおよびフィールドの除去に利用できます。
例
<entrypoints>
<classes name="com.yoyodyne.Application"/>
</entrypoints>
これにより、DashO は com.yoyodyne.Application を読み込むようになりますが、どのメソッド、フィール
ドもエントリ ポイントとして使用しなくなります。そのクラスがシステム メソッドやユーザーが作成した他のメソッド
をオーバーライドする場合は、クラスのメソッドも対象として選択されます。この方法で入力されたクラスは、グ
ローバル renameforname オプションがオンになっている場合には、名前を変更可能になります。
<unconditional> エントリ ポイント
ときには、他のクラスから明示的に参照されていないクラスであっても、対象として選択する必要が生じることが
あります。これは無条件のエントリ ポイントを介して行われます。この場合は、クラスのすべてンのメンバーがエ
ントリ ポイントとして使用され、出力に現れます。他のエントリ ポイントと同様、name 属性にはリテラル、パター
ン、または正規表現を指定できます。既定で、クラスとメンバーの名前は変更不能ですが、rename-class
および rename-members 属性を使用することにより、名前を変更可能にすることができます。
128
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
特殊なアプリケーションのエントリ ポイント
DashO には、いくつかの異なる型の Java アプリケーション構成が組み込まれています。便宜上、DashO は、こ
れらのアプリケーションのうちの一部について、エントリ ポイントを指定するための特別な構文を定義していま
す。名前は、リテラル、パターン、または正規表現として指定できます。名前:リテラル、パターン、および正規
表現を参照してください。既定で、クラスとメンバーの名前は変更不能です。すべての種類が renameclass 属性を使用し、一部の種類が rename-members 属性をサポートしています。
<applets>
アプレットの init() および paint() メソッドは特に、自動的に対象として選択されます。アプレットがオー
バーライドするすべてのメソッドは、自動的にエントリ ポイントになります。しかし、どのようなアプレット クラスが
エントリ ポイント クラスであるかについて、完全な形式の指示を指定する必要があります。
例
<entrypoints>
<applet name="test.MyApplet"/>
</entrypoints>
<applets> タグでは、rename-class 属性(既定で false)は使用しますが、rename-members 属性
は使用しません。つまり、エントリ ポイント メンバーはインターフェイスによって定義されており、名前を変更で
きません。クラス内の他のメソッドは名前を変更できます。
<servlets>
サーブレットのエントリ ポイントは次のように指定することができます。
例
<entrypoints>
<servlet name="test.MyServlet"/>
</entrypoints>
<servlets> タグでは、rename-class 属性(既定で false)は使用しますが、rename-members 属性
は使用しません。つまり、エントリ ポイント メンバーは基本クラスによって定義されており、名前を変更できませ
ん。クラス内の他のメソッドは名前を変更できます。
<ejb> Enterprise Java Beans
Enterprise Java Beans は、特定の EJB に関連するクラスを指定するための独自の表記法を持っています。
例
<entrypoints>
<ejb name="MyEntityBean"/>
<ejb name="MyRemoteInterface"/>
<ejb name="MyHomeInterface"/>
<ejb name="MySessionBean"/>
<ejb name="MyPrimaryKey"/>
</entrypoints>
<ejb> タグは、rename-class 属性(既定で false)と rename-members 属性(既定で false)の両方
を使用します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
129
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
メモ
もう 1 つの方法として、EJB ではそれらのエントリ ポイントを指定するために <publics> 表記を使用するこ
とができます。
<midlet> と <iappli>
DashO は、Mobile Information Device Profile(MIDP)仕様(MIDlet)で書かれたアプリケーションの明示的な
サ ポ ー ト を 提 供 し て い ま す 。 midlet ク ラ ス は 、 依 存 関 係 の 任 意 の レ ベ ル で
javax.microedition.midlet.Midlet のサブクラスにすることができます。
例
<entrypoints>
<midlet name="test.MyMidlet"/>
</entrypoints>
同様に、DashO は、NTT ドコモの i アプリ フレームワーク用に書かれたアプリケーションも明示的にサポートし
ています。iappli クラスは、依存関係の任意のレベルで com.nttdocomo.ui.IApplication のサブクラ
スにすることができます。
例
<entrypoints>
<iappli name="test.MyIappli"/>
</entrypoints>
タグは両方とも、rename-class 属性(既定で false)は使用しますが、rename-members 属性は使用し
ません。エントリ ポイント メンバーは基本クラスによって定義されており、名前を変更できません。クラス内の他
のメソッドは名前を変更できます。
MIDlet プロジェクトの構成
Java ランタイム Jar を含めないでください。Appendrtjar 属性セクションを参照してください。代わりに、環境変
数またはプロパティが Oracle の Wireless Toolkit のインストールを指すように設定します。
メモ
WTK_HOME セットアップと呼ばれる環境変数がある場合は、それを直接使用するか、またはその設定を使
用する DashO プロパティを作成することができます。
例
<propertylist>
<!-- To force the environment variable to be set -->
<property name="wtk.home" value="${WTK_HOME:?WTK_HOME not defined}"/>
<!-- To use a default if not set -->
<property name="wtk.home" value="${WTK_HOME:-C:\WTK2.5.1}"/>
</propertylist>
130
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
クラスパスに cldcapi と midpapi の jar を追加します。これらの jar ファイルは、Oracle の Wireless Toolkit
の一部です。
例
<classpath>
<jar path="${wtk.home}/lib/cldcapi10.jar"/>
<jar path="${wtk.home}/lib/midpapi10.jar"/>
</classpath>
プロジェクトの事前検証を設定します。
例
<preverifier run="true">
${wtk.home}/bin/preverify.exe
</preverifier>
<android>
DashO は 、 android ク ラ ス の サ ポ ー ト を 提 供 し て い ま す 。 ク ラ ス は 、 android.app.Application 、
android.app.Activity 、android.app.Service 、android.content.BroadcastReceiver 、
または android.content.ContentProvider のサブクラスにすることができます。エントリ ポイントは、
AndroidManifest.xml に挙げられているクラスです。名前の変更は、アプリケーションの外部で参照されないク
ラスについてのみ行われるべきです。
例
<entrypoints>
<android name="com.example.myApp.MyActivity"/>
<android name="com.example.myApp.MyIntActivity" rename-class="true"/>
</entrypoints>
<android> タグは、rename-class 属性(既定で false)と rename-members 属性(既定で true)の
両方を使用します。
<springbean>
DashO は Spring Beans をサポートしています。これらは、beans.xml ファイルで参照されるクラスになります。他
の特殊クラスには存在しない、<springbean> でサポートされる追加属性があります。

entrypoints – 以下のような属性の bean 定義で使用される、メソッド名のカンマ区切りの一覧。
o
init-method – bean を作成した後に Spring フレームワークによって呼び出されるメソッド。
o
destroy-method – bean を破棄する前に Spring フレームワークによって呼び出されるメソッド。
o
factory-method – bean をインスタンス化するときに Spring フレームワークによって呼び出される
メソッド。

renamePropertyMethods – True/False(既定で false):プロパティ メソッドの名前を変更します:
get*()、set*(*)、および is*()(および、これらのメソッドで表されるフィールド)。

renameEntryPoints – True/False(既定で false):entrypoints 下に挙げられているエントリ ポ
イント メソッドの名前を変更します。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
131
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<entrypoints>
<springbean name="com.example.spring.beans.MyBean"
entrypoints="initBean,destroyBean,createBeanOne,createBeanTwo" renameclass="false" renamePropertyMethods="true" renameEntryPoints="true"/>
</entrypoints>
<springbean> タグは、rename-class 属性(既定で true)と rename-members 属性(既定で true)
の両方を使用します。これら bean のパブリック コンストラクターはすべて保持されます。
<report> セクション
レポート ファイルが指定されている場合は、DashO は除去されたすべてのメソッドとフィールドを示すレポート
を作成します。またレポートには、全体のメソッド、フィールド、および定数プール エントリの除去を含む、プロ
ジェクト全体の総数がまとめられています。
例
<report path="c:\output\dasho-report.txt"/>
Quick Jar モードには除去がないため、レポート ファイルの生成もありません。警告とエラーはコンソールに渡
されます。
レポートからの抜粋は次のようになります。
例
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 が判断したものです。
132
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
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> セクション
このオプションは、DashO で出力をディレクトリまたは jar ファイルへ書き込むようにするかどうかを示します。出
力の形式は、名前の変更オプションに依存します。また、複数の結果を 1 つの出力にまとめるか、入力と同じ
パッケージを保持するかどうかを制御します。名前の変更を指定しない場合は、現在存在するディレクトリ/パッ
ケージ構造は指定されたディレクトリに再作成されるので、出力先がソースと同じにならないようにしてください。
名前を変更する場合は、パッケージの概念を削除することができ、すべてのクラスが指定されたディレクトリに
置かれます。
例
<output merge="true">
<dir path="c:\output\"/>
</output>
任意で、jar ファイルの出力でマニフェストを指定することができます。DashO は、出力 jar ファイルにマニフェ
スト ファイルをコピーします。マニフェストの jar ファイルを指定した場合は、それがマニフェストのソースとして
使用されます。
例
<output merge="true">
<jar path="c:\output\dashoed.jar" manifest="c:\misc\Manifest.mf"/>
</output>
メモ
path と manifest の両方の属性は、プロパティをサポートしています。
Jar 属性
DashO が <jar> タグを使用して 1 つ以上の jar ファイルを作成する場合、あるいは merge=false である場合に
は、jar ファイルの作成をカスタマイズする属性を指定することができます。

compress="boolean" – jar ファイル内のエントリを圧縮するかどうかを決定します。既定値は true
です。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
133
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド

level="0-9" – jar ファイルのエントリの圧縮レベル。既定値は 6 です。値が大きいほど、より高い圧縮
率を与えます。

filesonly="boolean" – jar に含めるエントリを、ファイルのみとするか、フィールドとディレクトリの両
方とするかどうかを決定します。既定値は true です。

includenonclassjars="boolean" – 残りのクラスが何も含まれていない jar ファイルを出力に含
める必要があるかどうかを決定します。既定値は false です。
例
<output merge="false" compress="true" level="4" filesonly="false">
<dir path="c:\output\"/>
</output>
このサンプルでは、ファイルとそのディレクトリ構造の両方のエントリを含む jar ファイルが、中程度の圧縮レベ
ルで生成されます。
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 ファイル
とディレクトリ間の相対パスを保持しようとします。
メモ
merge="false" オプションには <dir path="..."/> タグが必須です。<jar path="..."/> タグ
が指定されている場合は、merge="false" の設定は無視されます。Quick Jar モードでは、必ずマージが
実行されます。
Autocopy 属性
merge="false" が 指 定 さ れ て い る 場 合 は 、 autocopy 属 性 も 指 定 す る こ と が で き ま す 。
autocopy="true" が指定されている場合、入力 jar ファイル内の非クラス ファイルは、自動的にそれぞれ
の出力にコピーされます。入力ディレクトリに現れる非クラス ファイルがコピーされることはありません。
134
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<output merge="false" 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>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
135
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<removal> セクション
removal オプションでは、クラス、メソッド、およびフィールドの除去や、メタデータの除去に使用する精度のレ
ベルを指定できます。クラスとメンバーの除去については、タグに 2 つの属性 classes と members がありま
す。これらのオプションは次のとおりです。

none – 除去しない

unused-non-public – 使用されていない項目で、パブリックでないものだけを除去する

unused – 使用されていないすべての項目を除去する
属性が 2 つとも省略されているか、<removal> が指定されていない場合には、除去は行われません。
本当のアプリケーション(他のクラスからサブクラスに指定されたり、呼び出されたりするものではない)をパッ
ケージ化している場合は、unused オプションが最良の選択です。
使用するサード パーティ製の API ライブラリに付属する使用許諾契約書に従って、アプリケーションが必要と
するすべてのクラスを DashO に組み込めるようにすることが最良の方法です。そのように、結果として生じる出
力は、アプリケーションが具体的にそれをどのように使用するかに合わせ、アプリケーションが必要とするすべ
てのクラスを含む 1 つの jar ファイルまたはディレクトリになります。
removal は <excludelist> 要素をサポートしています。この要素には、除去されないクラス、メソッド、およ
び フ ィ ー ル ド を 選 択 す る 規 則 を 含 め る こ と が で き ま す 。 こ の 要 素 に つ い て は 、 <includelist> お よ び
<excludelist> 規則セクションで説明します。
例
<removal classes="unused-non-public" members="unused"/>
メモ
除去は、Quick Jar モードではオフになっています。Quick Jar モードは、removal セクションで設定されたオ
プションをすべて無視します。
<debug> セクション
このセクションは、コンパイラによってクラス ファイルに挿入されたデバッグ情報を削除するよう DashO に指示
します。type 属性は、削除する情報の種類を指定するために使用されます。次の種類を削除することができ
ます。

SourceFile – クラスがコンパイルされたソース ファイルの名前。

SourceDirectory – クラスがコンパイルされたソース ファイルの場所。

SourceDebugExtension – 拡張デバッグ情報として解釈されるツール特有の文字列。

LineNumberTable – 元のソース ファイル内の特定の行番号に割り当てられるバイト コード。デバッ
ガーとスタック トレースによって使用されます。

LocalVariables – メソッドの実行中にローカル変数の名前と型を判断するために、デバッガーによっ
て使用されます。

LocalVariableTypes – ジェネリックを使用するローカル変数の署名。
複数の項目はスペースで区切られます。
<debug> セクションが存在しない場合は、すべてのデバッグ情報が保持されます。セクションはあっても
type 属性が存在しない場合は、すべてのデバッグ情報が削除されます。
136
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<debug/>
<debug types="SourceDirectory SourceDebugExtension" />
メモ
制御フローの難読化の変換処理では、<debug> セクションでローカル変数情報の削除を要求していない場
合でも、それらの削除を必要とします。
<attributes> セクション
コンパイラは、クラス ファイル内の属性に追加のメタデータを格納します。DashO では、これらの属性の処分
(ディスポジション)を個別に決定することができます。タグの type 属性は、削除する属性の種類を指定する
ために使用されます。次の種類を削除することができます。

Exceptions – メソッドがスローする、チェックされた例外を示します。

Signature – ジェネリック型、ジェネリックを含むメソッド宣言、およびパラメーター化された型を示します。

Deprecated – クラス、インターフェイス、メソッド、またはフィールドが置き換えられていることを示します。

Synthetic – ソース コードに現れないクラス メンバーを示します。

EnclosingMethod – ローカル クラスまたは匿名クラスを囲む方法を示します。

RuntimeVisibleAnnotations – クラス、メソッド、またはフィールドの、リフレクションで見ることがで
きるアノテーションを保持します。

RuntimeInvisibleAnnotations – クラス、メソッド、またはフィールドの、リフレクションで見ることが
できないアノテーションを保持します。

RuntimeVisibleParameterAnnotations – メソッドに対するパラメーターの、リフレクションで見る
ことができるアノテーションを保持します。

RuntimeInvisibleParameterAnnotations – メソッドに対するパラメーターの、リフレクションで
見ることができないアノテーションを保持します。

AnnotationDefault – アノテーション要素の既定値。

InnerClasses – 内部クラスと外部クラス間の関係を示します。

Unknown – その他すべての属性の種類。
複数の項目はスペースで区切られます。
<attributes> セクションが存在しない場合は、すべての属性が保持されます。セクションはあっても type
属 性 が 存 在 し な い 場 合 は 、 次 の 属 性 が 削 除 さ れ ま す : Deprecated 、 Synthetic 、
RuntimeInvisibleAnnotations、RuntimeInvisibleParameterAnnotations。
例
<attributes/>
<attributes types="Deprecated Synthetic" />
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
137
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<methodCallRemoval> セクション
DashO では、戻り値の型が void であるメソッドの呼び出しを除去することができます。これにより、製品コード
からログやコンソール出力の呼び出しを簡単に除去できるようになります。methodCallRemoval 要素の属性は
ありません。すべての構成は、<method> サブ要素に含まれています。
<method> セクション
このセクションは、出力で呼び出してはいけないメソッドを定義します。
このタグの属性は、クラス名、メソッド名、および署名によって呼び出さないメソッドを識別します。

className – この string 属性は、メソッドを含んでいるクラスの名前を指定します。

methodName – この string 属性は、メソッドの名前を指定します。

signature – この string 属性は、メソッドのパラメーターを指定します。
className 属性
className 文字列属性には、メソッドを含んでいるパッケージとクラスの完全な名前が含まれています。このク
ラスのメソッドに対する直接の呼び出しのみが除去されます。サブクラスにある同じメソッド名や署名に対する
呼び出しは除去されません。「**」のクラス名を指定することで、DashO に対し、どのクラスがメソッドを含んでい
るかに関係なく、メソッドおよび署名のすべての呼び出しを除去するように指示できます。「**」を使用する場
合は、それらのメソッドの名前が変更されないように、名前の変更の対象除外規則を追加する必要があります。
methodName 属性
methodName 文字列属性には、メソッドの名前が含まれます。初期化メソッドまたはコンストラクター メソッドは
指定できず、また void を返すメソッドでなければなりません。
signature 属性
signature 文字列属性には、メソッドのパラメーターの型が含まれます。パラメーターは、順序正しく、カンマで
区切って指定する必要があります。型名の後に次元を表す [] を追加することにより、配列パラメーターが指定
されます。オブジェクト型のパラメーターを入力する場合は、完全なパスを使用する必要があります。また、大
文字と小文字やスペルは正確である必要があります。"double" を "doubel" と間違って入力すると、そのパラ
メーターはプリミティブの double 型ではなく、"doubel" という名前の Object として扱われてしまいます。
例
<methodCallRemoval>
<method className="**" methodName="method1"
signature="java.lang.String"/>
<method className="com.example.methodCallRemoval.SubSubClassOne"
methodName="method2" signature="java.lang.String, int, double,
float[][]"/>
</methodCallRemoval>
138
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<renaming> セクション
DashO は、クラス、メソッド、およびフィールドの名前を短い意味のない名前に変更することができます。これは、
クラスのサイズの縮小にとって、また難読化技法として重要です。後述のセクションを使用すると、名前の変更
対象から特定のクラスやメンバーを除外することができます。
メモ
DashO の名前の変更アルゴリズムとその影響については、高度なトピックを参照してください。
次のタグは、option 属性とアノテーションの名前の変更を使用して、名前の変更のグローバル制御を可能にし
ます。有効な値は on と off です。
例
<renaming option="on" renameAnnotations="on"/>
<class-options> セクション
このタグの属性は、クラスの名前の変更を制御します。

rename – この boolean オプションは、クラスの名前の変更をオンまたはオフにします。false の場合
は、クラスは元の名前を保持します。

keeppackages – この boolean オプションは、元のパッケージの名前と階層を保持したまま、クラス自
体の名前を変更できるようにします。

alphabet – 新しいクラス名を作成するために使用される文字を定義する文字列。

minlength – 新しいクラス名の最小の長さ。

randomize – クラスの新しい名前は、順次的またはランダムに割り当てることができます。このオプション
が true の場合、識別子はランダムに割り当てられます。

prefix – この属性は、名前が変更されたすべてのクラスに付加されるプレフィックスを指定します。プレ
フィックスにピリオドを含めると、クラスは効果的に新しいパッケージに配置されます。
prefix 属性
プレフィックスは、名前が変更されたすべてのクラスに付加されます。ピリオドを含む prefix を定義すること
により、名前が変更されたクラスをカスタム パッケージに入れることができます。
例
<renaming option="on"/>
<class-options prefix="pkg.X_"/>
</renaming>
次の表は、プレフィックスを使った名前の変更の可能性を示しています。
プレフィックス
変更後の名前
C
pkg.
pkg.X_
Ca
pkg.a
pkg.X_a
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
139
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
keeppackage 属性
このオプションが true の場合、クラスの名前は変更されますが、その名前のパッケージの部分は変更されませ
ん。
例
<renaming option="on"/>
<class-options keeppackages="true"/>
</renaming>
以下に、このような名前の変更の例を示します。
元の名前
変更後の名前
yoyodyne.application.Main
yoyodyne.application.LoadData
yoyodyne.tools.BinaryTree
yoyodyne.tools.LinkedList
yoyodyne.application.a
yoyodyne.application.b
yoyodyne.tools.c
yoyodyne.tools.d
prefix と併せて使用した場合、元のパッケージ名は、prefix によって加えられる部分より前に現れます。
例
<renaming option="on"/>
<class-options keeppackages="true" prefix="x_"/>
</renaming>
これは次のような結果になります。
元の名前
変更後の名前
yoyodyne.application.Main
yoyodyne.application.LoadData
yoyodyne.tools.BinaryTree
yoyodyne.tools.LinkedList
yoyodyne.application.x_a
yoyodyne.application.x_b
yoyodyne.tools.sub.x_c
yoyodyne.tools.sub.x_d
alphabet 属性
省略可能な alphabet 属性では、新しいクラス名を作成するために使用される文字を定義します。省略すると、
既定の文字集合が使用されます。文字集合を定義する際は、次の制限が適用されます。
140

文字集合の最小の長さは 2 文字です。大きなプロジェクトに対しては、3 文字以上が推奨されます。

文字集合の初めの文字は、Java 識別子の開始文字として有効でなければなりません。少なくとも 1 つは
開始文字がある必要があります。

文字集合の残りの文字は、Java 識別子で有効な文字でなければなりません。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<member-options> セクション
このセクションは、メソッドとフィールドの名前の変更を制御します。

keeppublics – true に設定すると、すべてのパブリック メソッドおよびフィールドは、元の名前を保持し
ます。<entrypoints> セクションの library オプションでは、すべてのパブリック メソッドを、本質的に元
の名前を保持するエントリ ポイントとして扱います。このオプションを指定すると冗長になります。

alphabet – 新しいメンバー名を作成するために使用される文字を定義する文字列。使い方は、
<class-options> タグの alphabet 属性の場合と同じです。

minlength – 新しいメンバー名の最小の長さ。

randomize – メンバーの新しい名前は、順次的またはランダムに割り当てることができます。このオプ
ションが true の場合、識別子はランダムに割り当てられます。
<renaming> の対象除外リスト
このセクションは、入力クラス ファイルの名前変更を動的に微調整する方法を提供します。このセクションには、
実行時に適用される "対象除外規則" のリストを含めることができます。規則で特定のクラス、メソッド、または
フィールドを選択した場合、その項目の名前は変更されません。
メモ
これらの規則は、エントリ ポイントによって定義される名前の変更の制限と併せて適用されます。
各規則は論理的に OR で結合されます。つまり、1 つでも規則にマッチした項目の名前は変更されません。
<excludelist> は、クラス、メソッド、およびフィールドによる名前の除外をサポートしています。
例
<renaming option="on">
<excludelist>
<classes name="samples.SimpleApp" excludeclass="true"/>
</excludelist>
</renaming>
<mapreport> セクション
DashO は、実行したすべての名前の変更のレポートだけでなく、名前が変更された結果に関する統計情報も
生成することができます。これは、入れ子になった <mapreport> タグを使用して作成されます。
例
<renaming option="on">
<mapping>
<mapreport path="c:\workproject-mapreport.txt"/>
</mapping>
</renaming>
メモ
path 属性はプロパティをサポートします。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
141
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
リストの例は次のとおりです。
例
one.A (b)
========================================================================
a
pub1(int)
b
def1(int)
c
pub2(int)
two.B (c)
========================================================================
a
pub1(int)
b
pub2(int)
c
def1(int)
クラスとメソッドの新しい名前が示されています。名前を変更した後は、バグの追跡が困難になります。特に、メ
ソッドのオーバーロードが非常に高い確率で発生するので、割り当てファイルが不可欠になります。また、割り
当てファイルは、オーバーロード誘導の結果に関する統計を提供します。
例
Number of
Renamed
Renamed
Renamed
Renamed
Renamed
Renamed
Renamed
Renamed
Renamed
Methods : 7095
to ’a’ : 2031 (28.6%)
to ’b’ : 786 (11.0%)
to ’c’ : 484 (6.8%)
to ’d’ : 327 (4.6%)
to ’e’ : 230 (3.2%)
to ’f’ : 169 (2.4%)
to ’g’ : 131 (1.8%)
to ’h’ : 120 (1.7%)
to ’i’ : 106 (1.5%)
これらの統計は、それぞれ与えられた名前に変更されたメソッドの総数を表しています。
<mapoutput> セクション
<mapoutput> ファイル オプションを指定することで、DashO の名前の変更機能に対し、名前の変更がどの
ように行われたかを追跡記録するよう指示できます。その結果、ユーザーは名前の変更状況をすぐに調査で
きるほか、今後 DashO を実行する際に入力として使用することができます。このオプションで作成されるファイ
ルは、増分名前変更や難読化されたスタック トレースのデコードを実行する際の、入力割り当てファイルとして
使用されます。
このファイルを不注意で失ってしまうと、将来のアプリケーションの増分更新の機会を失う可能性があります。
そのため、このファイルを適切にバックアップしておくことが非常に重要になります。このような理由から、
DashO は既存のファイルが検出された場合には、自動的にこのファイルを上書きしないようになっています。
属性 overwrite="true" は、既存ファイルの上書きを可能にするよう DashO に指示します。
メモ
overwrite 属性は省略可能で、省略すると、既定値の false になります。
142
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<renaming option="on">
<mapping>
<mapoutput path="c:\work\project.map" 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>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
143
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<optimization> セクション
optimization セクションでは、項目を対象として選択したり、対象から除外したりするための詳細な規則など、
バイト コードの最適化に固有のオプションを指定できます。option 属性が off に設定されている場合は、
セクションの残りの部分の内容に関係なく、DashO は最適化をまったく行いません。
例
<optimization option="on"/>
最 適 化 を 行 う 場 所 を 微 調 整 す る た め に 、 <optimization> セ ク シ ョ ン に <includelist> と
<excludelist> の両方を含めて、クラスとメソッドを選択する規則を含むことができます。これらについては、
<includelist> および <excludelist> 規則セクションで説明します。
例
<optimization option="on">
<includelist>
<classes name="samples.**"/>
</includelist>
<excludelist>
<classes name="samples.SimpleApp"/>
</excludelist>
</optimization>
メモ
Quick Jar モードは、<optimization> セクション内のすべての対象選択および対象除外を無視します。
<controlflow> セクション
controlflow セクションでは、ユーザーは項目を対象として選択したり、対象から除外したりするための詳細な
規則など、制御フローの難読化に固有のオプションを指定できます。option 属性が off に設定されている
場合は、セクションの残りの部分の内容に関係なく、DashO は制御フローの難読化をまったく行いません。
tryCatch 属性が設定されていない、または on に設定されている場合は、逆コンパイラをさらに混乱させる
ために追加の例外ハンドラーがコードに追加されます。catchHandlers 属性は、メソッドに追加する例外ハ
ンドラーの最大数を決定します。
例
<controlflow option="on" tryCatch="on" catchHandlers="1" />
制御フローの難読化は Java コードの保護レベルを上げますが、ときどきこの変換処理は強力に作用して、パ
フォ ー マン ス に影 響 を及 ぼ すこ とが あり ま す 。制 御フ ロー の難 読化 を 行う 場所 を 微調 整す る ため に、
<controlflow> タグに <includelist> と <excludelist> の両方を含めて、クラスとメソッドを選択
する規則を含むことができます。これらについては、<includelist> および <excludelist> 規則セクションで説明
します。
144
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<controlflow option="on">
<excludelist>
<classes name="SimpleApp"/>
</excludelist>
</controlflow>
メモ
Quick Jar モードは、<controlflow> セクション内のすべての対象選択および対象除外を無視します。
<stringencrypt> セクション
stringencrypt セクションでは、ユーザーは項目を対象として選択したり、対象から除外したりするための詳細な
規則など、文字列の暗号化に固有のオプションを指定できます。option 属性が off に設定されている場
合は、セクションの残りの部分の内容に関係なく、DashO は文字列の暗号化をまったく行いません。
例
<stringencrypt option="on"/>
文字列の暗号化は、単純な文字列検索によってプログラムの重要な部分を見つけることをもっと困難にするこ
とで、コードの調査を妨害します。しかし、実行時に文字列を復号することは、パフォーマンスにいくらか負荷
を か け ま す 。 文 字 列 が 暗 号 化 さ れ る 場 所 を 微 調 整 す る た め に 、 <stringencrypt> タ グ に
<includelist> と <excludelist> の両方を含めて、クラスとメソッドを選択する規則を含むことができま
す。これらについては、<includelist> および <excludelist> 規則セクションで説明します。このセクションには、
<seInput> および <seOutput> を含むこともできます。これらについては、<seInput> および <seOutput>
セクションで説明します。
例
<stringencrypt option="on">
<includelist>
<classes name="com.yoyodyne.**"/>
</includelist>
<excludelist>
<classes name="com.yoyodyne.ui.**"/>
</excludelist>
</stringencrypt>
メモ
Quick Jar モードは、<stringencrypt> セクション内のすべての対象選択および対象除外を無視します。
level 属性と implementations 属性
level および implementations 属性を使用すると、文字列の暗号化プロセスの複雑さを高めることがで
きます。level の値は、単純だけれど高速な復号を用いる 1 から、アプリケーションの一部の速度を落とす可
能性がある複雑な実装の 10 までです。level の既定値は 1 です。値が増えるに従って、文字列値の逆コ
ンパイルやリバース エンジニアリングの複雑さを高めるために、入り交じった表現法が用いられます。また、よ
り大きな値にすると、復号メソッドの実装にランダム度が導入されて、バイト コード パターンによって文字列値
を見つけることがさらに困難になります。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
145
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
implementations 属性は、一意の復号メソッドをいくつ生成して、入力内のクラスに追加するかを決定しま
す。メソッドの名前と署名はランダムに選択されます。復号メソッドは、アプリケーション サイズの増加を最小限
に抑えるために、最も短い名前が付けられたクラスに置かれます。名前の長さが同じクラスについては、より多
くのメソッドを含んでいるか、より複雑さを備えたクラスが最初に選択されます。最大 10 個まで実装を追加でき
ます。
例
<stringencrypt option="on" level="3" implementations="4">
<decrypter> セクション
このセクションでは、実行時に文字列を復号するために使用されるメソッドを DashO がどこに置くかを制御でき
ます。このタグは、<includelist> および <excludelist> 規則で使用される <classes> タグに似ています。これ
には、復号メソッドを置くことができるクラスを選択する 3 つの属性があります。

name – メソッドを置くことができるクラスの名前。これは、クラスの名前、クラスを選択するパターン、または
正規表現を指定できます。

regex – name 属性の解釈を決定します。true の場合、name は正規表現です。

modifiers – メソッドを置くことができるクラスを選択するために使用される修飾子。詳細については、
Modifiers 属性を参照してください。

excludedPackages – decrypter クラスに置くことから除外されるパッケージのカンマ区切りの一覧。既
定のパッケージは、java、javax、および android です。
<decrypter> セクションを省略すると、DashO は自動的に場所を決定します。
例
<decrypter modifiers="static class" name="com.yoyodyne.**"/>
<seInput> セクション
このセクションは、前回の実行における文字列の decrypter が記述されているファイルを保持します。これは、
増分難読化時に使用されます。
例
<seInput path="c:\example_project\prev_project-se.map />
<seOutput> セクション
このセクションは、現在の実行における文字列の decrypter に関する情報を格納するためのファイルを保持し
ます。このファイルが存在する場合は、上書きされます。
例
<seOutput path="c:\example_project\project-se.map />
146
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<customEncryption> セクション
このセクションは、カスタムの暗号化メソッドおよび復号メソッドの使用に関する情報を保持します。

useCustomEncryption – カスタム暗号化を使用する必要があるかどうかを設定します(true/false)。

encryptionJar – カスタム暗号化のクラスおよびメソッドを含んでいる jar ファイルへのパス。

encryptionClass – カスタム暗号化メソッドを実装するクラスの完全な名前。

encryptionMethod – 文字列を暗号化するために使用されるメソッドの名前。

decryptionClass – カスタム復号メソッドを実装するクラスの完全な名前。

decryptionMethod – 文字列を復号するために使用されるメソッドの名前。
また、カスタム暗号化の使用対象となるクラスおよびメソッドを選択するための規則を含んでいる、
<includelist> も含める必要があります。これらについては、<includelist> および <excludelist> 規則セク
ションで説明します。ここで留意すべき点は、この選択対象リストは、文字列の暗号化のために選択された全ク
ラス/メソッドのサブセットである必要があるということです。
カスタム暗号化に関する詳細については、カスタム暗号化の使用セクションを参照してください。
例
<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>
<make-synthetic> セクション
このセクションは、[Make Synthetic]難読化オプションを制御します。このオプションは、メソッドとフィールドを、
Java コンパイラによって生成される合成としてマークします。これは、一部の逆コンパイラを混乱させます。タグ
には 1 つの属性と値が含まれ、value には指定できる設定が 4 つあります。

none – メソッドもフィールドも影響を受けません。これは、セクション全体を省略するのと同じです。

private – private または package-private のメソッドとフィールドは合成とされます。

non-public – private、package-private、または protected のメソッドとフィールドは合成とされます。

all – すべてのメソッドとフィールドが合成とされます。value 属性が省略された場合は、これが既定値と
なります。
MakeSynthetic は <excludelist> 要素をサポートしています。この要素には、合成としてマークされないク
ラス、メソッド、およびフィールドを選択する規則を含めることができます。この要素については、<includelist>
および <excludelist> 規則セクションで説明します。
例
<make-synthetic value="non-public"/>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
147
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<premark> セクション
このセクションでは、ソフトウェアのウォーターマーク処理に固有のオプションを指定する方法について説明し
ます。option が off に設定されている場合は、premark セクションの残りの部分の内容に関係なく、
DashO は PreMark をまったく行いません。on になっている場合は、DashO は指定されたエンコードとウォー
ターマーク文字列を使用して、アプリケーションにウォーターマークを埋め込みます。
例
<premark option="on"/>
Truncate 属性
出力 jar ファイルが生成されるまで、DashO はウォーターマーク文字列の最大長を予測することはできません。
しかし、DashO に対し、ビルド中にウォーターマーク文字列が出力 jar ファイルに収まらなかった場合どう対処
するかを指示しておくことはできます。既定の設定では、エラー メッセージを表示してビルドが停止します。on
に設定されている場合は、DashO は jar に収まるように文字列を切り詰め、警告メッセージを出力します。どち
らの場合も、メッセージにウォーターマークの最大サイズが示されます。
例
<premark truncate="on" option="on"/>
<encoding>
DashO は、文字のエンコードに必要なビット数を最小限に抑えるために、文字エンコード(「文字コード」と呼ぶ)
を使用します。小さい文字エンコードを使用すれば、より長いウォーターマーク文字列を作成できます。
例
<premark option="on">
<encoding name="7bit-a"/>
</premark>
DashO には 5 つの文字コードが定義されており、その中からウォーターマーク文字列をエンコードするための
文字コードを選択できます。
名前
説明
1 文字あたりのビット数
6bit-a
6 ビット 大文字の英数字および記号
6
6bit-b
6 ビット 英数字および記号
6
7bit-a
7 ビット 英数字および記号
7
4bit-a
4 ビット 16 進数
4
utf8
任意の文字
8
ウォーターマーク文字列には、指定したエンコードで認められた上記の文字のみを入れることができます。たと
えば、文字列に小文字の英字が含まれている場合は、6bit-a のような大文字の英字のみを保持するエン
コードは使用できません。
メモ
ユーザー インターフェイスは、各文字コードに定義されている特定の文字を表示します。
148
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<watermark>
このオプションは、出力 jar ファイルに埋め込むウォーターマークを設定します。ウォーターマーク文字列の文
字は、指定したエンコードで許可される文字セットに準拠している必要があります。
ウォーターマーク文字列の最大サイズは、構成オプションと対象となる jar ファイルの複雑さによって決定され
ます。通常、jar ファイルが大きければ、より大きい文字列を入れることができます。
例
<premark option="on">
<watermark>Copyright Yoyodyne Engineering, Inc.</watermark>
</premark>
<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>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
149
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
次の例では、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>
メモ
<quickjar> エントリ ポイントを使用して指定された jar のすべての非クラス ファイルは、自動的に出力先
jar へコピーされます。
150
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<preverifier> セクション
J2ME CLDC アプリケーションを実行している場合、DashO では、DashO によるアプリケーションの処理が完了
した後に、クラス ファイルの事前検証を実行することができます。run 属性を true に設定している場合は、
事前検証プログラムへのパスを指定できます。パスのみを指定した場合、プログラム名は preverify である
と見なされます。
また、<preverifier> タグには、事前検証プログラムに追加オプションを渡す次の属性が含まれています。

nofinalize="true/false" – 事前検証に -nofinalize を渡す:ファイナライザーは許可されま
せん。

nonative="true/false" – 事前検証に -nonative を渡す:ネイティブ メソッドは許可されません。

nofp="true/false" – 事前検証に -nofp を渡す:浮動小数点演算は許可されません。
例
<preverifier run="true" nonative="true" nofp="true">
${wtk.home}/bin/preverify.exe
</preverifier>
<signjar> セクション
このセクションでは、DashO によって作成された jar ファイルに対して jarsigner ツールを実行できます。jar
署名の詳細は、jarsigner - JAR 署名および検証ツールにあります。<signjar> タグには次の属性があります。

option="on/off" – 署名のオン/オフを切り替えます。この属性が存在しない場合、既定値は on です。

keystore="..." – キー ストアの URL。省略可能で、既定値はユーザーのホーム ディレクトリ
の .keystore になります。URL にプロトコルが含まれていない場合、キー ストアはファイルと見なされま
す。

storepass="..." – キー ストアのパスワード。必須です。これは、keypass が指定されていない場合
は非公開鍵の既定値でもあります。ユーザー インターフェイスはこれをエンコード形式で格納しますが、
値はプレーン テキストで指定でき、プロパティ参照を含むこともできます。

storetype="..." – キー ストアのタイプ。省略可能で、既定値は、Java セキュリティ プロパティ ファイ
ルの keystore.type に設定されている値になります。

alias="..." – キー ストアに非公開鍵を格納するために使用される別名。必須です。

keypass="..." – jar ファイルを署名するために使用される非公開鍵のパスワード。省略可能で、既定
値はキー ストアのパスワードになります。ユーザー インターフェイスはこれをエンコード形式で格納します
が、値はプレーン テキストで指定でき、プロパティ参照を含むこともできます。

sigfile="..." – .SF および .DSA ファイルのベース名。省略可能で、既定値は alias から派生す
る値になります。

internalsf="true/false" – .DSA の中に署名ファイルのコピーを含めます。省略可能で、既定値
は false になります。

sectionsonly="true/false" – 署名ファイルに、マニフェスト ファイルのハッシュを含むヘッダー
は追加されません。省略可能で、既定値は false になります。
例
<signjar option="on"
keystore="../dev/keystore" storepass="${keystore.psw}"
alias="lazardo">
${jdk.home}/bin/jarsigner
</signjar>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
151
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<instrumentation> セクション
このセクションでは、PreEmptive Analytics のインストルメンテーションを指定する方法について説明します。こ
のセクションには、インストルメンテーションのプロパティを定義するオプション、アノテーションの処理、および
仮想アノテーションの定義が含まれています。
<instrumentation> タグには次の属性があります。

option="on/off" – DashO のインストルメンテーション機能のオン/オフを切り替えます。この属性が存
在しない場合、既定値は on です。

honorAnnotations="true/false" – コンパイルされたクラスに存在するインストルメンテーション
アノテーションを使用するかどうかを決定します。true の場合、DashO はクラス内のインストルメンテー
ション アノテーションを処理します。この属性が存在しない場合、既定値は true です。

stripAnnotations="true/false" – コンパイルされたクラスに存在するインストルメンテーション
アノテーションを出力に保持するかどうかを決定します。true の場合、DashO はアノテーションを削除し
ます。この属性が存在しない場合、既定値は true です。

sendMessages="true/false" – false に設定すると、メッセージは PreEmptive Analytics サー
バーへ送信されません。supportOffline が true の場合は、後で送信するようにメッセージが保存
されます。この機能は、OfflineMode および OfflineModeSource アノテーションによって、またはプログラ
ムを使って制御することができます。この属性が存在しない場合、既定値は true です。

supportOffline="true/false" – すぐに PreEmptive Analytics サーバーへ送信できないメッセー
ジの処分を決定します。true に設定すると、それらのメッセージは、サーバーへ送信できるようになるま
でローカルに保存されます。sendMessages が false であるか、またはサーバーへの通信が可能で
な い 場 合 は 、 メ ッ セ ー ジ を ロ ー カ ル に 保 存 で き ま す 。 こ の 機 能 は 、 OfflineModeSupport お よ び
OfflineModeSupportSource アノテーションによって、またはプログラムを使って制御することができます。こ
の属性が存在しない場合、既定値は true です。

fullData="true/false" – ユーザー/ホストと、システム プロファイル メッセージで送信されるデータ
を識別するために送信される情報の量を決定します。これを false に設定すると、最低限量の情報が送
信されるようになり、スタートアップとシャットダウンの時間を減らすことができます。この属性が存在しない
場合、既定値は true です。
<instrumentation> タグが存在しない場合、コンパイルされたクラス内のアノテーションは無視されますが、出力
で保持されます。option 属性が off の場合は、タグの内容に関係なく、<instrumentation> タグ全体が無視さ
れます。属性には既定値があるので、以下のタグは同等です。
例
<instrumentation />
<instrumentation option="on"
honorAnnotations="true"
stripAnnotations="true"
sendMessages="true"
supportOffline="true"
fullData="true"/>
メモ
instrumentation は、Quick Jar モードでは利用できません。Quick Jar モードは、instrumentation セクションで
設定されたオプションをすべて無視します。
<instrumentation> タグは単に、com.preemptive.annotation.instrumentation パッケージから
アノテーションを処理、または削除するだけです。これらのアノテーションの詳細については、関連する
javadoc を参照してください。
152
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<endpoint> セクション
<endpoint> は、ランタイム情報が送信される場所を定義します。<endpoint> タグには次の属性があります。

name="name" – これは、PreEmptive Analytics サーバーの場所です。エンドポイントは URL に似てい
ますが、プロトコルが含まれていません。指定されていない場合は、商用の Runtime Intelligence サー
バーが使用されます。

ssl="true/false" – エンドポイントへデータを送信する際に、HTTP または HTTPS プロトコルを使
用します。既定値は true です。
これらの値は、Endpoint および UseSSL アノテーションによって設定することもできます。
<runtime> セクション
instrumentation タグには、省略可能な runtime タグを含めることができます。このタグは、アプリケーションでど
の PreEmptive Analytics System の実装 jar が使用され、それがどのように処理されるかを指定するために使
用されます。タグを省略すると、属性の既定値が使用されます。<runtime> タグには次の属性があります。

target="java15" – アプリケーションの実行環境。サポートされている値は、Java 1.5 ~ 1.6 の場合は
java15、Android SDK 1.6 以上の場合は android4 です。

merge="true/false" – ランタイム ライブラリをアプリケーションのクラスとマージします。既定値は
true で、DashO はクラスをまとめて出力にすることができるため、実装のクラスの完全な名前の変更と除
去が可能になります。false の場合は、実装の jar ファイルをアプリケーションに同梱し、そのクラスパス
に追加する必要があります。
例
<instrumentation>
<runtime target="java15" merge="true" />
</instrumentation>
Android の使用
Android のプロジェクトでは、android.permission.INTERNET アクセス許可を AndroidManifest.xml
に追加して、PreEmptive Analytics がデータを送信できるようにする必要があります。
<company> および <application> セクション
instrumentation タグには、省略可能な company と application のタグを含めることができます。これらは、インス
トルメンテーションで使用されるプロパティ値を定義します。タグとそのすべての属性は省略可能です。
<company>

name="name" – アプリケーションの名前。

id="id" – アプリケーションを提供する会社の ID。この値は GUID で指定する必要があり、PreEmptive
Solutions から入手した値でなければなりません。
<application>

name="name" – アプリケーションの名前。

id="id" – アプリケーションの ID。この値は GUID で指定する必要があります。

version="version" – アプリケーションのバージョン。このバージョンは任意の形式で表現することが
できます。

type="type" – アプリケーションのタイプ。タイプは、ユーザーが定義した任意の文字列を指定できま
す。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
153
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<instrumentation>
<company name="Yoyodyne Engineering, Inc."
id="DF29A894-C1AB-5947-E0A2-0D9779CFFB63" />
<application id="40A80B91-FB16-BB0F-96CF-6931B4472204"
version="9.3.4" type="Swing App" />
</instrumentation>
154
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<expiry> セクション
instrumentation タグには、任意の期限切れ情報を含めることができます。これらは、アプリケーションに配置さ
れる期限切れトークンを作成する ExpiryCheck アノテーションで使用される値を定義します。すべての属
性が、差し込みが行われるときに展開されるプロパティ参照を含むことができることに注意してください。

key="file" – PreEmptive Solutions から入手した Shelf Life キー ファイル。

date="date" – MM/DD/YYYY 形式の固定の有効期限。これは、アプリケーションが期限切れになると
見なされる日付です。

warningdate="date" – MM/DD/YYYY 形式の固定の警告日付。これは、期限切れに関する警告を
開始する日付です。

period="days" – 有効期限。これは、アプリケーションが期限切れになると見なされる開始日からの日
数です。開始日は、StartDateSource アノテーションを含んでいるアプリケーションによって提供され
ます。

warningperiod="days" – 警告期間。これは、期限切れの警告期間を開始する、期限までの日数で
す。
固定の日付と期間の組み合わせが許可されます。固定の日付と期間の両方の値が存在している場合は、固
定の日付が使用されます。アプリケーション コードに現れるアノテーションや、仮想アノテーションによって定
義されているアノテーションは、これらの値をオーバーライドしたり増加させたりすることができます。
例
<instrumentation>
<expiry key="../yoyodyne.slkey"
date="10/25/${EXP_YR}"
warningperiod="90"/>
</instrumentation>
期限切れトークンのプロパティ
ユーザー定義のプロパティを期限切れトークンに追加することができます。これらのプロパティは、DashO の他
のプロパティ タグと同じ形式を使用します。プロパティは、ExpiryCheck アノテーションを使ってユーザー操
作が指定されているアプリケーションによって調べることができます。
例
<instrumentation>
<expiry key="…" date="10/25/2015">
<property name="REGION" value="2"/>
<property name="COUNTRY" value="GB"/>
</expiry>
</instrumentation>
name と value の両方の属性にはプロパティ参照を含めることができます。これらは ExpiryCheck が差し込
まれるときに展開されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
155
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
仮想アノテーション
インストルメンテーション(instrumentation)タグには、1 つ以上の仮想アノテーション定義を含むことができます。
DashO は、これらのアノテーションがコンパイルされたクラス ファイルにあるかのように、そのアノテーションに
従って行動します。仮想アノテーションを使用すると、既存のアノテーションの拡大や、それらの値のオーバー
ライドが行えます。仮想アノテーションは、1 つまたは複数の <classes> タグを使用して、コンパイルされた
クラスに関連付けられています。これらのタグは、選択対象リストや選択除外リストで見られるものと同じ構文を
使います。詳細については、<includelist> および <excludelist> 規則のセクションを参照してください。
メモ
classes タグは excludeclass 属性をサポートしていませんし、このタグに field タグを含めることもできま
せん。
1 つ以上のアノテーション タグが、<classes> タグやそれに含まれる <method> タグ内に現れることがあり
ます。
<annotation> タグ
annotation タグは、クラスまたはメソッドに適用される仮想アノテーションを定義します。アノテーションには 2 つ
の属性があり、入れ子のプロパティをいくつでも持つことができます。

name="name" – ア ノ テ ー シ ョ ン の 名 前 。 こ こ で は 任 意 の 名 前 を 使 用 で き ま す が 、 DashO は
com.preemptive.annotation.instrumentation パッケージで見つかったアノテーションだけ
を処理します。アノテーションは、完全修飾名ではなく、ApplicationStart などのような単純な名前で参照
することができます。

value="value" – アノテーションに対する省略可能な値。SystemProfile などの一部のアノテーション
は値を使用しませんが、FeatureTick など他のアノテーションは値を 1 つ必要とします。値は、アノテーショ
ンが適用されるときに展開されるプロパティ参照を含めることができます。
例
<classes name="com.yoyodyne.Overthruster">
<annotation name="CompanyId"
value="DF29A894-C1AB-5947-E0A2-0D9779CFFB63"/>
<method name="main" signature="java.lang.String[]">
<annotation name="ApplicationStart"/>
<annotation name="ApplicationStop"/>
<annotation name="PropertySource" value="staticProps"/>
</method>
</classes>
この例では、main メソッドがアプリケーションの開始と停止を制限しています。どちらの機能メッセージも、静的
フィールドの staticProps から追加のプロパティを送信します。会社名はクラスに設定されていますが、そ
の後、main メソッドで ApplicationStart によって使用されることに注目してください。アノテーションの順
序は重要ではありません。DashO は、コードがインストルメント化されるときに詳細を整理します。
156
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
例
<classes name="com.yoyodyne.Overthruster">
<method name="start" signature="">
<annotation name="ApplicationStart">
<property name="where" value="End"/>
</annotation>
<annotation name="Company">
<property name="name" value="Yoyodyne Engineering, Inc."/>
<property name="id" value="DF29A894-C1AB-5947-E0A2-0D9779CFFB63"/>
</annotation>
</method>
<method name="stop" signature="">
<annotation name="ApplicationStop"/>
</method>
<method name="testOscillation " signature="">
<annotation name="FeatureStart" value="Oscillation Test"/>
<annotation name="FeatureStop" value="Oscillation Test"/>
<annotation name="PropertySource" value="getTestParameters()"/>
</method>
</classes>
この例は、プロパティを含んでいるアノテーションの使用方法を示しています。ApplicationStart は、
start メソッドの終了時に実行されます。Company アノテーションは値を持ちませんが、2 つのプロパティで構
成されます。
アノテーションの値は、クラスとメソッド両方の動的プロパティを使用することができます。クラス レベルで使用さ
れるアノテーションで、METHOD_NAME と PROP_NAME を使用できます。実際の値は、アノテーションが特定
のメソッドに適用されるときにのみ展開されます。
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
157
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
ソースおよび操作の指定
いくつかのアノテーションは、生成された情報で使用される動的な情報のソースや操作を指定します。これら
は、現在のクラスに定義されているフィールドやメソッド、または別のクラスの静的メソッドを参照できます。
フィールドやメソッドは、次の形式を使用して指定します。

field – 現在のクラスのフィールドをソースとして使用します。ソースが静的メソッドから使用される場合は、
ソースは静的でなければなりません。そうでない場合は、インスタンス フィールドである必要があります。

@field – 現在のクラスの静的フィールドをソースとして使用します。これは、静的メソッドまたはインスタン
ス メソッドから使用できます。

class.field – 指定されたクラスの静的フィールドをソースとして使用します。class は、完全修飾され
た Java クラス名です。これは、静的メソッドまたはインスタンス メソッドから使用できます。

method() – 現在のクラスのメソッドをソースとして使用します。ソースが静的メソッドから使用される場合
は、ソースは静的でなければなりません。そうでない場合は、インスタンス メソッドである必要があります。

@method() – 現在のクラスの静的メソッドをソースとして使用します。これは、静的メソッドまたはインスタ
ンス メソッドから使用できます。

class.method() – 指定されたクラスの静的メソッドをソースとして使用します。class は、完全修飾され
た Java クラス名です。これは、静的メソッドまたはインスタンス メソッドから使用できます。
メモ
現在のクラスの静的(または非静的)フィールドまたはメソッドであることを示す @ が、メソッドおよびフィール
ドに正しく付けられている(または付けられていない)かを確認してください。別のクラスの静的メソッドまたは
静的フィールドを参照する場合は、@ を付けないでください。フィールドは、アノテーションが求める必要な
型であることを確認してください。メソッドは、アノテーションが求める必要な戻り値の型とパラメーターを持っ
ていることを確認してください。
158
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
<includelist> および <excludelist> 規則
プロジェクト ファイルの一部のタブは、<includelist> および <excludelist> を使用して、操作が適用
される項目を微調整します。これらのタグは、特定のクラス、メソッド、またはフィールドを選択するために適用さ
れる規則のリストを指定します。
対象選択と対象除外の両方を使用しているタグでは、最初に対象選択が決定されます。<includelist>
が空の場合は、すべての項目が対象として選択されます。項目が選択されたら、次に対象除外規則が調べら
れます。<excludelist> が空の場合は、どの項目も対象から除外されません。各リスト内の規則は、それら
がプロジェクト ファイルで指定されている順序で適用されます。さらに、DashO の内部規則、その他のオプショ
ンの要件、およびクラス自体によって、項目が除外される可能性があります。
クラス、メンバーと同様にメソッドの署名の名前も、リテラル、パターン、あるいは正規表現として指定することが
できます。詳細については、名前:リテラル、パターン、および正規表現を参照してください。項目の修飾子も
条件として使用できます。詳細については、Modifiers 属性を参照してください。
<classes> タグ
<classes> タグは、1 つ以上のクラスを選択する規則を定義するために使用されます。クラス名は完全修飾
名である必要があり、内部クラスは、外部と内部のクラス名の間に $ を区切り文字として使用して指定されるこ
とに注意してください。
<classes> タグは、フィールドとメソッドを選択するための追加規則を指定するために、クラスを選択します。
タグに <field> タグも <method> タグも含まれていなければ、このタグをクラスのすべてのメンバー、あるい
はクラス自体に適用するために使用できます。この動作は、規則を使用しているオプションによって決まります。
いくつかの対象除外リストでは、<classes> 名をクラスのメンバーではなくクラス自体に適用されるようにする
ことができます。これは、省略可能な excludeclass 属性によって制御されます。excludeclass 属性の
既定値は true です。excludeclass 属性がそのオプションで使用されているかどうかを確認するために、
<excludelist> を使用する個々のタグを調べてください。
例
<classes name=".*" regex="true"/>
<classes name="library.Class1$NestedClass"/>
<classes name="myco.Test.MyOtherTest" excludeclass="false">
<method> タグ
<method> タグは <classes> タグ内で使用されます。メソッドは、名前と署名を指定して選択できます。
<method> の regex の設定は <classes> タグから継承されます。囲っている <classes> の regex の
値が true であれば、name 属性と signature 属性は正規表現です。次の例は、正規表現を使用して、任
意の数のパラメーターを持つ set で始まるメソッドをすべて選択します。
例
<classes name=".*" regex="true"/>
<method name="set.*" signature=".*"/>
</classes>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
159
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
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> タグ内で使用されます。<field> の regex の設定は <classes> タグから
継承されます。囲っている <classes> の regex の値が true であれば、name 属性は正規表現です。
一部のオプションの操作はメソッドにのみ適用されるので、<field> タグは、すべての対象選択リストおよび
対象除外リストには適用できません。<field> タグが使用可能かどうかを確認するために、対象選択リストま
たは対象除外リストを使用する個々のタグを調べてください。次の例は、正規表現を使用して、counter で
始まるフィールドをすべて選択します。
例
<classes name=".*" regex="true"/>
<field regex="true" 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>
160
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
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 – 項目は Java annotation(アノテーション)です。これは、<classes> で使用される
場合にのみ意味を持ちます。

synthetic – Java コンパイラはこの項目を実装情報の詳細として作成しているため、ソース コードの一
部として現れません。
認識できない修飾子は無視されます。修飾子の前に ! を加えることで、修飾子を否定として指定することもで
きます。修飾子は大文字と小文字を区別しません。
例
<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>
© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
161
D A S H O ™
ユ ー ザ ー ズ
ガ イ ド
名前:リテラル、パターン、および正規表現
クラスとメンバーの名前は、リテラル値、パターン、または正規表現のいずれかで指定できます。リテラル値を
使用すると、一致させる項目を正確に指定できますが、パターンや正規表現を使用すると、1 つのエントリに対
して 1 つ以上の項目を一致させることができます。既定では、? または * が含まれていない限り、名前はリテラ
ル値として扱われます。正規表現を指定するには、タグに regex="true" 属性を追加する必要があります。
パターンの使用
パターンはリテラル値によく似ていますが、次に挙げるパターンのインジケーターを 1 つ以上含んでいます。

? – 1 文字と一致します。

* – 制限付きで 0 個以上の文字と一致します。一致させることができるものは、照合している項目の種類
によって異なります。これについては、以降のセクションで説明します。

** – 制限なしで 0 個以上の文字と一致します。
クラス名のパターン
* がクラス名で使用されている場合には、サブパッケージではなく単独のパッケージ内の項目と一致します。
** パターンは、パッケージあるいは任意のサブパッケージ内の項目と一致します。
メソッド名とフィールド名のパターン
メソッド名やフィールド名で使用されている * と ** の間に違いはありません。どちらも 0 個以上の文字と一致
します。
メソッド署名のパターン
メソッド署名でパターンが使用されている場合は、* と ** の間に違いがあります。* パターンはメソッドへの 0
または 1 個の引数と一致するのに対し、** は任意の数の引数と一致します。
たとえば、次のようになります。
パターン
引数
引数なし
int
java.lang.String
long,int
long,boolean,int
162
*
**








long,*
long,**



© 1998-2013 PREEMPTIVE SOLUTIONS LLC.ALL RIGHTS RESERVED
Fly UP