Androidとの統合¶
ほとんどまたはまったく変更せずにAndroidでJavaスコアリングコードを使用することが可能です。
備考
サポートされるAndroidバージョンは8.0(API 26)以降です。
単一モデルの使用¶
Androidプロジェクトでは、Javaプロジェクトの場合とほぼ同様に単一モデルを使用できます。
- スコアリングコードJARファイルを
app/libs
ディレクトリのAndroidプロジェクトにコピーします。 -
次の行を
dependency
(app/build.gradle
内)に追加します。implementation fileTree(include: ['*.jar'], dir: 'libs') annotationProcessor fileTree(include: ['*.jar'], dir: 'libs')
-
これで、Java APIと同じ方法でモデルをできるようになります。
さらに複雑なユースケース¶
より複雑な機能を有効にするには、スコアリングコードJARを処理する必要があります。
DataRobotは、以下の目標を達成できるように1つ以上のスコアリングコードJARファイルを処理するscoring-code-jar-tool
というツールを提供します。
scoring-code-jar-tool
はJARファイルとして配布され、こちらから取得できます。
複数のモデルの使用¶
同じAndroidプロジェクトで複数のスコアリングコードJARを使用することはできません。
各スコアコードJARには同じ依存関係が含まれており、Androidでは同じ完全修飾名を持つ複数のクラスを使用することはできません。
この問題を修正するために、scoring-code-jar-tool
を使用して、複数の入力JARファイルを取得し、重複するクラスを削除して、入力JARファイルを単一のJARファイルにマージできます。
例:
`java -jar scoring-code-jar-tool.jar --output combined.jar model1.jar model2.jar`
JARの動的ロード¶
スコアリングコードJARを動的にロードするには、スコアリングコードJARをDalvik Executable(DEX)形式にコンパイルする必要があります。
scoring-code-jar-tool
では、--dex
パラメーターを使用してDEXにコンパイルできます。
例:
`java -jar scoring-code-jar-tool.jar --output combined.jar --dex /home/user/Android/Sdk/build-tools/29.0.3/dx model1.jar model2.jar`
--dex
パラメーターには、Android SDKの一部であるdx
ツールのパスが必要です。
Javaの例¶
この例では、ID5ebbeb5119916f739492a021
のあるモデルがscoring-code-jar-tool
によって--dex
引数で処理され、model-dex.jar
という出力JARが生成されています。
この例では、マージされたJARファイルがアセットとしてプロジェクトに追加されています。
アセットへのファイルシステムパスを取得することはできません。そのため、アセットはロードされる前にファイルシステムの場所にコピーされます。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String filename = "model-dex.jar";
File externalFile = new File(getExternalFilesDir(null), filename);
try {
copyAssetToFile(filename, externalFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
DexClassLoader loader = new DexClassLoader(externalFile.getAbsolutePath(), "", null, MainActivity.class.getClassLoader());
IClassificationPredictor classificationPredictor = Predictors.getPredictor("5ebbeb5119916f739492a021", loader);
}
private void copyAssetToFile(String assetName, File dest) throws IOException {
AssetManager assetManager = getAssets();
try (InputStream in = assetManager.open(assetName)) {
try (OutputStream out = new FileOutputStream(dest)) {
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
}
}
}