Androidとの統合¶
Javaスコアリングコードは、ほとんどあるいは全く変更することなく、Androidで使用することができます。
備考
サポートされるAndroidバージョンは8.0(API 26)以降です。
単一モデルの使用¶
Androidプロジェクトでは、Javaプロジェクトの場合とほぼ同様に単一モデルを使用できます。
- スコアリングコードJARファイルをディレクトリのAndroidプロジェクトにコピーします
app/libs
。 - 次の行を
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ファイルにすることができます。
例:
$ java -jar scoring-code-jar-tool.jar --output combined.jar model1.jar model2.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
という出力JARが生成されていますmodel-dex.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);
}
}
}
}
}