Loading api/current.txt +2 −9 Original line number Diff line number Diff line Loading @@ -12872,14 +12872,7 @@ package android.content.res { package android.content.res.loader { public interface AssetsProvider { method @Nullable public default java.io.InputStream loadAsset(@NonNull String, int) throws java.io.IOException; method @Nullable public default android.os.ParcelFileDescriptor loadAssetParcelFd(@NonNull String) throws java.io.IOException; } public class DirectoryAssetsProvider implements android.content.res.loader.AssetsProvider { ctor public DirectoryAssetsProvider(@NonNull java.io.File); method @Nullable public java.io.File findFile(@NonNull String); method @NonNull public java.io.File getDirectory(); method @Nullable public default android.content.res.AssetFileDescriptor loadAssetFd(@NonNull String, int); } public class ResourcesLoader { Loading @@ -12894,9 +12887,9 @@ package android.content.res.loader { public class ResourcesProvider implements java.lang.AutoCloseable java.io.Closeable { method public void close(); method @NonNull public static android.content.res.loader.ResourcesProvider empty(@NonNull android.content.res.loader.AssetsProvider); method @Nullable public android.content.res.loader.AssetsProvider getAssetsProvider(); method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.ParcelFileDescriptor) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromDirectory(@NonNull String, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromSplit(@NonNull android.content.Context, @NonNull String) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromTable(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; } core/java/android/app/ResourcesManager.java +3 −2 Original line number Diff line number Diff line Loading @@ -1255,7 +1255,8 @@ public class ResourcesManager { * instance uses. */ @Override public void onLoadersChanged(Resources resources, List<ResourcesLoader> newLoader) { public void onLoadersChanged(@NonNull Resources resources, @NonNull List<ResourcesLoader> newLoader) { synchronized (ResourcesManager.this) { final ResourcesKey oldKey = findKeyForResourceImplLocked(resources.getImpl()); if (oldKey == null) { Loading Loading @@ -1283,7 +1284,7 @@ public class ResourcesManager { * {@code loader} to apply any changes of the set of {@link ApkAssets}. **/ @Override public void onLoaderUpdated(ResourcesLoader loader) { public void onLoaderUpdated(@NonNull ResourcesLoader loader) { synchronized (ResourcesManager.this) { final ArrayMap<ResourcesImpl, ResourcesKey> updatedResourceImplKeys = new ArrayMap<>(); Loading core/java/android/content/pm/PackageParser.java +1 −1 Original line number Diff line number Diff line Loading @@ -1443,7 +1443,7 @@ public class PackageParser { try { try { apkAssets = fd != null ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */) ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */, null /* assets */) : ApkAssets.loadFromPath(apkPath); } catch (IOException e) { throw new PackageParserException(INSTALL_PARSE_FAILED_NOT_APK, Loading core/java/android/content/pm/parsing/ApkLiteParseUtils.java +1 −1 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ public class ApkLiteParseUtils { try { try { apkAssets = fd != null ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */) ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */, null /* assets */) : ApkAssets.loadFromPath(apkPath); } catch (IOException e) { throw new PackageParser.PackageParserException( Loading core/java/android/content/res/ApkAssets.java +88 −27 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.content.om.OverlayableInfo; import android.content.res.loader.AssetsProvider; import android.content.res.loader.ResourcesProvider; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -86,11 +87,15 @@ public final class ApkAssets { /** The path used to load the apk assets represents an resources.arsc file. */ private static final int FORMAT_ARSC = 2; /** the path used to load the apk assets represents a directory. */ private static final int FORMAT_DIR = 3; // Format types that change how the apk assets are loaded. @IntDef(prefix = { "FORMAT_" }, value = { FORMAT_APK, FORMAT_IDMAP, FORMAT_ARSC, FORMAT_DIR }) @Retention(RetentionPolicy.SOURCE) public @interface FormatType {} Loading @@ -108,6 +113,9 @@ public final class ApkAssets { @PropertyFlags private final int mFlags; @Nullable private final AssetsProvider mAssets; /** * Creates a new ApkAssets instance from the given path on disk. * Loading @@ -129,7 +137,21 @@ public final class ApkAssets { */ public static @NonNull ApkAssets loadFromPath(@NonNull String path, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_APK, path, flags); return new ApkAssets(FORMAT_APK, path, flags, null /* assets */); } /** * Creates a new ApkAssets instance from the given path on disk. * * @param path The path to an APK on disk. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromPath(@NonNull String path, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_APK, path, flags, assets); } /** Loading @@ -141,12 +163,14 @@ public final class ApkAssets { * @param fd The FileDescriptor of an open, readable APK. * @param friendlyName The friendly name used to identify this ApkAssets when logging. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_APK, fd, friendlyName, flags); @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_APK, fd, friendlyName, flags, assets); } /** Loading @@ -162,13 +186,15 @@ public final class ApkAssets { * @param length The number of bytes of the apk, or {@link AssetFileDescriptor#UNKNOWN_LENGTH} * if it extends to the end of the file. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_APK, fd, friendlyName, offset, length, flags); return new ApkAssets(FORMAT_APK, fd, friendlyName, offset, length, flags, assets); } /** Loading @@ -182,7 +208,7 @@ public final class ApkAssets { */ public static @NonNull ApkAssets loadOverlayFromPath(@NonNull String idmapPath, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_IDMAP, idmapPath, flags); return new ApkAssets(FORMAT_IDMAP, idmapPath, flags, null /* assets */); } /** Loading @@ -195,12 +221,14 @@ public final class ApkAssets { * @param fd The FileDescriptor of an open, readable resources.arsc. * @param friendlyName The friendly name used to identify this ApkAssets when logging. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadTableFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, flags); @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, flags, assets); } /** Loading @@ -217,13 +245,29 @@ public final class ApkAssets { * @param length The number of bytes of the table, or {@link AssetFileDescriptor#UNKNOWN_LENGTH} * if it extends to the end of the file. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadTableFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, offset, length, flags); @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, offset, length, flags, assets); } /** * Creates a new ApkAssets instance from the given directory path. The directory should have the * file structure of an APK. * * @param path The path to a directory on disk. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromDir(@NonNull String path, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_DIR, path, flags, assets); } /** Loading @@ -232,43 +276,50 @@ public final class ApkAssets { * tracking a separate identifier. * * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources */ @NonNull public static ApkAssets loadEmptyForLoader(@PropertyFlags int flags) { return new ApkAssets(flags); public static ApkAssets loadEmptyForLoader(@PropertyFlags int flags, @Nullable AssetsProvider assets) { return new ApkAssets(flags, assets); } private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags) throws IOException { private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { Objects.requireNonNull(path, "path"); mFlags = flags; mNativePtr = nativeLoad(format, path, flags); mNativePtr = nativeLoad(format, path, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); mAssets = assets; } private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException { @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { Objects.requireNonNull(fd, "fd"); Objects.requireNonNull(friendlyName, "friendlyName"); mFlags = flags; mNativePtr = nativeLoadFd(format, fd, friendlyName, flags); mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); mAssets = assets; } private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) throws IOException { @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { Objects.requireNonNull(fd, "fd"); Objects.requireNonNull(friendlyName, "friendlyName"); mFlags = flags; mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags); mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); mAssets = assets; } private ApkAssets(@PropertyFlags int flags) { private ApkAssets(@PropertyFlags int flags, @Nullable AssetsProvider assets) { mFlags = flags; mNativePtr = nativeLoadEmpty(flags); mNativePtr = nativeLoadEmpty(flags, assets); mStringBlock = null; mAssets = assets; } @UnsupportedAppUsage Loading @@ -293,6 +344,14 @@ public final class ApkAssets { return (mFlags & PROPERTY_LOADER) != 0; } /** * Returns the assets provider that overrides the loading of assets present in this apk assets. */ @Nullable public AssetsProvider getAssetsProvider() { return mAssets; } /** * Retrieve a parser for a compiled XML file. This is associated with a single APK and * <em>NOT</em> a full AssetManager. This means that shared-library references will not be Loading Loading @@ -364,13 +423,15 @@ public final class ApkAssets { } private static native long nativeLoad(@FormatType int format, @NonNull String path, @PropertyFlags int flags) throws IOException; private static native long nativeLoadEmpty(@PropertyFlags int flags); @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; private static native long nativeLoadEmpty(@PropertyFlags int flags, @Nullable AssetsProvider asset); private static native long nativeLoadFd(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException; @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; private static native long nativeLoadFdOffsets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) throws IOException; @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; private static native void nativeDestroy(long ptr); private static native @NonNull String nativeGetAssetPath(long ptr); private static native long nativeGetStringBlock(long ptr); Loading Loading
api/current.txt +2 −9 Original line number Diff line number Diff line Loading @@ -12872,14 +12872,7 @@ package android.content.res { package android.content.res.loader { public interface AssetsProvider { method @Nullable public default java.io.InputStream loadAsset(@NonNull String, int) throws java.io.IOException; method @Nullable public default android.os.ParcelFileDescriptor loadAssetParcelFd(@NonNull String) throws java.io.IOException; } public class DirectoryAssetsProvider implements android.content.res.loader.AssetsProvider { ctor public DirectoryAssetsProvider(@NonNull java.io.File); method @Nullable public java.io.File findFile(@NonNull String); method @NonNull public java.io.File getDirectory(); method @Nullable public default android.content.res.AssetFileDescriptor loadAssetFd(@NonNull String, int); } public class ResourcesLoader { Loading @@ -12894,9 +12887,9 @@ package android.content.res.loader { public class ResourcesProvider implements java.lang.AutoCloseable java.io.Closeable { method public void close(); method @NonNull public static android.content.res.loader.ResourcesProvider empty(@NonNull android.content.res.loader.AssetsProvider); method @Nullable public android.content.res.loader.AssetsProvider getAssetsProvider(); method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.ParcelFileDescriptor) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromDirectory(@NonNull String, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromSplit(@NonNull android.content.Context, @NonNull String) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromTable(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; }
core/java/android/app/ResourcesManager.java +3 −2 Original line number Diff line number Diff line Loading @@ -1255,7 +1255,8 @@ public class ResourcesManager { * instance uses. */ @Override public void onLoadersChanged(Resources resources, List<ResourcesLoader> newLoader) { public void onLoadersChanged(@NonNull Resources resources, @NonNull List<ResourcesLoader> newLoader) { synchronized (ResourcesManager.this) { final ResourcesKey oldKey = findKeyForResourceImplLocked(resources.getImpl()); if (oldKey == null) { Loading Loading @@ -1283,7 +1284,7 @@ public class ResourcesManager { * {@code loader} to apply any changes of the set of {@link ApkAssets}. **/ @Override public void onLoaderUpdated(ResourcesLoader loader) { public void onLoaderUpdated(@NonNull ResourcesLoader loader) { synchronized (ResourcesManager.this) { final ArrayMap<ResourcesImpl, ResourcesKey> updatedResourceImplKeys = new ArrayMap<>(); Loading
core/java/android/content/pm/PackageParser.java +1 −1 Original line number Diff line number Diff line Loading @@ -1443,7 +1443,7 @@ public class PackageParser { try { try { apkAssets = fd != null ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */) ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */, null /* assets */) : ApkAssets.loadFromPath(apkPath); } catch (IOException e) { throw new PackageParserException(INSTALL_PARSE_FAILED_NOT_APK, Loading
core/java/android/content/pm/parsing/ApkLiteParseUtils.java +1 −1 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ public class ApkLiteParseUtils { try { try { apkAssets = fd != null ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */) ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */, null /* assets */) : ApkAssets.loadFromPath(apkPath); } catch (IOException e) { throw new PackageParser.PackageParserException( Loading
core/java/android/content/res/ApkAssets.java +88 −27 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.content.om.OverlayableInfo; import android.content.res.loader.AssetsProvider; import android.content.res.loader.ResourcesProvider; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -86,11 +87,15 @@ public final class ApkAssets { /** The path used to load the apk assets represents an resources.arsc file. */ private static final int FORMAT_ARSC = 2; /** the path used to load the apk assets represents a directory. */ private static final int FORMAT_DIR = 3; // Format types that change how the apk assets are loaded. @IntDef(prefix = { "FORMAT_" }, value = { FORMAT_APK, FORMAT_IDMAP, FORMAT_ARSC, FORMAT_DIR }) @Retention(RetentionPolicy.SOURCE) public @interface FormatType {} Loading @@ -108,6 +113,9 @@ public final class ApkAssets { @PropertyFlags private final int mFlags; @Nullable private final AssetsProvider mAssets; /** * Creates a new ApkAssets instance from the given path on disk. * Loading @@ -129,7 +137,21 @@ public final class ApkAssets { */ public static @NonNull ApkAssets loadFromPath(@NonNull String path, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_APK, path, flags); return new ApkAssets(FORMAT_APK, path, flags, null /* assets */); } /** * Creates a new ApkAssets instance from the given path on disk. * * @param path The path to an APK on disk. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromPath(@NonNull String path, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_APK, path, flags, assets); } /** Loading @@ -141,12 +163,14 @@ public final class ApkAssets { * @param fd The FileDescriptor of an open, readable APK. * @param friendlyName The friendly name used to identify this ApkAssets when logging. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_APK, fd, friendlyName, flags); @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_APK, fd, friendlyName, flags, assets); } /** Loading @@ -162,13 +186,15 @@ public final class ApkAssets { * @param length The number of bytes of the apk, or {@link AssetFileDescriptor#UNKNOWN_LENGTH} * if it extends to the end of the file. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_APK, fd, friendlyName, offset, length, flags); return new ApkAssets(FORMAT_APK, fd, friendlyName, offset, length, flags, assets); } /** Loading @@ -182,7 +208,7 @@ public final class ApkAssets { */ public static @NonNull ApkAssets loadOverlayFromPath(@NonNull String idmapPath, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_IDMAP, idmapPath, flags); return new ApkAssets(FORMAT_IDMAP, idmapPath, flags, null /* assets */); } /** Loading @@ -195,12 +221,14 @@ public final class ApkAssets { * @param fd The FileDescriptor of an open, readable resources.arsc. * @param friendlyName The friendly name used to identify this ApkAssets when logging. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadTableFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, flags); @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, flags, assets); } /** Loading @@ -217,13 +245,29 @@ public final class ApkAssets { * @param length The number of bytes of the table, or {@link AssetFileDescriptor#UNKNOWN_LENGTH} * if it extends to the end of the file. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadTableFromFd(@NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, offset, length, flags); @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_ARSC, fd, friendlyName, offset, length, flags, assets); } /** * Creates a new ApkAssets instance from the given directory path. The directory should have the * file structure of an APK. * * @param path The path to a directory on disk. * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources * @return a new instance of ApkAssets. * @throws IOException if a disk I/O error or parsing error occurred. */ public static @NonNull ApkAssets loadFromDir(@NonNull String path, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { return new ApkAssets(FORMAT_DIR, path, flags, assets); } /** Loading @@ -232,43 +276,50 @@ public final class ApkAssets { * tracking a separate identifier. * * @param flags flags that change the behavior of loaded apk assets * @param assets The assets provider that overrides the loading of file-based resources */ @NonNull public static ApkAssets loadEmptyForLoader(@PropertyFlags int flags) { return new ApkAssets(flags); public static ApkAssets loadEmptyForLoader(@PropertyFlags int flags, @Nullable AssetsProvider assets) { return new ApkAssets(flags, assets); } private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags) throws IOException { private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { Objects.requireNonNull(path, "path"); mFlags = flags; mNativePtr = nativeLoad(format, path, flags); mNativePtr = nativeLoad(format, path, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); mAssets = assets; } private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException { @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { Objects.requireNonNull(fd, "fd"); Objects.requireNonNull(friendlyName, "friendlyName"); mFlags = flags; mNativePtr = nativeLoadFd(format, fd, friendlyName, flags); mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); mAssets = assets; } private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) throws IOException { @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException { Objects.requireNonNull(fd, "fd"); Objects.requireNonNull(friendlyName, "friendlyName"); mFlags = flags; mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags); mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); mAssets = assets; } private ApkAssets(@PropertyFlags int flags) { private ApkAssets(@PropertyFlags int flags, @Nullable AssetsProvider assets) { mFlags = flags; mNativePtr = nativeLoadEmpty(flags); mNativePtr = nativeLoadEmpty(flags, assets); mStringBlock = null; mAssets = assets; } @UnsupportedAppUsage Loading @@ -293,6 +344,14 @@ public final class ApkAssets { return (mFlags & PROPERTY_LOADER) != 0; } /** * Returns the assets provider that overrides the loading of assets present in this apk assets. */ @Nullable public AssetsProvider getAssetsProvider() { return mAssets; } /** * Retrieve a parser for a compiled XML file. This is associated with a single APK and * <em>NOT</em> a full AssetManager. This means that shared-library references will not be Loading Loading @@ -364,13 +423,15 @@ public final class ApkAssets { } private static native long nativeLoad(@FormatType int format, @NonNull String path, @PropertyFlags int flags) throws IOException; private static native long nativeLoadEmpty(@PropertyFlags int flags); @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; private static native long nativeLoadEmpty(@PropertyFlags int flags, @Nullable AssetsProvider asset); private static native long nativeLoadFd(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, @PropertyFlags int flags) throws IOException; @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; private static native long nativeLoadFdOffsets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags) throws IOException; @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; private static native void nativeDestroy(long ptr); private static native @NonNull String nativeGetAssetPath(long ptr); private static native long nativeGetStringBlock(long ptr); Loading