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

Commit b0085ce5 authored by Winson's avatar Winson
Browse files

Fix AssetManager2 isUpToDate check

This logic was lost in the AssetManager1 -> 2 migration.

The old AM1 checked the last modification time of the file
and compared it to a previously stored value. This re-adds the
logic to ApkAssets and fixes the checks in the JNI/Java layer.

Unfortunately I couldn't find a failing/practical case where
this check mattered. It only came up when diagnosing an issue
which ended up being unrelated.

Test: manually ran with other overlay changes

Change-Id: I758e4af1d32a9c03b2204a8a3a26e82b7e83feda
parent 83708c82
Loading
Loading
Loading
Loading
+10 −3
Original line number Original line Diff line number Diff line
@@ -1263,13 +1263,20 @@ public final class AssetManager implements AutoCloseable {
     */
     */
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    public boolean isUpToDate() {
    public boolean isUpToDate() {
        for (ApkAssets apkAssets : getApkAssets()) {
        synchronized (this) {
            if (!mOpen) {
                return false;
            }

            for (ApkAssets apkAssets : mApkAssets) {
                if (!apkAssets.isUpToDate()) {
                if (!apkAssets.isUpToDate()) {
                    return false;
                    return false;
                }
                }
            }
            }

            return true;
            return true;
        }
        }
    }


    /**
    /**
     * Get the locales that this asset manager contains data for.
     * Get the locales that this asset manager contains data for.
+1 −2
Original line number Original line Diff line number Diff line
@@ -106,8 +106,7 @@ static jlong NativeGetStringBlock(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr)


static jboolean NativeIsUpToDate(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
static jboolean NativeIsUpToDate(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
  (void)apk_assets;
  return apk_assets->IsUpToDate() ? JNI_TRUE : JNI_FALSE;
  return JNI_TRUE;
}
}


static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring file_name) {
static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring file_name) {
+12 −3
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@


#include "androidfw/Asset.h"
#include "androidfw/Asset.h"
#include "androidfw/Idmap.h"
#include "androidfw/Idmap.h"
#include "androidfw/misc.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/Util.h"
#include "androidfw/Util.h"


@@ -39,8 +40,10 @@ using base::unique_fd;


static const std::string kResourcesArsc("resources.arsc");
static const std::string kResourcesArsc("resources.arsc");


ApkAssets::ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path)
ApkAssets::ApkAssets(ZipArchiveHandle unmanaged_handle,
    : zip_handle_(unmanaged_handle, ::CloseArchive), path_(path) {
                     const std::string& path,
                     time_t last_mod_time)
    : zip_handle_(unmanaged_handle, ::CloseArchive), path_(path), last_mod_time_(last_mod_time) {
}
}


std::unique_ptr<const ApkAssets> ApkAssets::Load(const std::string& path, bool system) {
std::unique_ptr<const ApkAssets> ApkAssets::Load(const std::string& path, bool system) {
@@ -116,8 +119,10 @@ std::unique_ptr<const ApkAssets> ApkAssets::LoadImpl(
    return {};
    return {};
  }
  }


  time_t last_mod_time = getFileModDate(path.c_str());

  // Wrap the handle in a unique_ptr so it gets automatically closed.
  // Wrap the handle in a unique_ptr so it gets automatically closed.
  std::unique_ptr<ApkAssets> loaded_apk(new ApkAssets(unmanaged_handle, path));
  std::unique_ptr<ApkAssets> loaded_apk(new ApkAssets(unmanaged_handle, path, last_mod_time));


  // Find the resource table.
  // Find the resource table.
  ::ZipString entry_name(kResourcesArsc.c_str());
  ::ZipString entry_name(kResourcesArsc.c_str());
@@ -248,4 +253,8 @@ bool ApkAssets::ForEachFile(const std::string& root_path,
  return result == -1;
  return result == -1;
}
}


bool ApkAssets::IsUpToDate() const {
  return last_mod_time_ == getFileModDate(path_.c_str());
}

}  // namespace android
}  // namespace android
+4 −1
Original line number Original line Diff line number Diff line
@@ -84,6 +84,8 @@ class ApkAssets {
    return idmap_asset_.get() != nullptr;
    return idmap_asset_.get() != nullptr;
  }
  }


  bool IsUpToDate() const;

 private:
 private:
  DISALLOW_COPY_AND_ASSIGN(ApkAssets);
  DISALLOW_COPY_AND_ASSIGN(ApkAssets);


@@ -95,12 +97,13 @@ class ApkAssets {
  // Creates an Asset from any file on the file system.
  // Creates an Asset from any file on the file system.
  static std::unique_ptr<Asset> CreateAssetFromFile(const std::string& path);
  static std::unique_ptr<Asset> CreateAssetFromFile(const std::string& path);


  ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path);
  ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path, time_t last_mod_time);


  using ZipArchivePtr = std::unique_ptr<ZipArchive, void(*)(ZipArchiveHandle)>;
  using ZipArchivePtr = std::unique_ptr<ZipArchive, void(*)(ZipArchiveHandle)>;


  ZipArchivePtr zip_handle_;
  ZipArchivePtr zip_handle_;
  const std::string path_;
  const std::string path_;
  time_t last_mod_time_;
  std::unique_ptr<Asset> resources_asset_;
  std::unique_ptr<Asset> resources_asset_;
  std::unique_ptr<Asset> idmap_asset_;
  std::unique_ptr<Asset> idmap_asset_;
  std::unique_ptr<const LoadedArsc> loaded_arsc_;
  std::unique_ptr<const LoadedArsc> loaded_arsc_;