Merge "Do not hold unnecessary map reference" into sc-dev

This commit is contained in:
Seigo Nonaka
2021-01-29 04:36:06 +00:00
committed by Android (Google) Code Review
2 changed files with 46 additions and 71 deletions

View File

@@ -63,7 +63,7 @@ public final class FontManagerService extends IFontManager.Stub {
@Override
public FontConfig getFontConfig() throws RemoteException {
return getCurrentFontSettings().getSystemFontConfig();
return getSystemFontConfig();
}
/* package */ static class SystemFontException extends AndroidException {
@@ -103,7 +103,7 @@ public final class FontManagerService extends IFontManager.Stub {
if (!Typeface.ENABLE_LAZY_TYPEFACE_INITIALIZATION) {
return null;
}
return mService.getCurrentFontSettings().getSerializedSystemFontMap();
return mService.getCurrentFontMap();
}
});
publishBinderService(Context.FONT_SERVICE, mService);
@@ -162,7 +162,7 @@ public final class FontManagerService extends IFontManager.Stub {
@GuardedBy("FontManagerService.this")
@Nullable
private SystemFontSettings mCurrentFontSettings = null;
private SharedMemory mSerializedFontMap = null;
private FontManagerService(Context context) {
mContext = context;
@@ -188,12 +188,12 @@ public final class FontManagerService extends IFontManager.Stub {
return mContext;
}
@NonNull /* package */ SystemFontSettings getCurrentFontSettings() {
@NonNull /* package */ SharedMemory getCurrentFontMap() {
synchronized (FontManagerService.this) {
if (mCurrentFontSettings == null) {
mCurrentFontSettings = SystemFontSettings.create(mUpdatableFontDir);
if (mSerializedFontMap == null) {
mSerializedFontMap = buildNewSerializedFontMap();
}
return mCurrentFontSettings;
return mSerializedFontMap;
}
}
@@ -207,7 +207,7 @@ public final class FontManagerService extends IFontManager.Stub {
synchronized (FontManagerService.this) {
mUpdatableFontDir.installFontFile(fd, pkcs7Signature);
// Create updated font map in the next getSerializedSystemFontMap() call.
mCurrentFontSettings = null;
mSerializedFontMap = null;
}
}
@@ -245,69 +245,44 @@ public final class FontManagerService extends IFontManager.Stub {
new FontManagerShellCommand(this).exec(this, in, out, err, args, callback, result);
}
/* package */ static class SystemFontSettings {
private final @NonNull SharedMemory mSerializedSystemFontMap;
private final @NonNull FontConfig mSystemFontConfig;
private final @NonNull Map<String, FontFamily[]> mSystemFallbackMap;
private final @NonNull Map<String, Typeface> mSystemTypefaceMap;
/**
* Returns an active system font configuration.
*/
public @NonNull FontConfig getSystemFontConfig() {
if (mUpdatableFontDir != null) {
return mUpdatableFontDir.getSystemFontConfig();
} else {
return SystemFonts.getSystemPreinstalledFontConfig();
}
}
SystemFontSettings(
@NonNull SharedMemory serializedSystemFontMap,
@NonNull FontConfig systemFontConfig,
@NonNull Map<String, FontFamily[]> systemFallbackMap,
@NonNull Map<String, Typeface> systemTypefaceMap) {
mSerializedSystemFontMap = serializedSystemFontMap;
mSystemFontConfig = systemFontConfig;
mSystemFallbackMap = systemFallbackMap;
mSystemTypefaceMap = systemTypefaceMap;
/**
* Make new serialized font map data.
*/
public @Nullable SharedMemory buildNewSerializedFontMap() {
try {
final FontConfig fontConfig = getSystemFontConfig();
final Map<String, FontFamily[]> fallback = SystemFonts.buildSystemFallback(fontConfig);
final Map<String, Typeface> typefaceMap =
SystemFonts.buildSystemTypefaces(fontConfig, fallback);
return Typeface.serializeFontMap(typefaceMap);
} catch (IOException | ErrnoException e) {
Slog.w(TAG, "Failed to serialize updatable font map. "
+ "Retrying with system image fonts.", e);
}
public @NonNull SharedMemory getSerializedSystemFontMap() {
return mSerializedSystemFontMap;
}
public @NonNull FontConfig getSystemFontConfig() {
return mSystemFontConfig;
}
public @NonNull Map<String, FontFamily[]> getSystemFallbackMap() {
return mSystemFallbackMap;
}
public @NonNull Map<String, Typeface> getSystemTypefaceMap() {
return mSystemTypefaceMap;
}
public static @Nullable SystemFontSettings create(
@Nullable UpdatableFontDir updatableFontDir) {
if (updatableFontDir != null) {
final FontConfig fontConfig = updatableFontDir.getSystemFontConfig();
final Map<String, FontFamily[]> fallback =
SystemFonts.buildSystemFallback(fontConfig);
final Map<String, Typeface> typefaceMap =
SystemFonts.buildSystemTypefaces(fontConfig, fallback);
try {
final SharedMemory shm = Typeface.serializeFontMap(typefaceMap);
return new SystemFontSettings(shm, fontConfig, fallback, typefaceMap);
} catch (IOException | ErrnoException e) {
Slog.w(TAG, "Failed to serialize updatable font map. "
+ "Retrying with system image fonts.", e);
}
}
try {
final FontConfig fontConfig = SystemFonts.getSystemPreinstalledFontConfig();
final Map<String, FontFamily[]> fallback = SystemFonts.buildSystemFallback(fontConfig);
final Map<String, Typeface> typefaceMap =
SystemFonts.buildSystemTypefaces(fontConfig, fallback);
try {
final SharedMemory shm = Typeface.serializeFontMap(typefaceMap);
return new SystemFontSettings(shm, fontConfig, fallback, typefaceMap);
} catch (IOException | ErrnoException e) {
Slog.e(TAG, "Failed to serialize SystemServer system font map", e);
}
return null;
return Typeface.serializeFontMap(typefaceMap);
} catch (IOException | ErrnoException e) {
Slog.e(TAG, "Failed to serialize SystemServer system font map", e);
}
return null;
}
}

View File

@@ -25,6 +25,7 @@ import android.graphics.fonts.Font;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.FontManager;
import android.graphics.fonts.FontVariationAxis;
import android.graphics.fonts.SystemFonts;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
import android.os.Process;
@@ -95,8 +96,8 @@ public class FontManagerShellCommand extends ShellCommand {
}
/* package */ void dumpAll(@NonNull IndentingPrintWriter w) {
final FontManagerService.SystemFontSettings settings = mService.getCurrentFontSettings();
dumpFontConfig(w, settings.getSystemFontConfig());
FontConfig fontConfig = mService.getSystemFontConfig();
dumpFontConfig(w, fontConfig);
}
private void dumpSingleFontConfig(
@@ -276,19 +277,19 @@ public class FontManagerShellCommand extends ShellCommand {
private int dump(ShellCommand shell) {
final Context ctx = mService.getContext();
final FontManagerService.SystemFontSettings settings =
mService.getCurrentFontSettings();
if (!DumpUtils.checkDumpPermission(ctx, TAG, shell.getErrPrintWriter())) {
return 1;
}
final IndentingPrintWriter writer =
new IndentingPrintWriter(shell.getOutPrintWriter(), " ");
String nextArg = shell.getNextArg();
FontConfig fontConfig = mService.getSystemFontConfig();
if (nextArg == null) {
dumpFontConfig(writer, settings.getSystemFontConfig());
dumpFontConfig(writer, fontConfig);
} else {
final Map<String, FontFamily[]> fallbackMap =
settings.getSystemFallbackMap();
SystemFonts.buildSystemFallback(fontConfig);
FontFamily[] families = fallbackMap.get(nextArg);
if (families == null) {
writer.println("Font Family \"" + nextArg + "\" not found");
@@ -364,10 +365,9 @@ public class FontManagerShellCommand extends ShellCommand {
}
private int status(ShellCommand shell) throws SystemFontException {
final FontManagerService.SystemFontSettings settings = mService.getCurrentFontSettings();
final IndentingPrintWriter writer =
new IndentingPrintWriter(shell.getOutPrintWriter(), " ");
FontConfig config = settings.getSystemFontConfig();
FontConfig config = mService.getSystemFontConfig();
writer.println("Current Version: " + config.getConfigVersion());
LocalDateTime dt = LocalDateTime.ofEpochSecond(config.getLastModifiedDate(), 0,