トラブルシューティング
PreEmptive Protection™ DashO™ for Android & Java を使用して製品を保護する際に発生する可能性がある、いくつかの一般的な問題があります。 以下の項目にお客様の特定の問題が見つからない場合は、追加情報を記録するように DashO を構成してみてください。 DashO Gradle プラグイン(Android 用)および DashO Gradle プラグイン(Java 用) にはそれぞれ個別のトラブルシューティング セクションがあります。 どちらかの統合を使用している場合は、以下の該当するトラブル シューティング ページを調べてください。
- 詳細なログまたはデバッグ ログを有効にする方法
- UI に関する問題
- パフォーマンスの問題
- エラー
- Error: Error creating output file for {some class}: While parsing {some class and method}
- Error: Method code too large!
- Error: {some number}
- Error: Class not found {some class}; super class of {some other class}
- Error: Unable to resolve common supertype for: {some class} and {some other class}
- Missing org.apache.http.impl.client.DefaultHttpClient in an Android project.
- Error: Required Method Not Found: {some class and method} call to method {some method} in [class|interface] {some other class}
- Error: Unable to add to path: {some path}: {message}
- Error: Unable to add to path: {some path}: DashO does not currently support multidex APKs.
- Error: {some class} did not match any classes in the input path.
- Error: Method {some class and method} not found.
- Error: Recursive definition at position {i} in "${expression}"
- Error: Invalid Regular Expression used in {context} : {expression} : {details}
- Error: Error reading {path to project.dox} - Illegal version number: X.Y.Z
- Error: Error caching inputs: {some message}
- Error: Issue decoding APK
- Error: Wildcard method call removal is no longer supported: {some instance}
- Error: Unexpected path map version "{some version}" (expected: {some other version}).
- Error: Error reading {some class and method}. This method may have been already protected by DashO.
- Error: DashO does not currently support multi-release jars as inputs: {some path}
- 警告
- Warning: A path in ${gradleInput} does not appear to contain any classes.
- Warning: File format changed. project.dox (vX.Y.Z) has been updated to vX.Y.Z. Please save the updated version.
- Warning: Duplicate class {some class} in {some path} ignored; using version from {some other path}
- Warning: Required Method Not Found: {some class and method} call to method {some method} in [class|interface] {some other class}
- Warning: The 'EnclosingMethod' attribute of class '{some class}' references '{some other class}' which was not part of the inputs, and will be retained unmodified in the obfuscated output.
- Warning: Your Android Mode project file contains {some configuration element}.This is ignored in Android Mode.
- Warning: Some strings could not be encrypted, ... First found in: {some class and method}.
詳細なログまたはデバッグ ログを有効にする方法
追加情報を記録するように DashO を構成する方法は次のとおりです。
- DashO GUI を実行している場合:[Preferences]で、Logging Level
Verbose
(またはDebug
)を使用し、Print Stack Traces
をオンにします。 - DashO コマンド ラインを実行している場合:
dashocmd
の実行時に、引数--verbose
(または--debug
)と--printStackTraces
を追加します。 - DashO Gradle プラグイン(Java 用)を使って DashO を実行している場合:
dashOConfig
にverbose = true
(またはdebug = true
)を追加します。 - DashO Gradle Plugin for (Android 用)を使って DashO を実行している場合:
dasho
にverbose true
(またはdebug true
)を追加します。 - Ant 統合を使って DashO を実行している場合:
obfuscate
タスクでverbose="true"
およびprintstacktraces="true"
を設定します。 また、output
やerror
ファイルを設定しておくと役立つことがあります。
UI に関する問題
DashO が起動しない
コマンド プロンプトから、DashO ホームで dashocmd.bat --version
(または ./dashocmd --version
)を実行してみてください。
それが動作しない場合は、DashO の構成で指定した Java ランタイムを確認してください。
メモ:
提供されたインストーラーのいずれも使用しなかった場合は、java
がパス上にあることを確認してください。 また、DASHO_JAVA_HOME
を設定することもできます。
AdoptOpenJDK v9.x には、macOS では GUI アプリケーションが正しく起動しないという既知の問題があります。 この問題を解決するには、JDK インストールのContents/Home/lib
ディレクトリの中からsudo ln -s libfreetype.dylib.6 libfreetype.6.dylib
を実行します。
高 DPI およびスケーリングに関する問題
Java で実行されるデスクトップ アプリケーション(つまり DashO)は、拡大率が 100% 以上になっている高 DPI ディスプレイの Windows では、ほとんどの場合、適切に表示されません。
これらの問題は、DashO の GUI では、ツール ヒントが切り詰められる(たとえば、View the User Guide
ではなく View the User
となる)、アイコンやスプラッシュ画面イメージが小さく表示される現象として現れます。
javaw.exe
の Windows 設定を変更することにより、表示を改善できます。
- DashO の実行に使用される JDK(または JRE)の場所 を特定します。
- Windows エクスプローラーで、
javaw.exe
(bin
またはjre/bin
のいずれかにあります)を探します。 javaw.exe
を右クリックして[プロパティ]を選択します。- [互換性]セクションを表示します。
- [高い DPI スケールの動作を上書きします]チェック ボックスをオンにします。
- "システム" を選択します。
- [OK]をクリックします。
パフォーマンスの問題
Android モードでのビルドが予想以上に時間がかかる
DashO Gradle プラグイン(Android 用)は、アプリケーションが直接または間接的に依存するライブラリ プロジェクトまたはサード パーティ製のライブラリなど、Android アプリケーションのビルドで使用可能なすべてのコードを保護します。 文字列の暗号化および制御フローの難読化を R8 の名前変更と組み合わせることで、攻撃者はアプリケーションのクラスと共通ライブラリのクラスを区別することが困難になるので、保護が強力になります。 ただし、ビルドに要する時間が問題になる場合は、DashO が処理するクラス数を減らすことができます。
そのような場合は、アプリケーションの依存関係の多くが Android のサポート ライブラリである可能性があります。これらのライブラリを保護対象から除外するには、dasho
に excludeFromProtection "^android"
を追加します。
これで、DashO により、android
で始まる名前が含まれるすべての入力が保護対象から除外されます。
グローバルな対象除外を使用して、DashO が特定のパッケージのクラスを処理しないようにすることもできます。 どのパッケージを対象から除外するかは、プロジェクトによって異なります。
エラー
Error: Error creating output file for {some class}: While parsing {some class and method}
デバッグ ログを有効にして DashO を再度実行し、そのログの情報をサポート担当者に連絡してください。
この問題を回避するには、保護対象から some class and method
を除外してみてください。
Error: Method code too large!
DashO の一部の保護技術は、メソッドの全体的なコード サイズを増大させる可能性があります。 ごくまれに、保護によってメソッドのサイズが、Java 仮想マシンがサポートするサイズを超えるまで大きくなることがあります。 デバッグ ログを有効にして DashO を再度実行し、書き込まれるクラスおよびメソッドを判断してください。 保護の対象からメソッドを除外するか、メソッドが小さくなるようコードをリファクタすることができます。
Error: {some number}
デバッグ ログを有効にして DashO を再度実行し、そのログの情報をサポート担当者に連絡してください。 その時点で操作されているクラスまたはメソッドを特定できる場合は、そのクラスまたはメソッドを保護対象から除外して、問題を回避することができます。
Error: Class not found {some class}; super class of {some other class}
DashO は、クラスの使用方法や名前の変更が可能な項目を決定するときに、スーパー クラスにアクセスして、継承されるメソッドおよびオーバーライドされるメソッドを決定する必要があります。
some class
を含んでいる jar ファイルを、サポートするクラスパス(または、そのクラスを DashO で保護する必要がある場合は入力)に追加する必要があります。
some class
が java.lang.Object
である場合は、Include JDK(JDK の導入)を構成する(または、これが Android プロジェクトである場合は、android.jar
をサポートするクラスパス(Supporting Classpath)に追加する)必要があります。
some other class
が、アプリケーションで実際に使用されていると思われないクラスである場合は、Removal の構成を確認してください。
未使用のクラスを除去しないように DashO が構成されている場合は、すべての入力クラスのスーパー クラスにアクセス可能である必要があります。
Error: Unable to resolve common supertype for: {some class} and {some other class}
このエラーは通常、some class
または some other class
が入力またはサポート クラスパスに見つからない場合に発生します。
背後にある問題の詳細については、Print Stack Traces を有効にします。
Missing org.apache.http.impl.client.DefaultHttpClient in an Android project.
Google は Marshmallow(6.0 - SDK v23) で、android.jar
内のこのクラスの配布を停止しました。
${sdk.dir}/platforms/${sdk.target}/extras/org.apache.http.legacy.jar
をサポート クラスパスに追加してください。
Error: Required Method Not Found: {some class and method} call to method {some method} in [class|interface] {some other class}
some class and method
の実行パスを調べているときに、some method
が some other class
に見つかりませんでした。
これは、DashO 構成内の正しくないバージョンのサポート ライブラリを参照した場合に発生する可能性があります。
入力およびサポート クラスパスを確認してください。
Ignore Missing Methods をオンにすると、このエラーを警告に格下げすることができます。
Error: Unable to add to path: {some path}: {message}
これは、入力またはサポート クラスパスのエントリの読み取り時に発生するエラーです。
message
には詳細情報が含まれます。
エントリ(または、エントリによって展開されるユーザー プロパティ定義を確認してください)。
メモ:
これがサポート クラスパス エントリであり、警告にする場合は、WARN_ON_MISSING_SUPPORT_ENTRY
という名前のユーザー プロパティを追加し、true
を設定します。
Error: Unable to add to path: {some path}: DashO does not currently support multidex APKs.
DashO は、処理後の Multidex APK を入力としてサポートしていませんが、Gradle ビルドに統合されている場合には Multidex APK をサポートします。 代わりに、DashO を Gradle ビルド処理に統合してください。
Error: {some class} did not match any classes in the input path.
構成されている特殊なエントリ ポイント some class
が入力内に見つかりませんでした。
クラス名に間違いがないことと、クラスが入力の一部であることを確認してください。
GUI でプロジェクトを表示すると、クラスが入力の一部であるかどうかの判断に役立つ可能性があります。
Error: Method {some class and method} not found.
構成されているエントリ ポイント some class and method
が入力内に見つかりませんでした。
クラスおよびメソッドのスペルに間違いがないことと、メソッドの署名が正しいことを確認してください。
GUI でプロジェクトを表示すると、クラスおよびメソッドが入力の一部であるかどうかの判断に役立つ可能性があります。
Error: Recursive definition at position {i} in "${expression}"
プロパティの拡張は入れ子のプロパティをサポートしています。
このエラーは、入れ子のプロパティを含んでいるプロパティを評価していて、再帰が見つかった場合に発生します。
これを解決するには、再帰的な定義を削除する必要があります。
再帰が見つかった場所は、expression
内の i
で始まるプロパティ名です。
Error: Invalid Regular Expression used in {context} : {expression} : {details}
このエラーは、無効な正規表現が見つかった場合に発生します。 メッセージには次の事項が含まれています。
context
- 構成内でexpression
が使用されている領域。expression
- エラー原因となった式。 これは、展開されたプロパティ参照からのものであった可能性があります。details
- 特定の問題に関する詳細情報。
Java 正規表現の構文を確認してください。
Error: Error reading {path to project.dox} - Illegal version number: X.Y.Z
古いバージョンの DashO で新しい DashO 構成ファイルを開こうとしています。 このファイルは DashO vX.Y.Z(以降)で開く必要があります。 新しいバージョンの DashO では、古いバージョンの構成ファイルを読み取ることができます。
Error: Error caching inputs: {some message}
自動入力管理で使用されるキャッシュで問題がありました。 詳細については、メッセージを参照してください。
Error: Issue decoding APK
APKTool で APK のデコード中に問題が発生しました。 デバッグ ログを有効にして、詳細をコンソールで確認してください。
Error: Wildcard method call removal is no longer supported: {some instance}
ワイルドカードによるメソッド呼び出しの除去はサポートされなくなりました。 そのメソッドが含まれる特定のクラスを構成する必要があります。
Error: Unexpected path map version "{some version}" (expected: {some other version}).
このメッセージが表示されるのは、お使いの DashO バージョンと互換性のないバージョンの DashO がパスの割り当てファイルを読み取ろうとした場合です。
このメッセージが GUI に表示された場合は、この構成を使って行われた最後のビルドが、ユーザーが実行しようとしている DashO バージョンと互換性のない DashO Gradle プラグイン(Android 用)バージョンであるということです(例:DashO Gradle プラグイン(Android 用)バージョン 0.10.0 を使ってビルドを行ったが、非ベータ バージョンの DashO 10.0 を使ってそのビルドの構成を開いた、など)。 使用したい DashO バージョンと互換性のあるバージョンの DashO Gradle プラグイン(Android 用)を使用していることを確認したうえで、Android プロジェクトをビルドしてください。
Gradle のビルド中にこのメッセージが表示された場合は、DashO のバージョンと、使用しようとしている DashO Gradle プラグイン(Android 用)のバージョンに互換性がありません。
DashO Gradle プラグイン(Android 用)のバージョンと、それらのバージョンの DashO との互換性の詳細については、バージョン間の互換性を参照してください。
Error: Error reading {some class and method}. This method may have been already protected by DashO.
このエラーが発生する可能性があるのは、既に DashO によって保護されていたコードを処理しようとした場合です。 DashO は、既に保護しているコードを再度処理するようには設計されていないためです。 このエラーが発生する例としては、ライブラリや、そのライブラリを使用する Android アプリと DashO を統合しようとした場合が挙げられます。 そのような場合は、アプリを保護するだけで十分です。アプリを保護すれば、そのアプリ内のライブラリ コードも保護されるからです。
DashO によって既に保護されているコードを処理するのに DashO を使用しないようにしてください。
DashO Gradle プラグイン(Android 用)を使用しているときにこの問題が発生した場合は、{some class}
が含まれる入力を使って excludeFromProtection
を構成します。
Error: DashO does not currently support multi-release jars as inputs: {some path}
DashO は、入力として構成されたマルチ リリース jar ファイルをサポートしていません。
警告
Warning: A path in ${gradleInput} does not appear to contain any classes.
Android ビルドに基づく従来の DashO Gradle プラグインでは、DashO の入力はプロパティ gradleInput
(DashO Gradle プラグインから渡されます)から受け取るように構成されます。
このプロパティには(User Properties ページで)1 つ以上のパスの既定値が設定されているため、DashO はクラスを読み込んで、GUI にクラス ツリーを作成できます。
この既定値にクラスが何も含まれていない場合、クラス ツリーは正しく作成されず、新しいチェックや規則を設定することが難しくなります。
これは、以下の理由から発生する可能性があります。
- クラスがコンパイルされていない可能性があります。
gradlew assemble
または同様のタスクを実行して、プロジェクトをコンパイルしてください。 - ウィザードがビルド バリアントに基づいて設定した
gradleInput
がビルドされていません(たとえば、gradleInput
はrelease
クラスの場所を参照しているのに、debug
しかビルドされていません)。 これは、すべてのバリアントをビルドすれば解決します。 - プロジェクトで Kotlin を使用していますが、
gradleInput
に Kotlin クラスが含まれていません。 Kotlin クラスの場所をgradleInput
に追加してください。その際、他のパスとの区切りには、プラットフォームに依存しないプロパティの拡張${path.separator}
(または、プラットフォーム依存の;
または:
)を使用します。 Kotlin クラスのパスは、通常、次のようになります。
build/tmp/kotlin-classes/[<flavorName>]<buildType>
- Android Gradle プラグインがコンパイルしたクラスを配置する場所が変更されている可能性があります(たとえば、DashO プロジェクトは、現在使用しているバージョンより古いバージョンの Android Gradle プラグインで作成されています)。
少なくとも 1 つのビルド バリアント用のクラスを含んでいるディレクトリを探し、その場所を参照するように
gradleInput
の既定値を更新する必要があります。
Android Gradle プラグインのバージョンが 3.2.0 より前である場合には、クラスのパスは通常、次のようになります。
build/intermediates/classes[/<flavorName>]/<buildType>
バージョン 3.2.0 以降の Android Gradle プラグインを使用している場合には、クラスのパスは通常、次のようになります。
build/intermediates/javac/[<flavorName>]<buildType>/compile[<flavorName>]<buildType>JavaWithJavac/classes
たとえば、プロジェクトで Android Gradle プラグインのバージョン 3.2.0 を使用しており、GUI に release
ビルド タイプで pro
フレーバーのクラスを表示させたい場合には、パスは build/intermediates/javac/proRelease/compileProReleaseJavaWithJavac/classes
になります。
クラス ツリーを再作成するには、プロパティを更新後、ツール バー にある[Reload Class List]ボタンをクリックする必要があります。
Warning: File format changed. project.dox (vX.Y.Z) has been updated to vX.Y.Z. Please save the updated version.
この警告は、古いバージョンの DashO からプロジェクトの構成を開いた場合に発生します。 更新されたバージョンを保存すると、今後この警告は表示されなくなりますが、古いバージョンの DashO で開くこともできなくなります。 GUI は構成を保存する際、常に最新の形式を使用します。
Warning: Duplicate class {some class} in {some path} ignored; using version from {some other path}
同じクラス定義が、入力またはサポート クラスパスのいずれかの、2 つの異なるエントリに見つかりました。 これは、同じライブラリの複数のバージョンが構成されている場合、または同じクラスを含む(あるいは、同じ完全修飾名を使用する異なるクラスを含む)2 つの別個のライブラリがある場合に発生する可能性があります。 重複するライブラリを削除してください。 エントリの順序を変更することもできます。 後者のエントリのクラスは無視されるようになります。
メモ:この警告は、マルチ リリース jar ファイルがサポート クラスパスにある場合にも表示されることがあります。
Warning: Required Method Not Found: {some class and method} call to method {some method} in [class|interface] {some other class}
some class and method
の実行パスを調べているときに、some method
が some other class
に見つかりませんでした。
これは、DashO 構成内の正しくないバージョンのサポート ライブラリを参照した場合に発生する可能性があります。
入力およびサポート クラスパスを確認してください。
Ignore Missing Methods をオフにすると、この警告をエラーに格上げすることができます。
Warning: The 'EnclosingMethod' attribute of class '{some class}' references '{some other class}' which was not part of the inputs, and will be retained unmodified in the obfuscated output.
EnclosingMethod
属性は、ローカルまたは匿名の {some class}
を囲むクラスおよびメソッドを参照します。
不足している {some other class}
を入力に追加すれば、この警告は出ません。
{some other class}
がまったく存在しない場合は、ご利用のコンパイラに問題があることを示している場合があります。
元の名前が、保護済みコードでも依然として参照される、また {some other class}
を入力に追加できない場合は、DashO で EnclosingMethod
属性を除去)するよう指示することができます。
Warning: Your Android Mode project file contains {some configuration element}.This is ignored in Android Mode.
標準モードの多くの設定は Android モードでは無視されます。 このタイプの警告メッセージでは、プロジェクト ファイルの中で、Android モードでは無視される XML 要素、XML 属性、グローバル オプション、および特殊なユーザー プロパティを指摘します。
多くの場合、(エントリ ポイント, 名前の変更の対象除外、除去、およびメソッド呼び出しの除去など)これらの設定を R8 構成に移行することもできます。 必要な移行を行った後に、無視された設定をテキスト エディターを使ってプロジェクト ファイルから安全に削除することができます。
Warning: Some strings could not be encrypted, ... First found in: {some class and method}.
invokedynamic
ベースの文字列連結(詳細は JEP-280 を参照)は、Java 9 から導入されたもので、文字列定数をブートストラップ メソッドに渡すことができます。
DashO の文字列の暗号化は現在、Java 9 または Java 10 ではこれをサポートしていません。
定数でない値と連結された定数文字列(例:"Welcome, " + name + ", to string concatenation."
)は、既定では暗号化されません。
この問題が発生した場合は、DashO により、ビルドあたり一度だけ、警告が発行されます。
この問題は、Java 9 または Java 10 JVM 用にコンパイルされたクラスにのみ影響します。
DashO の文字列の暗号化を機能させるための解決方法が 2 つあります。
- 9 または 10 以外の JVM 用にコンパイルする。
- JEP-280 の説明に従って、
-XDstringConcat=indy
を使用してコンパイルする。