Merge "Fix mmap errors when reading font files via the AssetManager." into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
8cf381064f
@@ -19,6 +19,7 @@ package android.graphics.fonts;
|
|||||||
import android.annotation.IntRange;
|
import android.annotation.IntRange;
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.content.res.AssetFileDescriptor;
|
||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.LocaleList;
|
import android.os.LocaleList;
|
||||||
@@ -219,6 +220,27 @@ public final class Font {
|
|||||||
Preconditions.checkNotNull(am, "assetManager can not be null");
|
Preconditions.checkNotNull(am, "assetManager can not be null");
|
||||||
Preconditions.checkNotNull(path, "path can not be null");
|
Preconditions.checkNotNull(path, "path can not be null");
|
||||||
|
|
||||||
|
// Attempt to open as FD, which should work unless the asset is compressed
|
||||||
|
AssetFileDescriptor assetFD;
|
||||||
|
try {
|
||||||
|
if (isAsset) {
|
||||||
|
assetFD = am.openFd(path);
|
||||||
|
} else if (cookie > 0) {
|
||||||
|
assetFD = am.openNonAssetFd(cookie, path);
|
||||||
|
} else {
|
||||||
|
assetFD = am.openNonAssetFd(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
try (FileInputStream fis = assetFD.createInputStream()) {
|
||||||
|
final FileChannel fc = fis.getChannel();
|
||||||
|
long startOffset = assetFD.getStartOffset();
|
||||||
|
long declaredLength = assetFD.getDeclaredLength();
|
||||||
|
return fc.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// failed to open as FD so now we will attempt to open as an input stream
|
||||||
|
}
|
||||||
|
|
||||||
try (InputStream assetStream = isAsset ? am.open(path, AssetManager.ACCESS_BUFFER)
|
try (InputStream assetStream = isAsset ? am.open(path, AssetManager.ACCESS_BUFFER)
|
||||||
: am.openNonAsset(cookie, path, AssetManager.ACCESS_BUFFER)) {
|
: am.openNonAsset(cookie, path, AssetManager.ACCESS_BUFFER)) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user