java/com/facebook/soloader/SoSource.java (44 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.soloader; import android.os.StrictMode; import java.io.File; import java.io.IOException; import java.util.Collection; import javax.annotation.Nullable; public abstract class SoSource { /** This SoSource doesn't know how to provide the given library. */ public static final int LOAD_RESULT_NOT_FOUND = 0; /** This SoSource loaded the given library. */ public static final int LOAD_RESULT_LOADED = 1; /** * This SoSource did not load the library, but verified that the system loader will load it if * some other library depends on it. Returned only if LOAD_FLAG_ALLOW_IMPLICIT_PROVISION is * provided to loadLibrary. */ public static final int LOAD_RESULT_IMPLICITLY_PROVIDED = 2; /** This SoSource tried to load the library but it seems that the file is corrupted. */ public static final int LOAD_RESULT_CORRUPTED_LIB_FILE = 3; /** Allow loadLibrary to implicitly provide the library instead of actually loading it. */ public static final int LOAD_FLAG_ALLOW_IMPLICIT_PROVISION = 1; /** Allow loadLibrary to reparse the so sources directories. */ @Deprecated public static final int LOAD_FLAG_ALLOW_SOURCE_CHANGE = 1 << 1; /** * Min flag that can be used in customized {@link SoFileLoader#load(String, int)} implementation. * The custom flag value has to be greater than this. */ public static final int LOAD_FLAG_MIN_CUSTOM_FLAG = 1 << 2; /** Allow prepare to spawn threads to do background work. */ public static final int PREPARE_FLAG_ALLOW_ASYNC_INIT = (1 << 0); /** Force prepare to refresh libs. */ public static final int PREPARE_FLAG_FORCE_REFRESH = (1 << 1); /** Prepare to install this SoSource in SoLoader. */ protected void prepare(int flags) throws IOException { /* By default, do nothing */ } /** * Load a shared library library into this process. This routine is independent of {@link * #loadLibrary}. * * @param soName Name of library to load * @param loadFlags Zero or more of the LOAD_FLAG_XXX constants. * @return One of the LOAD_RESULT_XXX constants. */ public abstract int loadLibrary( String soName, int loadFlags, StrictMode.ThreadPolicy threadPolicy) throws IOException; /** * Ensure that a shared library exists on disk somewhere. This routine is independent of {@link * #loadLibrary}. * * @param soName Name of library to load * @return File if library found; {@code null} if not. */ @Nullable public abstract File unpackLibrary(String soName) throws IOException; /** * Returns the so file for the specified library. Returns null if the library does not exist or if * it's not backed by a file. */ @Nullable protected File getSoFileByName(String soName) throws IOException { return null; } /** * Gets the full path of a library if it is found on this SoSource. * * @param soFileName the full file name of the library * @return the full path of a library if it is found on this SoSource, null otherwise. * @throws IOException if there is an error calculating {@code soFileName}'s canonical path */ @Nullable public String getLibraryPath(String soFileName) throws IOException { return null; } /** * Gets the dependencies of a library if it is found on this SoSource * * @param soName Name of library to inspect * @return An array of library names upon which {@code soName} needs for linking * @throws IOException if {@code soName} is found but there is an error reading it */ @Nullable public String[] getLibraryDependencies(String soName) throws IOException { return null; } /** * Add an element to an LD_LIBRARY_PATH under construction. * * @param paths Collection of paths to which to add */ public void addToLdLibraryPath(Collection<String> paths) { /* By default, do nothing */ } /** * Return an array of ABIs handled by this SoSource. * * @return ABIs supported by this SoSource */ public String[] getSoSourceAbis() { /* By default, the same as the device */ return SysUtil.getSupportedAbis(); } /** * Return the class name of the actual instance. Useful for debugging. * * @return the instance class name */ @Override public String toString() { return getClass().getName(); } }