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

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

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

* changes:
  Revert^2 "[res] Dump resources timings in dumpsys"
  Revert "Revert "[res] Don't create extra asset provider when not..."
parents 7fd7758d ff7cced2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@ 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;
@@ -5283,6 +5284,7 @@ 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);
            }
+28 −28
Original line number Diff line number Diff line
@@ -17,13 +17,10 @@
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;
@@ -33,6 +30,7 @@ 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;
@@ -277,16 +275,18 @@ public final class ResourceTimer {
     * Update the metrics information and dump it.
     * @hide
     */
    public static void dumpTimers(@NonNull ParcelFileDescriptor pfd, @Nullable String[] args) {
        FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor());
        PrintWriter pw = new FastPrintWriter(fout);
    public static void dumpTimers(@NonNull FileDescriptor fd, String... args) {
        try (PrintWriter pw = new FastPrintWriter(new FileOutputStream(fd))) {
            pw.println("\nDumping ResourceTimers");

            final boolean enabled;
            synchronized (sLock) {
            if (!sEnabled || (sConfig == null)) {
                enabled = sEnabled && sConfig != null;
            }
            if (!enabled) {
                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
+55 −43
Original line number Diff line number Diff line
@@ -111,9 +111,8 @@ 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 (!assets_provider) ? EmptyAssetsProvider::Create()
                              : std::unique_ptr<AssetsProvider>(new LoaderAssetsProvider(
                                    env, assets_provider));
      return std::unique_ptr<AssetsProvider>{
              assets_provider ? new LoaderAssetsProvider(env, assets_provider) : nullptr};
  }

  bool ForEachFile(const std::string& /* root_path */,
@@ -212,7 +211,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(), str.size());
    debug_name_ = std::string(str.c_str());
  }

  // The global reference to the AssetsProvider
@@ -233,9 +232,9 @@ static jlong NativeLoad(JNIEnv* env, jclass /*clazz*/, const format_type_t forma
  AssetManager2::ApkAssetsPtr apk_assets;
  switch (format) {
    case FORMAT_APK: {
        auto assets = MultiAssetsProvider::Create(std::move(loader_assets),
                                                  ZipAssetsProvider::Create(path.c_str(),
                                                                            property_flags));
        auto assets = AssetsProvider::CreateWithOverride(ZipAssetsProvider::Create(path.c_str(),
                                                                                   property_flags),
                                                         std::move(loader_assets));
        apk_assets = ApkAssets::Load(std::move(assets), property_flags);
        break;
    }
@@ -243,13 +242,15 @@ static jlong NativeLoad(JNIEnv* env, jclass /*clazz*/, const format_type_t forma
      apk_assets = ApkAssets::LoadOverlay(path.c_str(), property_flags);
      break;
    case FORMAT_ARSC:
      apk_assets = ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFile(path.c_str()),
                                        std::move(loader_assets),
        apk_assets =
                ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFile(path.c_str()),
                                     AssetsProvider::CreateFromNullable(std::move(loader_assets)),
                                     property_flags);
        break;
    case FORMAT_DIRECTORY: {
      auto assets = MultiAssetsProvider::Create(std::move(loader_assets),
                                                DirectoryAssetsProvider::Create(path.c_str()));
        auto assets =
                AssetsProvider::CreateWithOverride(DirectoryAssetsProvider::Create(path.c_str()),
                                                   std::move(loader_assets));
        apk_assets = ApkAssets::Load(std::move(assets), property_flags);
        break;
    }
@@ -308,17 +309,20 @@ static jlong NativeLoadFromFd(JNIEnv* env, jclass /*clazz*/, const format_type_t
  switch (format) {
    case FORMAT_APK: {
        auto assets =
                MultiAssetsProvider::Create(std::move(loader_assets),
                                            ZipAssetsProvider::Create(std::move(dup_fd),
                                                                      friendly_name_utf8.c_str(),
                                                                      property_flags));
                AssetsProvider::CreateWithOverride(ZipAssetsProvider::Create(std::move(dup_fd),
                                                                             friendly_name_utf8
                                                                                     .c_str(),
                                                                             property_flags),
                                                   std::move(loader_assets));
        apk_assets = ApkAssets::Load(std::move(assets), property_flags);
        break;
    }
    case FORMAT_ARSC:
      apk_assets = ApkAssets::LoadTable(
          AssetsProvider::CreateAssetFromFd(std::move(dup_fd), nullptr /* path */),
          std::move(loader_assets), property_flags);
        apk_assets =
                ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFd(std::move(dup_fd),
                                                                       nullptr /* path */),
                                     AssetsProvider::CreateFromNullable(std::move(loader_assets)),
                                     property_flags);
        break;
    default:
      const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
@@ -375,22 +379,27 @@ static jlong NativeLoadFromFdOffset(JNIEnv* env, jclass /*clazz*/, const format_
  switch (format) {
    case FORMAT_APK: {
        auto assets =
                MultiAssetsProvider::Create(std::move(loader_assets),
                                            ZipAssetsProvider::Create(std::move(dup_fd),
                                                                      friendly_name_utf8.c_str(),
                AssetsProvider::CreateWithOverride(ZipAssetsProvider::Create(std::move(dup_fd),
                                                                             friendly_name_utf8
                                                                                     .c_str(),
                                                                             property_flags,
                                                                      static_cast<off64_t>(offset),
                                                                             static_cast<off64_t>(
                                                                              length)));
                                                                                     offset),
                                                                             static_cast<off64_t>(
                                                                                     length)),
                                                   std::move(loader_assets));
        apk_assets = ApkAssets::Load(std::move(assets), property_flags);
        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)),
          std::move(loader_assets), property_flags);
                                                                       static_cast<off64_t>(
                                                                               length)),
                                     AssetsProvider::CreateFromNullable(std::move(loader_assets)),
                                     property_flags);
        break;
    default:
      const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
@@ -408,10 +417,13 @@ 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(LoaderAssetsProvider::Create(env, assets_provider), flags);
    auto apk_assets = ApkAssets::Load(AssetsProvider::CreateFromNullable(
                                              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;
    }
+22 −4
Original line number Diff line number Diff line
@@ -24,9 +24,27 @@
#include <ziparchive/zip_archive.h>

namespace android {
namespace {
constexpr const char* kEmptyDebugString = "<empty>";
} // namespace

static constexpr std::string_view kEmptyDebugString = "<empty>";

std::unique_ptr<AssetsProvider> AssetsProvider::CreateWithOverride(
    std::unique_ptr<AssetsProvider> provider, std::unique_ptr<AssetsProvider> override) {
  if (provider == nullptr) {
    return {};
  }
  if (override == nullptr) {
    return provider;
  }
  return MultiAssetsProvider::Create(std::move(override), std::move(provider));
}

std::unique_ptr<AssetsProvider> AssetsProvider::CreateFromNullable(
    std::unique_ptr<AssetsProvider> nullable) {
  if (nullable) {
    return nullable;
  }
  return EmptyAssetsProvider::Create();
}

std::unique_ptr<Asset> AssetsProvider::Open(const std::string& path, Asset::AccessMode mode,
                                            bool* file_exists) const {
@@ -425,7 +443,7 @@ const std::string& EmptyAssetsProvider::GetDebugName() const {
  if (path_.has_value()) {
    return *path_;
  }
  const static std::string kEmpty = kEmptyDebugString;
  constexpr static std::string kEmpty{kEmptyDebugString};
  return kEmpty;
}

+6 −0
Original line number Diff line number Diff line
@@ -36,6 +36,12 @@ namespace android {
struct AssetsProvider {
  static constexpr off64_t kUnknownLength = -1;

  static std::unique_ptr<AssetsProvider> CreateWithOverride(
      std::unique_ptr<AssetsProvider> provider, std::unique_ptr<AssetsProvider> override);

  static std::unique_ptr<AssetsProvider> CreateFromNullable(
      std::unique_ptr<AssetsProvider> nullable);

  // Opens a file for reading. If `file_exists` is not null, it will be set to `true` if the file
  // exists. This is useful for determining if the file exists but was unable to be opened due to
  // an I/O error.
Loading