1 package com.android.nn.benchmark.core.sl;
2 
3 import android.content.Context;
4 import android.system.ErrnoException;
5 import android.system.Os;
6 import android.util.Log;
7 import java.io.BufferedReader;
8 import java.io.File;
9 import java.io.FileNotFoundException;
10 import java.io.IOException;
11 import java.io.InputStreamReader;
12 import java.util.List;
13 import java.util.stream.Collectors;
14 
15 public class QualcommSupportLibraryDriverHandler extends SupportLibraryDriverHandler {
16   private static final String NNAPI_DSP_SL_LIBRARIES_ASSET_PATH = "dsp_loaded_libraries.txt";
17   private static final String DSP_LOAD_PATH_ENV_VAR = "ADSP_LIBRARY_PATH";
18 
19   @Override
prepareDriver(Context context, String nnSupportLibFilePath)20   public void prepareDriver(Context context, String nnSupportLibFilePath) throws IOException {
21     boolean isApkPath = nnSupportLibFilePath.contains("apk!");
22 
23     String dspLibsFolder = null;
24     Log.i(TAG, "Preparing NNAPI SL");
25     if (isApkPath) {
26       dspLibsFolder = extractDSPLibraries(context);
27     } else {
28       dspLibsFolder = new File(nnSupportLibFilePath).getParent();
29     }
30 
31     if (dspLibsFolder != null) {
32       try {
33         Os.setenv(DSP_LOAD_PATH_ENV_VAR, dspLibsFolder, /*overwrite=*/true);
34         Log.i(TAG, String.format("Overwritten system env variable %s with %s",
35             DSP_LOAD_PATH_ENV_VAR, dspLibsFolder));
36       } catch (ErrnoException errnoException) {
37         throw new IOException(String.format("Unable to overwrite system env variable %s with %s",
38             DSP_LOAD_PATH_ENV_VAR, dspLibsFolder), errnoException);
39       }
40     }
41   }
42 
extractDSPLibraries(Context context)43   private String extractDSPLibraries(Context context)
44       throws IOException {
45     try {
46       BufferedReader slLibraryListReader
47           = new BufferedReader(
48           new InputStreamReader(
49               context.getAssets().open(NNAPI_DSP_SL_LIBRARIES_ASSET_PATH)));
50       final String nnLibTargetFolder = context.getCodeCacheDir().toString();
51       final List<String> libsToExtract = slLibraryListReader.lines().collect(Collectors.toList());
52       if (libsToExtract.isEmpty()) {
53         Log.i(TAG, "No SL library to extract.");
54         return null;
55       }
56       for (final String libraryFile : libsToExtract) {
57         if (!extractNnApiSlLibTo(context, libraryFile, nnLibTargetFolder)) {
58           throw new FileNotFoundException(String.format("Unable to extract file %s", libraryFile));
59         }
60       }
61       return nnLibTargetFolder;
62     } catch (IOException e) {
63       Log.e(TAG, "Unable to find list of SL libraries to extract from APK under assets.", e);
64       throw e;
65     }
66   }
67 }
68