Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99b5b1cf authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "revert-31021037-TXGRFMNZKV" into main

* changes:
  Revert "[res] Optimize isUpToDate() for ApkAssets"
  Revert "[res] Optimize few functions for dtoh() as a noop"
  Revert "[res] Don't create extra asset provider when not needed"
  Revert "[res] Dump resources timings in dumpsys"
parents 4deeed99 99b48bdd
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -105,7 +105,6 @@ import android.content.pm.ServiceInfo;
import android.content.res.AssetManager;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.ResourceTimer;
import android.content.res.Resources;
import android.content.res.ResourcesImpl;
import android.content.res.loader.ResourcesLoader;
@@ -5254,7 +5253,6 @@ public final class ActivityThread extends ClientTransactionHandler

            Resources.dumpHistory(pw, "");
            pw.flush();
            ResourceTimer.dumpTimers(info.fd.getFileDescriptor(), "-refresh");
            if (info.finishCallback != null) {
                info.finishCallback.sendResult(null);
            }
+7 −49
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import android.content.res.loader.ResourcesProvider;
import android.ravenwood.annotation.RavenwoodClassLoadHook;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.text.TextUtils;
import android.util.Log;

import com.android.internal.annotations.GuardedBy;

@@ -51,7 +50,6 @@ import java.util.Objects;
@RavenwoodKeepWholeClass
@RavenwoodClassLoadHook(RavenwoodClassLoadHook.LIBANDROID_LOADING_HOOK)
public final class ApkAssets {
    private static final boolean DEBUG = false;

    /**
     * The apk assets contains framework resource values specified by the system.
@@ -136,17 +134,6 @@ public final class ApkAssets {
    @Nullable
    private final AssetsProvider mAssets;

    @NonNull
    private String mName;

    private static final int UPTODATE_FALSE = 0;
    private static final int UPTODATE_TRUE = 1;
    private static final int UPTODATE_ALWAYS_TRUE = 2;

    // Start with the only value that may change later and would force a native call to
    // double check it.
    private int mPreviousUpToDateResult = UPTODATE_TRUE;

    /**
     * Creates a new ApkAssets instance from the given path on disk.
     *
@@ -317,7 +304,7 @@ public final class ApkAssets {

    private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags,
            @Nullable AssetsProvider assets) throws IOException {
        this(format, flags, assets, path);
        this(format, flags, assets);
        Objects.requireNonNull(path, "path");
        mNativePtr = nativeLoad(format, path, flags, assets);
        mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
@@ -326,7 +313,7 @@ public final class ApkAssets {
    private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
            @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets)
            throws IOException {
        this(format, flags, assets, friendlyName);
        this(format, flags, assets);
        Objects.requireNonNull(fd, "fd");
        Objects.requireNonNull(friendlyName, "friendlyName");
        mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets);
@@ -336,7 +323,7 @@ public final class ApkAssets {
    private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
            @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags,
            @Nullable AssetsProvider assets) throws IOException {
        this(format, flags, assets, friendlyName);
        this(format, flags, assets);
        Objects.requireNonNull(fd, "fd");
        Objects.requireNonNull(friendlyName, "friendlyName");
        mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets);
@@ -344,17 +331,16 @@ public final class ApkAssets {
    }

    private ApkAssets(@PropertyFlags int flags, @Nullable AssetsProvider assets) {
        this(FORMAT_APK, flags, assets, "empty");
        this(FORMAT_APK, flags, assets);
        mNativePtr = nativeLoadEmpty(flags, assets);
        mStringBlock = null;
    }

    private ApkAssets(@FormatType int format, @PropertyFlags int flags,
            @Nullable AssetsProvider assets, @NonNull String name) {
            @Nullable AssetsProvider assets) {
        mFlags = flags;
        mAssets = assets;
        mIsOverlay = format == FORMAT_IDMAP;
        if (DEBUG) mName = name;
    }

    @UnsupportedAppUsage
@@ -435,41 +421,13 @@ public final class ApkAssets {
        }
    }

    private static double intervalMs(long beginNs, long endNs) {
        return (endNs - beginNs) / 1000000.0;
    }

    /**
     * Returns false if the underlying APK was changed since this ApkAssets was loaded.
     */
    public boolean isUpToDate() {
        // This function is performance-critical - it's called multiple times on every Resources
        // object creation, and on few other cache accesses - so it's important to avoid the native
        // call when we know for sure what it will return (which is the case for both ALWAYS_TRUE
        // and FALSE).
        if (mPreviousUpToDateResult != UPTODATE_TRUE) {
            return mPreviousUpToDateResult == UPTODATE_ALWAYS_TRUE;
        }
        final long beforeTs, afterLockTs, afterNativeTs, afterUnlockTs;
        if (DEBUG) beforeTs = System.nanoTime();
        final int res;
        synchronized (this) {
            if (DEBUG) afterLockTs = System.nanoTime();
            res = nativeIsUpToDate(mNativePtr);
            if (DEBUG) afterNativeTs = System.nanoTime();
        }
        if (DEBUG) {
            afterUnlockTs = System.nanoTime();
            if (afterUnlockTs - beforeTs >= 10L * 1000000) {
                Log.d("ApkAssets", "isUpToDate(" + mName + ") took "
                        + intervalMs(beforeTs, afterUnlockTs)
                        + " ms: " + intervalMs(beforeTs, afterLockTs)
                        + " / " + intervalMs(afterLockTs, afterNativeTs)
                        + " / " + intervalMs(afterNativeTs, afterUnlockTs));
            }
            return nativeIsUpToDate(mNativePtr);
        }
        mPreviousUpToDateResult = res;
        return res != UPTODATE_FALSE;
    }

    public boolean isSystem() {
@@ -529,7 +487,7 @@ public final class ApkAssets {
    private static native @NonNull String nativeGetAssetPath(long ptr);
    private static native @NonNull String nativeGetDebugName(long ptr);
    private static native long nativeGetStringBlock(long ptr);
    @CriticalNative private static native int nativeIsUpToDate(long ptr);
    @CriticalNative private static native boolean nativeIsUpToDate(long ptr);
    private static native long nativeOpenXml(long ptr, @NonNull String fileName) throws IOException;
    private static native @Nullable OverlayableInfo nativeGetOverlayableInfo(long ptr,
            String overlayableName) throws IOException;
+28 −28
Original line number Diff line number Diff line
@@ -17,10 +17,13 @@
package android.content.res;

import android.annotation.NonNull;
import android.annotation.Nullable;

import android.app.AppProtoEnums;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.SystemClock;
import android.text.TextUtils;
@@ -30,7 +33,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FrameworkStatsLog;

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -275,18 +277,16 @@ public final class ResourceTimer {
     * Update the metrics information and dump it.
     * @hide
     */
    public static void dumpTimers(@NonNull FileDescriptor fd, String... args) {
        try (PrintWriter pw = new FastPrintWriter(new FileOutputStream(fd))) {
            pw.println("\nDumping ResourceTimers");

            final boolean enabled;
    public static void dumpTimers(@NonNull ParcelFileDescriptor pfd, @Nullable String[] args) {
        FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor());
        PrintWriter pw = new FastPrintWriter(fout);
        synchronized (sLock) {
                enabled = sEnabled && sConfig != null;
            }
            if (!enabled) {
            if (!sEnabled || (sConfig == null)) {
                pw.println("  Timers are not enabled in this process");
                pw.flush();
                return;
            }
        }

        // Look for the --refresh switch.  If the switch is present, then sTimers is updated.
        // Otherwise, the current value of sTimers is displayed.
@@ -308,7 +308,7 @@ public final class ResourceTimer {
                }
            }
        }
        }
        pw.flush();
    }

    // Enable (or disabled) the runtime timers.  Note that timers are disabled by default.  This
+30 −36
Original line number Diff line number Diff line
@@ -111,8 +111,9 @@ static void DeleteGuardedApkAssets(Guarded<AssetManager2::ApkAssetsPtr>& apk_ass
class LoaderAssetsProvider : public AssetsProvider {
 public:
  static std::unique_ptr<AssetsProvider> Create(JNIEnv* env, jobject assets_provider) {
      return std::unique_ptr<AssetsProvider>{
              assets_provider ? new LoaderAssetsProvider(env, assets_provider) : nullptr};
    return (!assets_provider) ? EmptyAssetsProvider::Create()
                              : std::unique_ptr<AssetsProvider>(new LoaderAssetsProvider(
                                    env, assets_provider));
  }

  bool ForEachFile(const std::string& /* root_path */,
@@ -128,8 +129,8 @@ class LoaderAssetsProvider : public AssetsProvider {
    return debug_name_;
  }

  UpToDate IsUpToDate() const override {
      return UpToDate::Always;
  bool IsUpToDate() const override {
    return true;
  }

  ~LoaderAssetsProvider() override {
@@ -211,7 +212,7 @@ class LoaderAssetsProvider : public AssetsProvider {
    auto string_result = static_cast<jstring>(env->CallObjectMethod(
        assets_provider_, gAssetsProviderOffsets.toString));
    ScopedUtfChars str(env, string_result);
    debug_name_ = std::string(str.c_str());
    debug_name_ = std::string(str.c_str(), str.size());
  }

  // The global reference to the AssetsProvider
@@ -243,7 +244,7 @@ static jlong NativeLoad(JNIEnv* env, jclass /*clazz*/, const format_type_t forma
      break;
    case FORMAT_ARSC:
      apk_assets = ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFile(path.c_str()),
                                          MultiAssetsProvider::Create(std::move(loader_assets)),
                                        std::move(loader_assets),
                                        property_flags);
      break;
    case FORMAT_DIRECTORY: {
@@ -315,10 +316,9 @@ static jlong NativeLoadFromFd(JNIEnv* env, jclass /*clazz*/, const format_type_t
        break;
    }
    case FORMAT_ARSC:
        apk_assets = ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFd(std::move(dup_fd),
                                                                            nullptr /* path */),
                                          MultiAssetsProvider::Create(std::move(loader_assets)),
                                          property_flags);
      apk_assets = ApkAssets::LoadTable(
          AssetsProvider::CreateAssetFromFd(std::move(dup_fd), nullptr /* path */),
          std::move(loader_assets), property_flags);
      break;
    default:
      const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
@@ -386,14 +386,11 @@ static jlong NativeLoadFromFdOffset(JNIEnv* env, jclass /*clazz*/, const format_
        break;
    }
    case FORMAT_ARSC:
        apk_assets =
                ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFd(std::move(dup_fd),
                                                                       nullptr /* path */,
      apk_assets = ApkAssets::LoadTable(
          AssetsProvider::CreateAssetFromFd(std::move(dup_fd), nullptr /* path */,
                                            static_cast<off64_t>(offset),
                                                                       static_cast<off64_t>(
                                                                               length)),
                                     MultiAssetsProvider::Create(std::move(loader_assets)),
                                     property_flags);
                                            static_cast<off64_t>(length)),
          std::move(loader_assets), property_flags);
      break;
    default:
      const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
@@ -411,13 +408,10 @@ static jlong NativeLoadFromFdOffset(JNIEnv* env, jclass /*clazz*/, const format_
}

static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jint flags, jobject assets_provider) {
    auto apk_assets = ApkAssets::Load(MultiAssetsProvider::Create(
                                              LoaderAssetsProvider::Create(env, assets_provider)),
                                      flags);
  auto apk_assets = ApkAssets::Load(LoaderAssetsProvider::Create(env, assets_provider), flags);
  if (apk_assets == nullptr) {
    const std::string error_msg =
                base::StringPrintf("Failed to load empty assets with provider %p",
                                   (void*)assets_provider);
        base::StringPrintf("Failed to load empty assets with provider %p", (void*)assets_provider);
    jniThrowException(env, "java/io/IOException", error_msg.c_str());
    return 0;
  }
@@ -449,10 +443,10 @@ static jlong NativeGetStringBlock(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr)
    return reinterpret_cast<jlong>(apk_assets->GetLoadedArsc()->GetStringPool());
}

static jint NativeIsUpToDate(CRITICAL_JNI_PARAMS_COMMA jlong ptr) {
static jboolean NativeIsUpToDate(CRITICAL_JNI_PARAMS_COMMA jlong ptr) {
    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
    auto apk_assets = scoped_apk_assets->get();
    return (jint)apk_assets->IsUpToDate();
    return apk_assets->IsUpToDate() ? JNI_TRUE : JNI_FALSE;
}

static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring file_name) {
@@ -564,7 +558,7 @@ static const JNINativeMethod gApkAssetsMethods[] = {
        {"nativeGetDebugName", "(J)Ljava/lang/String;", (void*)NativeGetDebugName},
        {"nativeGetStringBlock", "(J)J", (void*)NativeGetStringBlock},
        // @CriticalNative
        {"nativeIsUpToDate", "(J)I", (void*)NativeIsUpToDate},
        {"nativeIsUpToDate", "(J)Z", (void*)NativeIsUpToDate},
        {"nativeOpenXml", "(JLjava/lang/String;)J", (void*)NativeOpenXml},
        {"nativeGetOverlayableInfo", "(JLjava/lang/String;)Landroid/content/om/OverlayableInfo;",
         (void*)NativeGetOverlayableInfo},
+3 −6
Original line number Diff line number Diff line
@@ -162,13 +162,10 @@ const std::string& ApkAssets::GetDebugName() const {
  return assets_provider_->GetDebugName();
}

UpToDate ApkAssets::IsUpToDate() const {
bool ApkAssets::IsUpToDate() const {
  // Loaders are invalidated by the app, not the system, so assume they are up to date.
  if (IsLoader()) {
    return UpToDate::Always;
  }
  const auto idmap_res = loaded_idmap_ ? loaded_idmap_->IsUpToDate() : UpToDate::Always;
  return combine(idmap_res, [this] { return assets_provider_->IsUpToDate(); });
  return IsLoader() || ((!loaded_idmap_ || loaded_idmap_->IsUpToDate())
                        && assets_provider_->IsUpToDate());
}

}  // namespace android
Loading