アップグレード
PreEmptive Protection™ DashO™ for Android & Java v10.0 では、新しい大きな機能の追加、既存の機能の変更、廃止予定となっていたいくつかの機能の除去が行われています。 お使いの DashO プロジェクト構成も更新しなければならない場合があります。 上記の変更点を理解するため、またプロジェクト構成の適切な更新方法を理解するために、下記の詳細が役立ちます。 変更点の一覧については、変更履歴を参照してください。
Android のサポート
DashO 10 で導入されるのは、Android モードを使用して R8 で動作する新しい DashO Gradle プラグイン(Android 用)と、新しい Android ビルド統合です。 DashO Gradle プラグイン(現在は DashO Gradle プラグイン(Java 用)と改称)による以前の Android ビルド統合は、廃止されました。 ただし、DashO は今でもこの以前の統合によって実行することは可能ですが、使用できる Android Gradle プラグインが特定のバージョンのみになるという制限があります。
新しい Android ビルド統合に切り替える
Android 統合用の新しい DashO Gradle プラグインに切り替えるには、新しい Migration Wizard を使用するか、Gradle ビルド スクリプト(例:build.gradle
および dasho.gradle
ファイル)と DashO 構成を手動で編集します。
Migration Wizard
Migration Wizard は、既存のビルドを移行して新しい統合を使用できるようにするために、お使いのビルド環境を調べ、必要に応じて Gradle ビルド スクリプト、DashO 構成ファイル、gradle.properties
ファイル、および/または .gitignore
ファイルを更新します。
Migration Wizard を起動するには、[File]>[Project Wizard]メニューを選択します。 "Upgrade Android Gradle project to DashO 10" を選択します。
移行元の DashO 構成ファイルを選択し、[Next]をクリックします。 次いで、[Finish]をクリックすることで、選択した各ファイルが Migration Wizard によって変更されます。
DashO GUI により、プロジェクト ファイルが読み込まれて、たとえば gradlew assembleRelease
をビルドするかどうかの確認を求められます。
ビルドが完了したら、[Project] > [Reload Class List]を選択することでプロジェクトのクラスを再読み込みすることができます。
次のステップ(必要な場合)
ほとんどのプロジェクトで新しい統合を使用し始めるには Migration Wizard によって行われる変更だけで十分かと思われます。 ただし、問題に直面した場合は、手動で DashO の設定を R8 に移行しなければならない可能性もあります。 必要に応じて移行を行うことができるように、Migration Wizard により DashO 構成がテキスト エディターで開かれます。
手動での移行
手動での移行
既存の Gradle ビルド スクリプトを、この新しいプラグインを使用するように移行するには、わずかな手順で済みます。
新しいプラグインを適用する
build.gradle
ファイル内の以下の行を変更します。
既存の行 | 変更後の行 |
---|---|
flatDir dirs: {DASHO_HOME}\gradle |
maven { url 'https://maven.preemptive.com' } |
classpath 'com.preemptive:dasho…' |
classpath 'com.preemptive.dasho:dasho-android:0.10.+' |
次のように、プラグインを適用する新しい行を追加します。
// これら 2 行の後に、次の 1 行を追加する
apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
// 次の 1 行を、上記 2 行の後に追加する:
apply plugin: 'com.preemptive.dasho.android'
// ただし、次の行がある場合は、上の行を次の行の前に追加する:
apply from: 'dasho.gradle'
プラグイン構成を更新する
以前のプラグインでは構成を行うのに dashOConfig
クロージャを使用していました。
新しいのプラグインでは、構成を行うのに dasho
クロージャを使用します。
既存のクロージャは通常、dasho.gradle
にあります。
dashOConfig
クロージャの名前を dasho
に変更し、それに含まれる設定を次の表に基づいて更新または除去します。
dashOConfig プロパティ |
dasho プロパティ |
---|---|
dashOHome |
除去する(DashO が既定の場所にインストールされている場合)か、名前を home に変更する |
debug |
保持する(変更しない) |
dexExcluded |
除去する(includeAsInputs に関連する) |
disabledForBuildTypes |
新しい値を使って enabledBuildVariants として書き換える |
disabledForBuildVariants` |
新しい値を使って enabledBuildVariants として書き換える |
doxFilename |
保持する(変更しない) |
generateProGuardMap |
除去する(R8 により割り当てファイルが自動的に生成される) |
includeAsInputs |
除去する(アプリケーションまたはライブラリの依存関係が Android モードでの処理で自動的にインクルードされるようになっている。DashO の処理からクラスを除外したい場合は、グローバルな除外を使用する) |
maxHeap = '???M' |
javaOptions "-Xmx???m" として書き換える |
skipManifestProcessing |
除去する(DashO の Android モードではマニフェストが処理されない) |
transformName |
除去する(もはや不要のため) |
verbose |
保持する(変更しない) |
メモ:
DashO の以前のバージョンで、リリースされていないビルド タイプを難読化するのにminifyEnabled
を使用していた場合は、enabledBuildVariants
を、そのビルド タイプと一致するパターンと共に指定する必要があります。
R8 を有効化する
Android 向けの概要で説明したように、Gradle プラグイン(Android 用)では、名前変更と除去の機能が R8 に移行されました。 お使いのビルドで R8 を有効化するには、こちらの手順を実行してください。
DashO の構成を更新する
Android モードを使用するように、プロジェクトを更新する必要があります。
プロジェクトに関連するすべての .dox
ファイルに対し、以下の手順を繰り返します。
- DashO GUI で
.dox
ファイルを開きます。 DashO により、ファイルが新しいバージョンに自動的にアップグレードされます。 - アップグレードされたバージョンを保存します。
- テキスト エディターで
.dox
ファイルを開き、先頭のdasho
タグを次のタグに置き換えます。<dasho mode="android" version="10.0.0">
- GUI によりこのファイルの変更点が通知されて再度ファイルを読み込むように求められるので、GUI を使ってそのようにします。 無視された要素とオプションについての警告が表示されます。
- ビルドの実行に関するプロンプトに対して[OK]をクリックします。
gradlew clean build
を使って、完全なビルドを実行します。 ビルド中、DashO により、無視された構成設定に関する警告が出力される場合があります。 ビルド後、DashO GUI により、クラスを再度読み込むように求めるプロンプトが表示されます。
次のステップ(必要な場合)
ほとんどのプロジェクトで新しい統合を使用し始めるには、これらの手順を実行するだけで十分かと思われます ただし、問題に直面した場合は、手動で DashO の設定を R8 に移行しなければならない可能性もあります。
Android モードでの文字列の暗号化とリフレクション
文字列の暗号化により、リフレクションにより読み込まれるクラスがあったことが R8 によって検出されない場合があります。 詳細については、こちらのセクションを参照してください。
特定の DashO 設定を移行する(必要な場合)
.dox
ファイルにおいて手動で構成した対象除外がある場合は、必要に応じてそれらの対象除外を R8 の規則に移行することも、移行しないことも可能です。
Android Gradle プラグインは、問題を引き起こすとわかっている DashO 設定の対象除外を自動的に生成します。この対象除外によって、必要な対象除外の一部がカバーされることも、あるいは全部がカバーされることもあります。
完全なビルド(gradlew clean build
)を実行したら、生成された規則が含まれる次のファイルを確認します。
build/intermediates/proguard-rules/{flavorName}/{buildType}/aapt_rules.txt
上のファイルでカバーされなかった対象除外があれば、それに対する規則を追加する必要があります。
メモ:
DashO GUI には Android モードで無視された構成設定は表示されないため、構成ファイルをテキスト エディターで開いて、移行する必要のある構成設定を特定する必要があります。
この作業を開始するには、まず必ず R8 を有効化し、空の migrated-rules.pro
ファイルを作成して minifyEnabled true
の後に以下を追加します。
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'migrated-rules.pro'
proguardFiles
として指定された一連のファイルに含まれる規則は、Android Gradle プラグインによって生成された規則と、プロジェクトによって使用されるライブラリ(AAR)に埋め込まれている規則と組み合わせて使用されます。
メモ:
proguardFiles
の構成は、minifyEnabled
をtrue
に設定したすべてのビルド タイプについて繰り返す必要があります。
無視された構成設定に関する警告を解決する
前述のように、.dox
ファイルの多くのセクションは Android モードには適用されません。
無視されたすべての要素、属性および値に対して、警告が出力されます。
以下の項目は移行しなければならない場合があります。
無視される要素 | 解決策 |
---|---|
<entrypoints> |
除去設定と名前変更設定を移行するを参照 |
<methodCallRemoval> |
メソッド呼び出しの除去を移行するを参照 |
<optimization> |
最適化を移行するを参照 |
<removal> |
除去設定を移行するを参照 |
<renaming> |
名前変更設定を移行するを参照 |
renameforname ( <global> の下) |
リフレクションを参照 |
無視された警告の大部分は、Android では適用できない機能か、Android モードや R8 では自動処理されない機能に関する警告です。 除去可能な項目は以下のとおりです。
<classpath>
<includenonclassfiles>
<inputpath>
<make-synthetic>
<output>
<premark>
<preverifier>
<report>
<seInput>
<seOutput>
<signjar>
- 多くの
<global>
<option>
メモ:
以前のバージョンでは、<exclude>
(<global>
の下で入れ子になっている)によってクラスを明示的に除去することができました。 このタグは、Android モードではサポートされておらず、R8 にも類似の機能はありません。
不要なプロパティをクリーンアップする
既存のプロジェクトには、Android との以前の統合で使用されていたプロパティが数多くあることでしょう。 これらのプロパティは、残った設定で参照しない場合には除去しても構いません。
AndroidManifestFile
AndroidManifestOutput
build.dir
buildType
buildVariant
dasho.results.dir
gradleInput
gradleOutput
gradleSupport
key.store
KEY_ALIAS
KEY_ALIAS_PASSWORD
KEYSTORE
KEYSTORE_PASSWORD
manifest.package
projectname
sdk.dir
sdk.target
除去設定と名前変更設定を移行する
DashO の名前変更および除去は、<entrypoints>
、<renaming>
、および <removal>
要素で構成します。
エントリ ポイントの大部分は、実行時に Android Gradle プラグインによって aapt_rules.txt
が生成される際に特定されます。
自動処理されなかったエントリ ポイントがある場合は、必要な規則を追加してください。
いくつかの基本的な除去規則および名前変更規則を後述します。
必要な規則がある場合は、migrated-rules.pro
に追加してください。
メモ:
明示的にクラスを除去する機能は、DashO と Android モードではサポートされておらず、また R8 にも対応する機能がありません。
除去設定を移行する
使用しないクラス、メソッド、フィールドの除去は、R8 に移行されました。
R8 の既定では、ユーザーによって keep
するように R8 に指示されていたが、ユーザーが使用していないクラス、メソッド、フィールドは、除去されます。
R8 の除去設定を構成するいくつかの基本的な規則を後述します。
メモ:
クラス名、メソッド名、フィールド名を保持したい場合は、下記の規則のいくつかにある,allowobfuscation
の部分を省略してください。
除去を無効にするには、次の規則を追加します。
-dontshrink
すべてのパブリック クラスを保持するには、次の規則を追加します。
-keep,allowobfuscation class public *
すべてのパブリック メンバーを保持するには、次の規則を追加します。
-keep,allowobfuscation class * {
public <methods>;
public <fields>;
}
特定のクラスまたはメソッドを保持するには、次の規則を追加します。
-keep,allowobfuscation class com.example.ClassName { <init>(); }
特定の属性を保持するには、次の規則を追加します。
-keepattributes "{attribute names}"
メモ:
除去する属性は DashO で構成するのに対し、保持する属性は R8 で構成します。
R8 の既定の設定は DashO の既定の設定と非常に似ています。 主な違いは、実行時に見えないアノテーションが DashO では除去されるのに対し、R8 では保持される点です。
名前変更設定を移行する
新しい名前を決定する方法は、DashO と R8 とでは異なります。
R8 には、DashO の alphabet 設定に直接一致する機能はありません。
R8 は、ハード コーディングされたアルファベットを使って名前を生成しますが、-obfuscationdictionary {filename}
、-classobfuscationdictionary {filename}
、-packageobfuscationdictionary {filename}
オプションを使用すれば、事前に生成された名前から成る辞書を使用するように構成することもできます。
名前変更を無効にするには、以下の規則を追加します。
-keepnames class ** { *; }
階層をフラット化するには、以下の規則を追加します。
-allowaccessmodification
-repackageclasses "com.example.package"
メモ:
-allowaccessmodification
は 最適化構成では既定として有効化されています。
すべてのパブリック メンバー名を保持するには、次の規則を追加します。
-keepclassmembernames class * {
public <methods>;
public <fields>;
}
特定のクラス、メソッド、またはフィールド名を保持するには、次の規則を追加します。
-keepnames class com.example.ClassName
-keepclassmembernames class com.example.ClassName {
int method(...);
boolean field;
}
メモ:
R8 の名前変更の割り当てファイルは、build/outputs/mapping/r8/{flavorName}/{buildType}/mapping.txt
にあります。
メソッド呼び出しの除去を移行する
メソッド呼び出しを除去するように DashO を構成していた場合は、メソッド呼び出しの除去規則を変換する必要があります。
プロジェクトの .dox
ファイルには、当該のメソッド呼び出しに対するすべての署名がオーバーロードされているエントリがあるでしょう。
<methodCallRemoval>
<method className="android.util.Log" methodName="v"
signature="java.lang.String, java.lang.String"/>
<method className="android.util.Log" methodName="v"
signature="java.lang.String, java.lang.String, java.lang.Throwable"/>
</methodCallRemoval>
このメソッド呼び出しの除去を移行するには、migrated-rules.pro
に以下の行を追加します。
-assumenosideeffects class android.util.Log {
public static int v(...);
}
メモ:
呼び出しの除去は、最適化構成でのみ機能します。
最適化を移行する
組み込まれている R8 Android 構成には、proguard-android.txt
と proguard-android-optimize.txt
という 2 つ異なる構成があります。
これら 2 つの構成ファイルは、ビルドの実行後に Android Gradle プラグインにより、アプリケーションまたはライブラリ モジュールのディレクトリ内の build/intermediates/proguard-files
ディレクトリに配布されます。
使用する構成は、proguardFiles getDefaultProguardFile('proguard-android[-optimize].txt')
を使って構成します。
構成する際、実際のファイル名に含まれているバージョン番号は build/intermediates/proguard-files
に含めないでください。
リフレクション
リフレクションを使ってクラスを読み込む場合は、クラス名を参照しているクラス(またはメソッド)を文字列の暗号化対象から除外し、migrated-rules.pro
に -adaptclassstrings
オプションを追加する必要があります。
廃止されたサポート クラスパス オプションの除去
[Input - Supporting Classpath]画面の[Append current Java runtime]オプションと[Use Classpath from Environment]オプションは、DashO 9.0 で廃止されたため、現在は除去されています。 これらのオプションを使用していたプロジェクトは、それらのオプションの代わりに Include JDK を使用するように更新する必要があります。
メモ:
旧バージョンでは、[Append current Java runtime]オプションは既定で有効化されていました。 この廃止された機能を使用していて、Include JDK を使用するように修正されていないプロジェクトに対しては、DashO ビルドはエラーと共に終了します。
メソッド呼び出しの除去の変更
メソッド呼び出しの除去で使用されていた、ワイルドカードによるクラスの一致のサポートが、なくなりました。
クラスのメソッドを指定するのに **
を使用していた場合は、そのクラスに一致するように構成を変更する必要があります。
以前の機能の除去
DashO の public get*Version*()
メソッドは除去されました。
診断ツール JVMInfo
は除去されました。
DashO Eclipse プラグインは除去されました。
廃止されたプロパティ ${dasho.java.version}
、${jce.jar}
、${jsse.jar}
は除去されたため、自動解決されなくなりました。
プロキシ構成の変更
DashO GUI 内のプロキシ構成は削除されました。 インターネット アクセスにプロキシの使用が必要な環境で DashO を使用する場合は、プロキシ設定を構成する必要があります。