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