diff options
80 files changed, 669 insertions, 378 deletions
diff --git a/api/current.txt b/api/current.txt index 182dd3a33bfe..8f1823bab7c4 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1470,6 +1470,8 @@ package android { field public static final int vendor = 16843751; // 0x10103e7 field public static final int version = 16844057; // 0x1010519 field public static final int versionCode = 16843291; // 0x101021b + field public static final int versionCodeMajor = 16844150; // 0x1010576 + field public static final int versionMajor = 16844151; // 0x1010577 field public static final int versionName = 16843292; // 0x101021c field public static final int verticalCorrection = 16843322; // 0x101023a field public static final int verticalDivider = 16843054; // 0x101012e @@ -6766,6 +6768,7 @@ package android.app.backup { method public void onFullBackup(android.app.backup.FullBackupDataOutput) throws java.io.IOException; method public void onQuotaExceeded(long, long); method public abstract void onRestore(android.app.backup.BackupDataInput, int, android.os.ParcelFileDescriptor) throws java.io.IOException; + method public void onRestore(android.app.backup.BackupDataInput, long, android.os.ParcelFileDescriptor) throws java.io.IOException; method public void onRestoreFile(android.os.ParcelFileDescriptor, long, java.io.File, int, long, long) throws java.io.IOException; method public void onRestoreFinished(); field public static final int TYPE_DIRECTORY = 2; // 0x2 @@ -10584,6 +10587,8 @@ package android.content.pm { public class PackageInfo implements android.os.Parcelable { ctor public PackageInfo(); method public int describeContents(); + method public long getLongVersionCode(); + method public void setLongVersionCode(long); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.PackageInfo> CREATOR; field public static final int INSTALL_LOCATION_AUTO = 0; // 0x0 @@ -10613,7 +10618,7 @@ package android.content.pm { field public android.content.pm.Signature[] signatures; field public java.lang.String[] splitNames; field public int[] splitRevisionCodes; - field public int versionCode; + field public deprecated int versionCode; field public java.lang.String versionName; } @@ -11128,9 +11133,10 @@ package android.content.pm { method public int describeContents(); method public android.content.pm.VersionedPackage getDeclaringPackage(); method public java.util.List<android.content.pm.VersionedPackage> getDependentPackages(); + method public long getLongVersion(); method public java.lang.String getName(); method public int getType(); - method public int getVersion(); + method public deprecated int getVersion(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.SharedLibraryInfo> CREATOR; field public static final int TYPE_BUILTIN = 0; // 0x0 @@ -11224,9 +11230,11 @@ package android.content.pm { public final class VersionedPackage implements android.os.Parcelable { ctor public VersionedPackage(java.lang.String, int); + ctor public VersionedPackage(java.lang.String, long); method public int describeContents(); + method public long getLongVersionCode(); method public java.lang.String getPackageName(); - method public int getVersionCode(); + method public deprecated int getVersionCode(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.VersionedPackage> CREATOR; } diff --git a/api/system-current.txt b/api/system-current.txt index 4cf9d955e29e..930f76be60c3 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -409,8 +409,9 @@ package android.app.backup { field public static final java.lang.String EXTRA_LOG_CANCEL_ALL = "android.app.backup.extra.LOG_CANCEL_ALL"; field public static final java.lang.String EXTRA_LOG_EVENT_CATEGORY = "android.app.backup.extra.LOG_EVENT_CATEGORY"; field public static final java.lang.String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID"; + field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_FULL_VERSION"; field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME"; - field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION"; + field public static final deprecated java.lang.String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION"; field public static final java.lang.String EXTRA_LOG_EXCEPTION_FULL_BACKUP = "android.app.backup.extra.LOG_EXCEPTION_FULL_BACKUP"; field public static final java.lang.String EXTRA_LOG_ILLEGAL_KEY = "android.app.backup.extra.LOG_ILLEGAL_KEY"; field public static final java.lang.String EXTRA_LOG_MANIFEST_PACKAGE_NAME = "android.app.backup.extra.LOG_MANIFEST_PACKAGE_NAME"; @@ -777,13 +778,15 @@ package android.content.pm { public final class InstantAppResolveInfo implements android.os.Parcelable { ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List<android.content.pm.InstantAppIntentFilter>, int); + ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List<android.content.pm.InstantAppIntentFilter>, long); ctor public InstantAppResolveInfo(java.lang.String, java.lang.String, java.util.List<android.content.pm.InstantAppIntentFilter>); method public int describeContents(); method public byte[] getDigestBytes(); method public int getDigestPrefix(); method public java.util.List<android.content.pm.InstantAppIntentFilter> getIntentFilters(); + method public long getLongVersionCode(); method public java.lang.String getPackageName(); - method public int getVersionCode(); + method public deprecated int getVersionCode(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.pm.InstantAppResolveInfo> CREATOR; } diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 9259793df2ac..2316860be60c 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -551,7 +551,7 @@ status_t StatsService::cmd_dump_memory_info(FILE* out) { return NO_ERROR; } -Status StatsService::informAllUidData(const vector<int32_t>& uid, const vector<int32_t>& version, +Status StatsService::informAllUidData(const vector<int32_t>& uid, const vector<int64_t>& version, const vector<String16>& app) { VLOG("StatsService::informAllUidData was called"); @@ -566,7 +566,7 @@ Status StatsService::informAllUidData(const vector<int32_t>& uid, const vector<i return Status::ok(); } -Status StatsService::informOnePackage(const String16& app, int32_t uid, int32_t version) { +Status StatsService::informOnePackage(const String16& app, int32_t uid, int64_t version) { VLOG("StatsService::informOnePackage was called"); if (IPCThreadState::self()->getCallingUid() != AID_SYSTEM) { diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index 007227e325f7..c332a94d2a5c 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -54,9 +54,9 @@ public: virtual Status statsCompanionReady(); virtual Status informAnomalyAlarmFired(); virtual Status informPollAlarmFired(); - virtual Status informAllUidData(const vector<int32_t>& uid, const vector<int32_t>& version, + virtual Status informAllUidData(const vector<int32_t>& uid, const vector<int64_t>& version, const vector<String16>& app); - virtual Status informOnePackage(const String16& app, int32_t uid, int32_t version); + virtual Status informOnePackage(const String16& app, int32_t uid, int64_t version); virtual Status informOnePackageRemoved(const String16& app, int32_t uid); virtual Status writeDataToDisk(); diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h index ce38f5832047..800a2b9d186a 100644 --- a/cmds/statsd/src/metrics/CountMetricProducer.h +++ b/cmds/statsd/src/metrics/CountMetricProducer.h @@ -51,7 +51,8 @@ public: void finish() override; // TODO: Implement this later. - virtual void notifyAppUpgrade(const string& apk, const int uid, const int version) override{}; + virtual void notifyAppUpgrade(const string& apk, const int uid, const int64_t version) + override{}; // TODO: Implement this later. virtual void notifyAppRemoved(const string& apk, const int uid) override{}; diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h index 8e32d148e221..f40415f4fe05 100644 --- a/cmds/statsd/src/metrics/DurationMetricProducer.h +++ b/cmds/statsd/src/metrics/DurationMetricProducer.h @@ -48,7 +48,8 @@ public: void finish() override; // TODO: Implement this later. - virtual void notifyAppUpgrade(const string& apk, const int uid, const int version) override{}; + virtual void notifyAppUpgrade(const string& apk, const int uid, const int64_t version) + override{}; // TODO: Implement this later. virtual void notifyAppRemoved(const string& apk, const int uid) override{}; diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h index afb48c4b9cef..da3b3cab49ba 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.h +++ b/cmds/statsd/src/metrics/EventMetricProducer.h @@ -43,7 +43,8 @@ public: void finish() override; // TODO: Implement this later. - virtual void notifyAppUpgrade(const string& apk, const int uid, const int version) override{}; + virtual void notifyAppUpgrade(const string& apk, const int uid, const int64_t version) + override{}; // TODO: Implement this later. virtual void notifyAppRemoved(const string& apk, const int uid) override{}; diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h index c839c09f953c..36705b1f3cbe 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.h +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h @@ -59,7 +59,8 @@ public: void finish() override; // TODO: Implement this later. - virtual void notifyAppUpgrade(const string& apk, const int uid, const int version) override{}; + virtual void notifyAppUpgrade(const string& apk, const int uid, const int64_t version) + override{}; // TODO: Implement this later. virtual void notifyAppRemoved(const string& apk, const int uid) override{}; diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h index 60b725d2ab55..a2efd3fa976b 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.h +++ b/cmds/statsd/src/metrics/ValueMetricProducer.h @@ -49,7 +49,8 @@ public: void onDataPulled(const std::vector<std::shared_ptr<LogEvent>>& data) override; // TODO: Implement this later. - virtual void notifyAppUpgrade(const string& apk, const int uid, const int version) override{}; + virtual void notifyAppUpgrade(const string& apk, const int uid, const int64_t version) + override{}; // TODO: Implement this later. virtual void notifyAppRemoved(const string& apk, const int uid) override{}; diff --git a/cmds/statsd/src/packages/PackageInfoListener.h b/cmds/statsd/src/packages/PackageInfoListener.h index 5aa3db573c70..bc8b0deb7231 100644 --- a/cmds/statsd/src/packages/PackageInfoListener.h +++ b/cmds/statsd/src/packages/PackageInfoListener.h @@ -28,7 +28,7 @@ class PackageInfoListener : public virtual android::RefBase { public: // Uid map will notify this listener that the app with apk name and uid has been upgraded to // the specified version. - virtual void notifyAppUpgrade(const std::string& apk, const int uid, const int version) = 0; + virtual void notifyAppUpgrade(const std::string& apk, const int uid, const int64_t version) = 0; // Notify interested listeners that the given apk and uid combination no longer exits. virtual void notifyAppRemoved(const std::string& apk, const int uid) = 0; diff --git a/cmds/statsd/src/packages/UidMap.cpp b/cmds/statsd/src/packages/UidMap.cpp index db592e2c5841..6e7a613b05a3 100644 --- a/cmds/statsd/src/packages/UidMap.cpp +++ b/cmds/statsd/src/packages/UidMap.cpp @@ -23,6 +23,8 @@ #include <binder/IServiceManager.h> #include <utils/Errors.h> +#include <inttypes.h> + using namespace android; namespace android { @@ -46,7 +48,7 @@ bool UidMap::hasApp(int uid, const string& packageName) const { return false; } -int UidMap::getAppVersion(int uid, const string& packageName) const { +int64_t UidMap::getAppVersion(int uid, const string& packageName) const { lock_guard<mutex> lock(mMutex); auto range = mMap.equal_range(uid); @@ -58,13 +60,13 @@ int UidMap::getAppVersion(int uid, const string& packageName) const { return 0; } -void UidMap::updateMap(const vector<int32_t>& uid, const vector<int32_t>& versionCode, +void UidMap::updateMap(const vector<int32_t>& uid, const vector<int64_t>& versionCode, const vector<String16>& packageName) { updateMap(time(nullptr) * NS_PER_SEC, uid, versionCode, packageName); } void UidMap::updateMap(const int64_t& timestamp, const vector<int32_t>& uid, - const vector<int32_t>& versionCode, const vector<String16>& packageName) { + const vector<int64_t>& versionCode, const vector<String16>& packageName) { lock_guard<mutex> lock(mMutex); // Exclusively lock for updates. mMap.clear(); @@ -87,12 +89,12 @@ void UidMap::updateMap(const int64_t& timestamp, const vector<int32_t>& uid, ensureBytesUsedBelowLimit(); } -void UidMap::updateApp(const String16& app_16, const int32_t& uid, const int32_t& versionCode) { +void UidMap::updateApp(const String16& app_16, const int32_t& uid, const int64_t& versionCode) { updateApp(time(nullptr) * NS_PER_SEC, app_16, uid, versionCode); } void UidMap::updateApp(const int64_t& timestamp, const String16& app_16, const int32_t& uid, - const int32_t& versionCode) { + const int64_t& versionCode) { lock_guard<mutex> lock(mMutex); string app = string(String8(app_16).string()); @@ -116,7 +118,7 @@ void UidMap::updateApp(const int64_t& timestamp, const String16& app_16, const i auto range = mMap.equal_range(int(uid)); for (auto it = range.first; it != range.second; ++it) { if (it->second.packageName == app) { - it->second.versionCode = int(versionCode); + it->second.versionCode = versionCode; return; } VLOG("updateApp failed to find the app %s with uid %i to update", app.c_str(), uid); @@ -124,7 +126,7 @@ void UidMap::updateApp(const int64_t& timestamp, const String16& app_16, const i } // Otherwise, we need to add an app at this uid. - mMap.insert(make_pair(uid, AppData(app, int(versionCode)))); + mMap.insert(make_pair(uid, AppData(app, versionCode))); } void UidMap::ensureBytesUsedBelowLimit() { @@ -298,8 +300,8 @@ void UidMap::printUidMap(FILE* out) { lock_guard<mutex> lock(mMutex); for (auto it : mMap) { - fprintf(out, "%s, v%d (%i)\n", it.second.packageName.c_str(), it.second.versionCode, - it.first); + fprintf(out, "%s, v%" PRId64 " (%i)\n", it.second.packageName.c_str(), + it.second.versionCode, it.first); } } diff --git a/cmds/statsd/src/packages/UidMap.h b/cmds/statsd/src/packages/UidMap.h index d2971c9b8a8d..9e1ad6946af2 100644 --- a/cmds/statsd/src/packages/UidMap.h +++ b/cmds/statsd/src/packages/UidMap.h @@ -41,9 +41,9 @@ namespace statsd { struct AppData { const string packageName; - int versionCode; + int64_t versionCode; - AppData(const string& a, const int v) : packageName(a), versionCode(v){}; + AppData(const string& a, const int64_t v) : packageName(a), versionCode(v){}; }; // UidMap keeps track of what the corresponding app name (APK name) and version code for every uid @@ -57,16 +57,16 @@ public: * All three inputs must be the same size, and the jth element in each array refers to the same * tuple, ie. uid[j] corresponds to packageName[j] with versionCode[j]. */ - void updateMap(const vector<int32_t>& uid, const vector<int32_t>& versionCode, + void updateMap(const vector<int32_t>& uid, const vector<int64_t>& versionCode, const vector<String16>& packageName); - void updateApp(const String16& packageName, const int32_t& uid, const int32_t& versionCode); + void updateApp(const String16& packageName, const int32_t& uid, const int64_t& versionCode); void removeApp(const String16& packageName, const int32_t& uid); // Returns true if the given uid contains the specified app (eg. com.google.android.gms). bool hasApp(int uid, const string& packageName) const; - int getAppVersion(int uid, const string& packageName) const; + int64_t getAppVersion(int uid, const string& packageName) const; // Helper for debugging contents of this uid map. Can be triggered with: // adb shell cmd stats print-uid-map @@ -104,10 +104,10 @@ public: private: void updateMap(const int64_t& timestamp, const vector<int32_t>& uid, - const vector<int32_t>& versionCode, const vector<String16>& packageName); + const vector<int64_t>& versionCode, const vector<String16>& packageName); void updateApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid, - const int32_t& versionCode); + const int64_t& versionCode); void removeApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid); UidMapping getOutput(const int64_t& timestamp, const ConfigKey& key); diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index cc8a26de1a8d..60d9a3dbb9d2 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -102,7 +102,7 @@ message UidMapping { message PackageInfo { optional string name = 1; - optional int32 version = 2; + optional int64 version = 2; optional int32 uid = 3; } @@ -119,7 +119,7 @@ message UidMapping { optional string app = 3; optional int32 uid = 4; - optional int32 version = 5; + optional int64 version = 5; } repeated Change changes = 2; } diff --git a/cmds/statsd/tests/UidMap_test.cpp b/cmds/statsd/tests/UidMap_test.cpp index aa194e625060..5b2ceddc6858 100644 --- a/cmds/statsd/tests/UidMap_test.cpp +++ b/cmds/statsd/tests/UidMap_test.cpp @@ -61,7 +61,7 @@ TEST(UidMapTest, TestIsolatedUID) { TEST(UidMapTest, TestMatching) { UidMap m; vector<int32_t> uids; - vector<int32_t> versions; + vector<int64_t> versions; vector<String16> apps; uids.push_back(1000); @@ -79,7 +79,7 @@ TEST(UidMapTest, TestMatching) { TEST(UidMapTest, TestAddAndRemove) { UidMap m; vector<int32_t> uids; - vector<int32_t> versions; + vector<int64_t> versions; vector<String16> apps; uids.push_back(1000); @@ -107,7 +107,7 @@ TEST(UidMapTest, TestClearingOutput) { m.OnConfigUpdated(config1); vector<int32_t> uids; - vector<int32_t> versions; + vector<int64_t> versions; vector<String16> apps; uids.push_back(1000); uids.push_back(1000); @@ -161,7 +161,7 @@ TEST(UidMapTest, TestMemoryComputed) { size_t startBytes = m.mBytesUsed; vector<int32_t> uids; - vector<int32_t> versions; + vector<int64_t> versions; vector<String16> apps; uids.push_back(1000); apps.push_back(String16(kApp1.c_str())); @@ -191,7 +191,7 @@ TEST(UidMapTest, TestMemoryGuardrail) { size_t startBytes = m.mBytesUsed; vector<int32_t> uids; - vector<int32_t> versions; + vector<int64_t> versions; vector<String16> apps; for (int i = 0; i < 100; i++) { uids.push_back(1); diff --git a/core/java/android/app/IBackupAgent.aidl b/core/java/android/app/IBackupAgent.aidl index a07374b80408..4a85efd9e4c2 100644 --- a/core/java/android/app/IBackupAgent.aidl +++ b/core/java/android/app/IBackupAgent.aidl @@ -79,7 +79,7 @@ oneway interface IBackupAgent { * passed here as a convenience to the agent. */ void doRestore(in ParcelFileDescriptor data, - int appVersionCode, in ParcelFileDescriptor newState, + long appVersionCode, in ParcelFileDescriptor newState, int token, IBackupManager callbackBinder); /** diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index 7aa80d263976..861cb9a8d035 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -263,6 +263,17 @@ public abstract class BackupAgent extends ContextWrapper { ParcelFileDescriptor newState) throws IOException; /** + * New version of {@link #onRestore(BackupDataInput, int, android.os.ParcelFileDescriptor)} + * that handles a long app version code. Default implementation casts the version code to + * an int and calls {@link #onRestore(BackupDataInput, int, android.os.ParcelFileDescriptor)}. + */ + public void onRestore(BackupDataInput data, long appVersionCode, + ParcelFileDescriptor newState) + throws IOException { + onRestore(data, (int) appVersionCode, newState); + } + + /** * The application is having its entire file system contents backed up. {@code data} * points to the backup destination, and the app has the opportunity to choose which * files are to be stored. To commit a file as part of the backup, call the @@ -947,7 +958,7 @@ public abstract class BackupAgent extends ContextWrapper { } @Override - public void doRestore(ParcelFileDescriptor data, int appVersionCode, + public void doRestore(ParcelFileDescriptor data, long appVersionCode, ParcelFileDescriptor newState, int token, IBackupManager callbackBinder) throws RemoteException { // Ensure that we're running with the app's normal permission level diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java index ebad16e0bc3d..ae4a98a4e06e 100644 --- a/core/java/android/app/backup/BackupManagerMonitor.java +++ b/core/java/android/app/backup/BackupManagerMonitor.java @@ -40,9 +40,14 @@ public class BackupManagerMonitor { /** string : the package name */ public static final String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME"; - /** int : the versionCode of the package named by EXTRA_LOG_EVENT_PACKAGE_NAME */ + /** int : the versionCode of the package named by EXTRA_LOG_EVENT_PACKAGE_NAME + * @deprecated Use {@link #EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION} */ + @Deprecated public static final String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION"; + /** long : the full versionCode of the package named by EXTRA_LOG_EVENT_PACKAGE_NAME */ + public static final String EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION = + "android.app.backup.extra.LOG_EVENT_PACKAGE_FULL_VERSION"; /** int : the id of the log message, will be a unique identifier */ public static final String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID"; /** diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index bad452cef977..90f44425dd97 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4456,11 +4456,19 @@ public class Intent implements Parcelable, Cloneable { /** * The version code of the app to install components from. + * @deprecated Use {@link #EXTRA_LONG_VERSION_CODE). * @hide */ + @Deprecated public static final String EXTRA_VERSION_CODE = "android.intent.extra.VERSION_CODE"; /** + * The version code of the app to install components from. + * @hide + */ + public static final String EXTRA_LONG_VERSION_CODE = "android.intent.extra.LONG_VERSION_CODE"; + + /** * The app that triggered the ephemeral installation. * @hide */ diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index edb27cd4ecf1..4a2a01e6199b 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -888,7 +888,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * The app's declared version code. * @hide */ - public int versionCode; + public long versionCode; /** * The user-visible SDK version (ex. 26) of the framework against which the application claims @@ -1315,7 +1315,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeInt(uid); dest.writeInt(minSdkVersion); dest.writeInt(targetSdkVersion); - dest.writeInt(versionCode); + dest.writeLong(versionCode); dest.writeInt(enabled ? 1 : 0); dest.writeInt(enabledSetting); dest.writeInt(installLocation); @@ -1384,7 +1384,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { uid = source.readInt(); minSdkVersion = source.readInt(); targetSdkVersion = source.readInt(); - versionCode = source.readInt(); + versionCode = source.readLong(); enabled = source.readInt() != 0; enabledSetting = source.readInt(); installLocation = source.readInt(); diff --git a/core/java/android/content/pm/AuxiliaryResolveInfo.java b/core/java/android/content/pm/AuxiliaryResolveInfo.java index 067363d43adf..6bdcefbe974e 100644 --- a/core/java/android/content/pm/AuxiliaryResolveInfo.java +++ b/core/java/android/content/pm/AuxiliaryResolveInfo.java @@ -45,7 +45,7 @@ public final class AuxiliaryResolveInfo extends IntentFilter { /** Opaque token to track the instant application resolution */ public final String token; /** The version code of the package */ - public final int versionCode; + public final long versionCode; /** An intent to start upon failure to install */ public final Intent failureIntent; @@ -71,7 +71,7 @@ public final class AuxiliaryResolveInfo extends IntentFilter { public AuxiliaryResolveInfo(@NonNull String packageName, @Nullable String splitName, @Nullable ComponentName failureActivity, - int versionCode, + long versionCode, @Nullable Intent failureIntent) { super(); this.packageName = packageName; diff --git a/core/java/android/content/pm/InstantAppResolveInfo.java b/core/java/android/content/pm/InstantAppResolveInfo.java index 22e994f4cfa8..fb3094c70953 100644 --- a/core/java/android/content/pm/InstantAppResolveInfo.java +++ b/core/java/android/content/pm/InstantAppResolveInfo.java @@ -44,10 +44,15 @@ public final class InstantAppResolveInfo implements Parcelable { /** The filters used to match domain */ private final List<InstantAppIntentFilter> mFilters; /** The version code of the app that this class resolves to */ - private final int mVersionCode; + private final long mVersionCode; public InstantAppResolveInfo(@NonNull InstantAppDigest digest, @Nullable String packageName, @Nullable List<InstantAppIntentFilter> filters, int versionCode) { + this(digest, packageName, filters, (long)versionCode); + } + + public InstantAppResolveInfo(@NonNull InstantAppDigest digest, @Nullable String packageName, + @Nullable List<InstantAppIntentFilter> filters, long versionCode) { // validate arguments if ((packageName == null && (filters != null && filters.size() != 0)) || (packageName != null && (filters == null || filters.size() == 0))) { @@ -74,7 +79,7 @@ public final class InstantAppResolveInfo implements Parcelable { mPackageName = in.readString(); mFilters = new ArrayList<InstantAppIntentFilter>(); in.readList(mFilters, null /*loader*/); - mVersionCode = in.readInt(); + mVersionCode = in.readLong(); } public byte[] getDigestBytes() { @@ -93,7 +98,15 @@ public final class InstantAppResolveInfo implements Parcelable { return mFilters; } + /** + * @deprecated Use {@link #getLongVersionCode} instead. + */ + @Deprecated public int getVersionCode() { + return (int) (mVersionCode & 0xffffffff); + } + + public long getLongVersionCode() { return mVersionCode; } @@ -107,7 +120,7 @@ public final class InstantAppResolveInfo implements Parcelable { out.writeParcelable(mDigest, flags); out.writeString(mPackageName); out.writeList(mFilters); - out.writeInt(mVersionCode); + out.writeLong(mVersionCode); } public static final Parcelable.Creator<InstantAppResolveInfo> CREATOR diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index f8889b6853d6..0c893b0ff06a 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -37,13 +37,56 @@ public class PackageInfo implements Parcelable { public String[] splitNames; /** + * @deprecated Use {@link #getLongVersionCode()} instead, which includes both + * this and the additional + * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} attribute. * The version number of this package, as specified by the <manifest> * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCode} * attribute. + * @see #getLongVersionCode() */ + @Deprecated public int versionCode; /** + * @hide + * The major version number of this package, as specified by the <manifest> + * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCodeMajor} + * attribute. + * @see #getLongVersionCode() + */ + public int versionCodeMajor; + + /** + * Return {@link android.R.styleable#AndroidManifest_versionCode versionCode} and + * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} combined + * together as a single long value. The + * {@link android.R.styleable#AndroidManifest_versionCodeMajor versionCodeMajor} is placed in + * the upper 32 bits. + */ + public long getLongVersionCode() { + return composeLongVersionCode(versionCodeMajor, versionCode); + } + + /** + * Set the full version code in this PackageInfo, updating {@link #versionCode} + * with the lower bits. + * @see #getLongVersionCode() + */ + public void setLongVersionCode(long longVersionCode) { + versionCodeMajor = (int) (longVersionCode>>32); + versionCode = (int) longVersionCode; + } + + /** + * @hide Internal implementation for composing a minor and major version code in to + * a single long version code. + */ + public static long composeLongVersionCode(int major, int minor) { + return (((long) major) << 32) | (((long) minor) & 0xffffffffL); + } + + /** * The version name of this package, as specified by the <manifest> * tag's {@link android.R.styleable#AndroidManifest_versionName versionName} * attribute. @@ -333,6 +376,7 @@ public class PackageInfo implements Parcelable { dest.writeString(packageName); dest.writeStringArray(splitNames); dest.writeInt(versionCode); + dest.writeInt(versionCodeMajor); dest.writeString(versionName); dest.writeInt(baseRevisionCode); dest.writeIntArray(splitRevisionCodes); @@ -389,6 +433,7 @@ public class PackageInfo implements Parcelable { packageName = source.readString(); splitNames = source.createStringArray(); versionCode = source.readInt(); + versionCodeMajor = source.readInt(); versionName = source.readString(); baseRevisionCode = source.readInt(); splitRevisionCodes = source.createIntArray(); diff --git a/core/java/android/content/pm/PackageInfoLite.java b/core/java/android/content/pm/PackageInfoLite.java index 1efe082b7fdf..bbf020d76c92 100644 --- a/core/java/android/content/pm/PackageInfoLite.java +++ b/core/java/android/content/pm/PackageInfoLite.java @@ -38,9 +38,27 @@ public class PackageInfoLite implements Parcelable { /** * The android:versionCode of the package. + * @deprecated Use {@link #getLongVersionCode()} instead, which includes both + * this and the additional + * {@link android.R.styleable#AndroidManifest_versionCode versionCodeMajor} attribute. */ + @Deprecated public int versionCode; + /** + * @hide + * The android:versionCodeMajor of the package. + */ + public int versionCodeMajor; + + /** + * Return {@link #versionCode} and {@link #versionCodeMajor} combined together as a + * single long value. The {@link #versionCodeMajor} is placed in the upper 32 bits. + */ + public long getLongVersionCode() { + return PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode); + } + /** Revision code of base APK */ public int baseRevisionCode; /** Revision codes of any split APKs, ordered by parsed splitName */ @@ -55,10 +73,10 @@ public class PackageInfoLite implements Parcelable { /** * Specifies the recommended install location. Can be one of - * {@link #PackageHelper.RECOMMEND_INSTALL_INTERNAL} to install on internal storage - * {@link #PackageHelper.RECOMMEND_INSTALL_EXTERNAL} to install on external media - * {@link PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE} for storage errors - * {@link PackageHelper.RECOMMEND_FAILED_INVALID_APK} for parse errors. + * {@link PackageHelper#RECOMMEND_INSTALL_INTERNAL} to install on internal storage, + * {@link PackageHelper#RECOMMEND_INSTALL_EXTERNAL} to install on external media, + * {@link PackageHelper#RECOMMEND_FAILED_INSUFFICIENT_STORAGE} for storage errors, + * or {@link PackageHelper#RECOMMEND_FAILED_INVALID_APK} for parse errors. */ public int recommendedInstallLocation; public int installLocation; @@ -82,6 +100,7 @@ public class PackageInfoLite implements Parcelable { dest.writeString(packageName); dest.writeStringArray(splitNames); dest.writeInt(versionCode); + dest.writeInt(versionCodeMajor); dest.writeInt(baseRevisionCode); dest.writeIntArray(splitRevisionCodes); dest.writeInt(recommendedInstallLocation); @@ -111,6 +130,7 @@ public class PackageInfoLite implements Parcelable { packageName = source.readString(); splitNames = source.createStringArray(); versionCode = source.readInt(); + versionCodeMajor = source.readInt(); baseRevisionCode = source.readInt(); splitRevisionCodes = source.createIntArray(); recommendedInstallLocation = source.readInt(); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index f796aabee2d1..fb34615767de 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2634,13 +2634,22 @@ public abstract class PackageManager { /** * Extra field name for the version code of a package pending verification. - * + * @deprecated Use {@link #EXTRA_VERIFICATION_LONG_VERSION_CODE} instead. * @hide */ + @Deprecated public static final String EXTRA_VERIFICATION_VERSION_CODE = "android.content.pm.extra.VERIFICATION_VERSION_CODE"; /** + * Extra field name for the long version code of a package pending verification. + * + * @hide + */ + public static final String EXTRA_VERIFICATION_LONG_VERSION_CODE = + "android.content.pm.extra.VERIFICATION_LONG_VERSION_CODE"; + + /** * Extra field name for the ID of a intent filter pending verification. * Passed to an intent filter verifier and is used to call back to * {@link #verifyIntentFilter} diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index ebeaad78ea6a..d3a4e2b2942d 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -394,6 +394,7 @@ public class PackageParser { public static class PackageLite { public final String packageName; public final int versionCode; + public final int versionCodeMajor; public final int installLocation; public final VerifierInfo[] verifiers; @@ -436,6 +437,7 @@ public class PackageParser { String[] splitCodePaths, int[] splitRevisionCodes) { this.packageName = baseApk.packageName; this.versionCode = baseApk.versionCode; + this.versionCodeMajor = baseApk.versionCodeMajor; this.installLocation = baseApk.installLocation; this.verifiers = baseApk.verifiers; this.splitNames = splitNames; @@ -476,6 +478,7 @@ public class PackageParser { public final String configForSplit; public final String usesSplitName; public final int versionCode; + public final int versionCodeMajor; public final int revisionCode; public final int installLocation; public final VerifierInfo[] verifiers; @@ -489,11 +492,11 @@ public class PackageParser { public final boolean isolatedSplits; public ApkLite(String codePath, String packageName, String splitName, boolean isFeatureSplit, - String configForSplit, String usesSplitName, int versionCode, int revisionCode, - int installLocation, List<VerifierInfo> verifiers, Signature[] signatures, - Certificate[][] certificates, boolean coreApp, boolean debuggable, - boolean multiArch, boolean use32bitAbi, boolean extractNativeLibs, - boolean isolatedSplits) { + String configForSplit, String usesSplitName, int versionCode, int versionCodeMajor, + int revisionCode, int installLocation, List<VerifierInfo> verifiers, + Signature[] signatures, Certificate[][] certificates, boolean coreApp, + boolean debuggable, boolean multiArch, boolean use32bitAbi, + boolean extractNativeLibs, boolean isolatedSplits) { this.codePath = codePath; this.packageName = packageName; this.splitName = splitName; @@ -501,6 +504,7 @@ public class PackageParser { this.configForSplit = configForSplit; this.usesSplitName = usesSplitName; this.versionCode = versionCode; + this.versionCodeMajor = versionCodeMajor; this.revisionCode = revisionCode; this.installLocation = installLocation; this.verifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]); @@ -513,6 +517,10 @@ public class PackageParser { this.extractNativeLibs = extractNativeLibs; this.isolatedSplits = isolatedSplits; } + + public long getLongVersionCode() { + return PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode); + } } /** @@ -663,6 +671,7 @@ public class PackageParser { pi.packageName = p.packageName; pi.splitNames = p.splitNames; pi.versionCode = p.mVersionCode; + pi.versionCodeMajor = p.mVersionCodeMajor; pi.baseRevisionCode = p.baseRevisionCode; pi.splitRevisionCodes = p.splitRevisionCodes; pi.versionName = p.mVersionName; @@ -1880,6 +1889,7 @@ public class PackageParser { int installLocation = PARSE_DEFAULT_INSTALL_LOCATION; int versionCode = 0; + int versionCodeMajor = 0; int revisionCode = 0; boolean coreApp = false; boolean debuggable = false; @@ -1898,6 +1908,8 @@ public class PackageParser { PARSE_DEFAULT_INSTALL_LOCATION); } else if (attr.equals("versionCode")) { versionCode = attrs.getAttributeIntValue(i, 0); + } else if (attr.equals("versionCodeMajor")) { + versionCodeMajor = attrs.getAttributeIntValue(i, 0); } else if (attr.equals("revisionCode")) { revisionCode = attrs.getAttributeIntValue(i, 0); } else if (attr.equals("coreApp")) { @@ -1963,9 +1975,9 @@ public class PackageParser { } return new ApkLite(codePath, packageSplit.first, packageSplit.second, isFeatureSplit, - configForSplit, usesSplitName, versionCode, revisionCode, installLocation, - verifiers, signatures, certificates, coreApp, debuggable, multiArch, use32bitAbi, - extractNativeLibs, isolatedSplits); + configForSplit, usesSplitName, versionCode, versionCodeMajor, revisionCode, + installLocation, verifiers, signatures, certificates, coreApp, debuggable, + multiArch, use32bitAbi, extractNativeLibs, isolatedSplits); } /** @@ -2086,8 +2098,11 @@ public class PackageParser { TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifest); - pkg.mVersionCode = pkg.applicationInfo.versionCode = sa.getInteger( + pkg.mVersionCode = sa.getInteger( com.android.internal.R.styleable.AndroidManifest_versionCode, 0); + pkg.mVersionCodeMajor = sa.getInteger( + com.android.internal.R.styleable.AndroidManifest_versionCodeMajor, 0); + pkg.applicationInfo.versionCode = pkg.getLongVersionCode(); pkg.baseRevisionCode = sa.getInteger( com.android.internal.R.styleable.AndroidManifest_revisionCode, 0); pkg.mVersionName = sa.getNonConfigurationString( @@ -2912,7 +2927,7 @@ public class PackageParser { 1, additionalCertSha256Digests.length); pkg.usesStaticLibraries = ArrayUtils.add(pkg.usesStaticLibraries, lname); - pkg.usesStaticLibrariesVersions = ArrayUtils.appendInt( + pkg.usesStaticLibrariesVersions = ArrayUtils.appendLong( pkg.usesStaticLibrariesVersions, version, true); pkg.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String[].class, pkg.usesStaticLibrariesCertDigests, certSha256Digests, true); @@ -3867,6 +3882,9 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestStaticLibrary_name); final int version = sa.getInt( com.android.internal.R.styleable.AndroidManifestStaticLibrary_version, -1); + final int versionMajor = sa.getInt( + com.android.internal.R.styleable.AndroidManifestStaticLibrary_versionMajor, + 0); sa.recycle(); @@ -3894,7 +3912,12 @@ public class PackageParser { } owner.staticSharedLibName = lname.intern(); - owner.staticSharedLibVersion = version; + if (version >= 0) { + owner.staticSharedLibVersion = + PackageInfo.composeLongVersionCode(versionMajor, version); + } else { + owner.staticSharedLibVersion = version; + } ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY; XmlUtils.skipCurrentTag(parser); @@ -5895,11 +5918,11 @@ public class PackageParser { public ArrayList<Package> childPackages; public String staticSharedLibName = null; - public int staticSharedLibVersion = 0; + public long staticSharedLibVersion = 0; public ArrayList<String> libraryNames = null; public ArrayList<String> usesLibraries = null; public ArrayList<String> usesStaticLibraries = null; - public int[] usesStaticLibrariesVersions = null; + public long[] usesStaticLibrariesVersions = null; public String[][] usesStaticLibrariesCertDigests = null; public ArrayList<String> usesOptionalLibraries = null; public String[] usesLibraryFiles = null; @@ -5916,6 +5939,14 @@ public class PackageParser { // The version code declared for this package. public int mVersionCode; + // The major version code declared for this package. + public int mVersionCodeMajor; + + // Return long containing mVersionCode and mVersionCodeMajor. + public long getLongVersionCode() { + return PackageInfo.composeLongVersionCode(mVersionCodeMajor, mVersionCode); + } + // The version name declared for this package. public String mVersionName; @@ -6385,7 +6416,7 @@ public class PackageParser { if (staticSharedLibName != null) { staticSharedLibName = staticSharedLibName.intern(); } - staticSharedLibVersion = dest.readInt(); + staticSharedLibVersion = dest.readLong(); libraryNames = dest.createStringArrayList(); internStringArrayList(libraryNames); usesLibraries = dest.createStringArrayList(); @@ -6399,8 +6430,8 @@ public class PackageParser { usesStaticLibraries = new ArrayList<>(libCount); dest.readStringList(usesStaticLibraries); internStringArrayList(usesStaticLibraries); - usesStaticLibrariesVersions = new int[libCount]; - dest.readIntArray(usesStaticLibrariesVersions); + usesStaticLibrariesVersions = new long[libCount]; + dest.readLongArray(usesStaticLibrariesVersions); usesStaticLibrariesCertDigests = new String[libCount][]; for (int i = 0; i < libCount; i++) { usesStaticLibrariesCertDigests[i] = dest.createStringArray(); @@ -6540,7 +6571,7 @@ public class PackageParser { dest.writeParcelableList(childPackages, flags); dest.writeString(staticSharedLibName); - dest.writeInt(staticSharedLibVersion); + dest.writeLong(staticSharedLibVersion); dest.writeStringList(libraryNames); dest.writeStringList(usesLibraries); dest.writeStringList(usesOptionalLibraries); @@ -6551,7 +6582,7 @@ public class PackageParser { } else { dest.writeInt(usesStaticLibraries.size()); dest.writeStringList(usesStaticLibraries); - dest.writeIntArray(usesStaticLibrariesVersions); + dest.writeLongArray(usesStaticLibrariesVersions); for (String[] usesStaticLibrariesCertDigest : usesStaticLibrariesCertDigests) { dest.writeStringArray(usesStaticLibrariesCertDigest); } diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java index aea843adbd48..56d61efdcb25 100644 --- a/core/java/android/content/pm/RegisteredServicesCache.java +++ b/core/java/android/content/pm/RegisteredServicesCache.java @@ -361,7 +361,7 @@ public abstract class RegisteredServicesCache<V> { } IntArray updatedUids = null; for (ServiceInfo<V> service : allServices) { - int versionCode = service.componentInfo.applicationInfo.versionCode; + long versionCode = service.componentInfo.applicationInfo.versionCode; String pkg = service.componentInfo.packageName; ApplicationInfo newAppInfo = null; try { diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java index 7d301a3154f0..2f1b256dccdf 100644 --- a/core/java/android/content/pm/SharedLibraryInfo.java +++ b/core/java/android/content/pm/SharedLibraryInfo.java @@ -73,8 +73,7 @@ public final class SharedLibraryInfo implements Parcelable { private final String mName; - // TODO: Make long when we change the paltform to use longs - private final int mVersion; + private final long mVersion; private final @Type int mType; private final VersionedPackage mDeclaringPackage; private final List<VersionedPackage> mDependentPackages; @@ -90,7 +89,7 @@ public final class SharedLibraryInfo implements Parcelable { * * @hide */ - public SharedLibraryInfo(String name, int version, int type, + public SharedLibraryInfo(String name, long version, int type, VersionedPackage declaringPackage, List<VersionedPackage> dependentPackages) { mName = name; mVersion = version; @@ -100,7 +99,7 @@ public final class SharedLibraryInfo implements Parcelable { } private SharedLibraryInfo(Parcel parcel) { - this(parcel.readString(), parcel.readInt(), parcel.readInt(), + this(parcel.readString(), parcel.readLong(), parcel.readInt(), parcel.readParcelable(null), parcel.readArrayList(null)); } @@ -124,6 +123,14 @@ public final class SharedLibraryInfo implements Parcelable { } /** + * @deprecated Use {@link #getLongVersion()} instead. + */ + @Deprecated + public @IntRange(from = -1) int getVersion() { + return mVersion < 0 ? (int) mVersion : (int) (mVersion & 0x7fffffff); + } + + /** * Gets the version of the library. For {@link #TYPE_STATIC static} libraries * this is the declared version and for {@link #TYPE_DYNAMIC dynamic} and * {@link #TYPE_BUILTIN builtin} it is {@link #VERSION_UNDEFINED} as these @@ -131,7 +138,7 @@ public final class SharedLibraryInfo implements Parcelable { * * @return The version. */ - public @IntRange(from = -1) int getVersion() { + public @IntRange(from = -1) long getLongVersion() { return mVersion; } @@ -192,7 +199,7 @@ public final class SharedLibraryInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mName); - parcel.writeInt(mVersion); + parcel.writeLong(mVersion); parcel.writeInt(mType); parcel.writeParcelable(mDeclaringPackage, flags); parcel.writeList(mDependentPackages); diff --git a/core/java/android/content/pm/VersionedPackage.java b/core/java/android/content/pm/VersionedPackage.java index 29c5efe7c77a..395346641b1e 100644 --- a/core/java/android/content/pm/VersionedPackage.java +++ b/core/java/android/content/pm/VersionedPackage.java @@ -28,7 +28,7 @@ import java.lang.annotation.RetentionPolicy; */ public final class VersionedPackage implements Parcelable { private final String mPackageName; - private final int mVersionCode; + private final long mVersionCode; /** @hide */ @Retention(RetentionPolicy.SOURCE) @@ -47,9 +47,21 @@ public final class VersionedPackage implements Parcelable { mVersionCode = versionCode; } + /** + * Creates a new instance. Use {@link PackageManager#VERSION_CODE_HIGHEST} + * to refer to the highest version code of this package. + * @param packageName The package name. + * @param versionCode The version code. + */ + public VersionedPackage(@NonNull String packageName, + @VersionCode long versionCode) { + mPackageName = packageName; + mVersionCode = versionCode; + } + private VersionedPackage(Parcel parcel) { mPackageName = parcel.readString(); - mVersionCode = parcel.readInt(); + mVersionCode = parcel.readLong(); } /** @@ -62,11 +74,19 @@ public final class VersionedPackage implements Parcelable { } /** + * @deprecated use {@link #getLongVersionCode()} instead. + */ + @Deprecated + public @VersionCode int getVersionCode() { + return (int) (mVersionCode & 0x7fffffff); + } + + /** * Gets the version code. * * @return The version code. */ - public @VersionCode int getVersionCode() { + public @VersionCode long getLongVersionCode() { return mVersionCode; } @@ -83,7 +103,7 @@ public final class VersionedPackage implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mPackageName); - parcel.writeInt(mVersionCode); + parcel.writeLong(mVersionCode); } public static final Creator<VersionedPackage> CREATOR = new Creator<VersionedPackage>() { diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 811091e37da2..948d4cec1003 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -1180,7 +1180,7 @@ public abstract class BatteryStats implements Parcelable { public static final class PackageChange { public String mPackageName; public boolean mUpdate; - public int mVersionCode; + public long mVersionCode; } public static final class DailyItem { diff --git a/core/java/android/os/IStatsManager.aidl b/core/java/android/os/IStatsManager.aidl index b814b46a3182..0a092b263bcc 100644 --- a/core/java/android/os/IStatsManager.aidl +++ b/core/java/android/os/IStatsManager.aidl @@ -55,12 +55,12 @@ interface IStatsManager { * Inform statsd what the version and package are for each uid. Note that each array should * have the same number of elements, and version[i] and package[i] correspond to uid[i]. */ - oneway void informAllUidData(in int[] uid, in int[] version, in String[] app); + oneway void informAllUidData(in int[] uid, in long[] version, in String[] app); /** * Inform statsd what the uid and version are for one app that was updated. */ - oneway void informOnePackage(in String app, in int uid, in int version); + oneway void informOnePackage(in String app, in int uid, in long version); /** * Inform stats that an app was removed. diff --git a/core/java/android/security/keymaster/KeyAttestationPackageInfo.java b/core/java/android/security/keymaster/KeyAttestationPackageInfo.java index 5a3f39079cf6..a93d1e113eec 100644 --- a/core/java/android/security/keymaster/KeyAttestationPackageInfo.java +++ b/core/java/android/security/keymaster/KeyAttestationPackageInfo.java @@ -28,7 +28,7 @@ import android.os.Parcelable; */ public class KeyAttestationPackageInfo implements Parcelable { private final String mPackageName; - private final int mPackageVersionCode; + private final long mPackageVersionCode; private final Signature[] mPackageSignatures; /** @@ -37,7 +37,7 @@ public class KeyAttestationPackageInfo implements Parcelable { * @param mPackageSignatures */ public KeyAttestationPackageInfo( - String mPackageName, int mPackageVersionCode, Signature[] mPackageSignatures) { + String mPackageName, long mPackageVersionCode, Signature[] mPackageSignatures) { super(); this.mPackageName = mPackageName; this.mPackageVersionCode = mPackageVersionCode; @@ -52,7 +52,7 @@ public class KeyAttestationPackageInfo implements Parcelable { /** * @return the mPackageVersionCode */ - public int getPackageVersionCode() { + public long getPackageVersionCode() { return mPackageVersionCode; } /** @@ -70,7 +70,7 @@ public class KeyAttestationPackageInfo implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mPackageName); - dest.writeInt(mPackageVersionCode); + dest.writeLong(mPackageVersionCode); dest.writeTypedArray(mPackageSignatures, flags); } @@ -89,7 +89,7 @@ public class KeyAttestationPackageInfo implements Parcelable { private KeyAttestationPackageInfo(Parcel source) { mPackageName = source.readString(); - mPackageVersionCode = source.readInt(); + mPackageVersionCode = source.readLong(); mPackageSignatures = source.createTypedArray(Signature.CREATOR); } } diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index 797bdfb705cb..9db0e8d9a2fe 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -265,10 +265,10 @@ public final class WebViewFactory { + "packageName mismatch, expected: " + chosen.packageName + " actual: " + toUse.packageName); } - if (chosen.versionCode > toUse.versionCode) { + if (chosen.getLongVersionCode() > toUse.getLongVersionCode()) { throw new MissingWebViewPackageException("Failed to verify WebView provider, " - + "version code is lower than expected: " + chosen.versionCode - + " actual: " + toUse.versionCode); + + "version code is lower than expected: " + chosen.getLongVersionCode() + + " actual: " + toUse.getLongVersionCode()); } if (getWebViewLibrary(toUse.applicationInfo) == null) { throw new MissingWebViewPackageException("Tried to load an invalid WebView provider: " @@ -401,7 +401,7 @@ public final class WebViewFactory { Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); } Log.i(LOGTAG, "Loading " + sPackageInfo.packageName + " version " + - sPackageInfo.versionName + " (code " + sPackageInfo.versionCode + ")"); + sPackageInfo.versionName + " (code " + sPackageInfo.getLongVersionCode() + ")"); Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getChromiumProviderClass()"); try { diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java index fbdf17d84aa8..6fb02b162309 100644 --- a/core/java/com/android/internal/app/procstats/ProcessState.java +++ b/core/java/com/android/internal/app/procstats/ProcessState.java @@ -28,6 +28,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.DebugUtils; import android.util.Log; +import android.util.LongSparseArray; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; @@ -137,7 +138,7 @@ public final class ProcessState { private final String mName; private final String mPackage; private final int mUid; - private final int mVersion; + private final long mVersion; private final DurationsTable mDurations; private final PssTable mPssTable; @@ -170,7 +171,7 @@ public final class ProcessState { * Create a new top-level process state, for the initial case where there is only * a single package running in a process. The initial state is not running. */ - public ProcessState(ProcessStats processStats, String pkg, int uid, int vers, String name) { + public ProcessState(ProcessStats processStats, String pkg, int uid, long vers, String name) { mStats = processStats; mName = name; mCommonProcess = this; @@ -186,7 +187,7 @@ public final class ProcessState { * state. The current running state of the top-level process is also copied, * marked as started running at 'now'. */ - public ProcessState(ProcessState commonProcess, String pkg, int uid, int vers, String name, + public ProcessState(ProcessState commonProcess, String pkg, int uid, long vers, String name, long now) { mStats = commonProcess.mStats; mName = name; @@ -238,7 +239,7 @@ public final class ProcessState { return mUid; } - public int getVersion() { + public long getVersion() { return mVersion; } @@ -546,7 +547,7 @@ public final class ProcessState { // The array map is still pointing to a common process state // that is now shared across packages. Update it to point to // the new per-package state. - SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid); + LongSparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid); if (vpkg == null) { throw new IllegalStateException("Didn't find package " + pkgName + " / " + mUid); @@ -584,7 +585,7 @@ public final class ProcessState { // The array map is still pointing to a common process state // that is now shared across packages. Update it to point to // the new per-package state. - SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index), + LongSparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index), proc.mUid); if (vpkg == null) { throw new IllegalStateException("No existing package " @@ -1037,7 +1038,7 @@ public final class ProcessState { } } - public void dumpPackageProcCheckin(PrintWriter pw, String pkgName, int uid, int vers, + public void dumpPackageProcCheckin(PrintWriter pw, String pkgName, int uid, long vers, String itemName, long now) { pw.print("pkgproc,"); pw.print(pkgName); diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java index 14f5e5b5a704..2ce7936d157b 100644 --- a/core/java/com/android/internal/app/procstats/ProcessStats.java +++ b/core/java/com/android/internal/app/procstats/ProcessStats.java @@ -28,6 +28,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.DebugUtils; import android.util.Log; +import android.util.LongSparseArray; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; @@ -157,7 +158,7 @@ public final class ProcessStats implements Parcelable { }; // Current version of the parcel format. - private static final int PARCEL_VERSION = 21; + private static final int PARCEL_VERSION = 22; // In-memory Parcel magic number, used to detect attempts to unmarshall bad data private static final int MAGIC = 0x50535454; @@ -165,9 +166,8 @@ public final class ProcessStats implements Parcelable { public String mTimePeriodStartClockStr; public int mFlags; - public final ProcessMap<SparseArray<PackageState>> mPackages - = new ProcessMap<SparseArray<PackageState>>(); - public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); + public final ProcessMap<LongSparseArray<PackageState>> mPackages = new ProcessMap<>(); + public final ProcessMap<ProcessState> mProcesses = new ProcessMap<>(); public final long[] mMemFactorDurations = new long[ADJ_COUNT]; public int mMemFactor = STATE_NOTHING; @@ -218,15 +218,16 @@ public final class ProcessStats implements Parcelable { } public void add(ProcessStats other) { - ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap(); + ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + other.mPackages.getMap(); for (int ip=0; ip<pkgMap.size(); ip++) { final String pkgName = pkgMap.keyAt(ip); - final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); for (int iu=0; iu<uids.size(); iu++) { final int uid = uids.keyAt(iu); - final SparseArray<PackageState> versions = uids.valueAt(iu); + final LongSparseArray<PackageState> versions = uids.valueAt(iu); for (int iv=0; iv<versions.size(); iv++) { - final int vers = versions.keyAt(iv); + final long vers = versions.keyAt(iv); final PackageState otherState = versions.valueAt(iv); final int NPROCS = otherState.mProcesses.size(); final int NSRVS = otherState.mServices.size(); @@ -269,7 +270,7 @@ public final class ProcessStats implements Parcelable { ProcessState otherProc = uids.valueAt(iu); final String name = otherProc.getName(); final String pkg = otherProc.getPackage(); - final int vers = otherProc.getVersion(); + final long vers = otherProc.getVersion(); ProcessState thisProc = mProcesses.get(name, uid); if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + name); if (thisProc == null) { @@ -420,11 +421,12 @@ public final class ProcessStats implements Parcelable { // Next reset or prune all per-package processes, and for the ones that are reset // track this back to the common processes. - final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); + final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + mPackages.getMap(); for (int ip=pkgMap.size()-1; ip>=0; ip--) { - final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); for (int iu=uids.size()-1; iu>=0; iu--) { - final SparseArray<PackageState> vpkgs = uids.valueAt(iu); + final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); for (int iv=vpkgs.size()-1; iv>=0; iv--) { final PackageState pkgState = vpkgs.valueAt(iv); for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { @@ -727,13 +729,14 @@ public final class ProcessStats implements Parcelable { uids.valueAt(iu).commitStateTime(now); } } - final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); + final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + mPackages.getMap(); final int NPKG = pkgMap.size(); for (int ip=0; ip<NPKG; ip++) { - final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); final int NUID = uids.size(); for (int iu=0; iu<NUID; iu++) { - final SparseArray<PackageState> vpkgs = uids.valueAt(iu); + final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); final int NVERS = vpkgs.size(); for (int iv=0; iv<NVERS; iv++) { PackageState pkgState = vpkgs.valueAt(iv); @@ -781,23 +784,23 @@ public final class ProcessStats implements Parcelable { out.writeInt(uids.keyAt(iu)); final ProcessState proc = uids.valueAt(iu); writeCommonString(out, proc.getPackage()); - out.writeInt(proc.getVersion()); + out.writeLong(proc.getVersion()); proc.writeToParcel(out, now); } } out.writeInt(NPKG); for (int ip=0; ip<NPKG; ip++) { writeCommonString(out, pkgMap.keyAt(ip)); - final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); final int NUID = uids.size(); out.writeInt(NUID); for (int iu=0; iu<NUID; iu++) { out.writeInt(uids.keyAt(iu)); - final SparseArray<PackageState> vpkgs = uids.valueAt(iu); + final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); final int NVERS = vpkgs.size(); out.writeInt(NVERS); for (int iv=0; iv<NVERS; iv++) { - out.writeInt(vpkgs.keyAt(iv)); + out.writeLong(vpkgs.keyAt(iv)); final PackageState pkgState = vpkgs.valueAt(iv); final int NPROCS = pkgState.mProcesses.size(); out.writeInt(NPROCS); @@ -963,7 +966,7 @@ public final class ProcessStats implements Parcelable { mReadError = "bad process package name"; return; } - final int vers = in.readInt(); + final long vers = in.readLong(); ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; if (proc != null) { if (!proc.readFromParcel(in, false)) { @@ -1014,11 +1017,11 @@ public final class ProcessStats implements Parcelable { } while (NVERS > 0) { NVERS--; - final int vers = in.readInt(); + final long vers = in.readLong(); PackageState pkgState = new PackageState(pkgName, uid); - SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); + LongSparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); if (vpkg == null) { - vpkg = new SparseArray<PackageState>(); + vpkg = new LongSparseArray<>(); mPackages.put(pkgName, uid, vpkg); } vpkg.put(vers, pkgState); @@ -1117,10 +1120,10 @@ public final class ProcessStats implements Parcelable { if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); } - public PackageState getPackageStateLocked(String packageName, int uid, int vers) { - SparseArray<PackageState> vpkg = mPackages.get(packageName, uid); + public PackageState getPackageStateLocked(String packageName, int uid, long vers) { + LongSparseArray<PackageState> vpkg = mPackages.get(packageName, uid); if (vpkg == null) { - vpkg = new SparseArray<PackageState>(); + vpkg = new LongSparseArray<PackageState>(); mPackages.put(packageName, uid, vpkg); } PackageState as = vpkg.get(vers); @@ -1132,7 +1135,7 @@ public final class ProcessStats implements Parcelable { return as; } - public ProcessState getProcessStateLocked(String packageName, int uid, int vers, + public ProcessState getProcessStateLocked(String packageName, int uid, long vers, String processName) { final PackageState pkgState = getPackageStateLocked(packageName, uid, vers); ProcessState ps = pkgState.mProcesses.get(processName); @@ -1202,7 +1205,7 @@ public final class ProcessStats implements Parcelable { return ps; } - public ServiceState getServiceStateLocked(String packageName, int uid, int vers, + public ServiceState getServiceStateLocked(String packageName, int uid, long vers, String processName, String className) { final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers); ServiceState ss = as.mServices.get(className); @@ -1228,16 +1231,16 @@ public final class ProcessStats implements Parcelable { mSysMemUsage.dump(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ); sepNeeded = true; } - ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); + ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = mPackages.getMap(); boolean printedHeader = false; for (int ip=0; ip<pkgMap.size(); ip++) { final String pkgName = pkgMap.keyAt(ip); - final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); for (int iu=0; iu<uids.size(); iu++) { final int uid = uids.keyAt(iu); - final SparseArray<PackageState> vpkgs = uids.valueAt(iu); + final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); for (int iv=0; iv<vpkgs.size(); iv++) { - final int vers = vpkgs.keyAt(iv); + final long vers = vpkgs.keyAt(iv); final PackageState pkgState = vpkgs.valueAt(iv); final int NPROCS = pkgState.mProcesses.size(); final int NSRVS = pkgState.mServices.size(); @@ -1531,12 +1534,13 @@ public final class ProcessStats implements Parcelable { int[] procStates, int sortProcStates[], long now, String reqPackage, boolean activeOnly) { final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); - final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); + final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + mPackages.getMap(); for (int ip=0; ip<pkgMap.size(); ip++) { final String pkgName = pkgMap.keyAt(ip); - final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> procs = pkgMap.valueAt(ip); for (int iu=0; iu<procs.size(); iu++) { - final SparseArray<PackageState> vpkgs = procs.valueAt(iu); + final LongSparseArray<PackageState> vpkgs = procs.valueAt(iu); final int NVERS = vpkgs.size(); for (int iv=0; iv<NVERS; iv++) { final PackageState state = vpkgs.valueAt(iv); @@ -1571,7 +1575,8 @@ public final class ProcessStats implements Parcelable { public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { final long now = SystemClock.uptimeMillis(); - final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); + final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + mPackages.getMap(); pw.println("vers,5"); pw.print("period,"); pw.print(mTimePeriodStartClockStr); pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); @@ -1602,12 +1607,12 @@ public final class ProcessStats implements Parcelable { if (reqPackage != null && !reqPackage.equals(pkgName)) { continue; } - final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); + final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); for (int iu=0; iu<uids.size(); iu++) { final int uid = uids.keyAt(iu); - final SparseArray<PackageState> vpkgs = uids.valueAt(iu); + final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); for (int iv=0; iv<vpkgs.size(); iv++) { - final int vers = vpkgs.keyAt(iv); + final long vers = vpkgs.keyAt(iv); final PackageState pkgState = vpkgs.valueAt(iv); final int NPROCS = pkgState.mProcesses.size(); final int NSRVS = pkgState.mServices.size(); @@ -1709,7 +1714,8 @@ public final class ProcessStats implements Parcelable { } public void toProto(ProtoOutputStream proto, long now) { - final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); + final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + mPackages.getMap(); proto.write(ProcessStatsSectionProto.START_REALTIME_MS, mTimePeriodStartRealtime); proto.write(ProcessStatsSectionProto.END_REALTIME_MS, @@ -1750,10 +1756,10 @@ public final class ProcessStats implements Parcelable { } final public static class ProcessStateHolder { - public final int appVersion; + public final long appVersion; public ProcessState state; - public ProcessStateHolder(int _appVersion) { + public ProcessStateHolder(long _appVersion) { appVersion = _appVersion; } } diff --git a/core/java/com/android/internal/app/procstats/ServiceState.java b/core/java/com/android/internal/app/procstats/ServiceState.java index 2e11c43872f6..650de2ea2b68 100644 --- a/core/java/com/android/internal/app/procstats/ServiceState.java +++ b/core/java/com/android/internal/app/procstats/ServiceState.java @@ -441,7 +441,7 @@ public final class ServiceState { return totalTime; } - public void dumpTimesCheckin(PrintWriter pw, String pkgName, int uid, int vers, + public void dumpTimesCheckin(PrintWriter pw, String pkgName, int uid, long vers, String serviceName, long now) { dumpTimeCheckin(pw, "pkgsvc-run", pkgName, uid, vers, serviceName, ServiceState.SERVICE_RUN, mRunCount, mRunState, mRunStartTime, now); @@ -454,7 +454,7 @@ public final class ServiceState { } private void dumpTimeCheckin(PrintWriter pw, String label, String packageName, - int uid, int vers, String serviceName, int serviceType, int opCount, + int uid, long vers, String serviceName, int serviceType, int opCount, int curState, long curStartTime, long now) { if (opCount <= 0) { return; diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 3d49072ea8e8..a050a3ce0cf2 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -120,7 +120,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 169 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 170 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS; @@ -4501,11 +4501,12 @@ public class BatteryStatsImpl extends BatteryStats { } } - public void notePackageInstalledLocked(String pkgName, int versionCode) { + public void notePackageInstalledLocked(String pkgName, long versionCode) { final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); + // XXX need to figure out what to do with long version codes. addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PACKAGE_INSTALLED, - pkgName, versionCode); + pkgName, (int)versionCode); PackageChange pc = new PackageChange(); pc.mPackageName = pkgName; pc.mUpdate = true; @@ -9283,7 +9284,7 @@ public class BatteryStatsImpl extends BatteryStats { if (pc.mUpdate) { out.startTag(null, "upd"); out.attribute(null, "pkg", pc.mPackageName); - out.attribute(null, "ver", Integer.toString(pc.mVersionCode)); + out.attribute(null, "ver", Long.toString(pc.mVersionCode)); out.endTag(null, "upd"); } else { out.startTag(null, "rem"); @@ -9412,7 +9413,7 @@ public class BatteryStatsImpl extends BatteryStats { pc.mUpdate = true; pc.mPackageName = parser.getAttributeValue(null, "pkg"); String verStr = parser.getAttributeValue(null, "ver"); - pc.mVersionCode = verStr != null ? Integer.parseInt(verStr) : 0; + pc.mVersionCode = verStr != null ? Long.parseLong(verStr) : 0; dit.mPackageChanges.add(pc); XmlUtils.skipCurrentTag(parser); } else if (tagName.equals("rem")) { @@ -12113,7 +12114,7 @@ public class BatteryStatsImpl extends BatteryStats { PackageChange pc = new PackageChange(); pc.mPackageName = in.readString(); pc.mUpdate = in.readInt() != 0; - pc.mVersionCode = in.readInt(); + pc.mVersionCode = in.readLong(); mDailyPackageChanges.add(pc); } } else { @@ -12538,7 +12539,7 @@ public class BatteryStatsImpl extends BatteryStats { PackageChange pc = mDailyPackageChanges.get(i); out.writeString(pc.mPackageName); out.writeInt(pc.mUpdate ? 1 : 0); - out.writeInt(pc.mVersionCode); + out.writeLong(pc.mVersionCode); } } else { out.writeInt(0); diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java index 22bfcc347c3a..9336ddd05c28 100644 --- a/core/java/com/android/internal/util/ArrayUtils.java +++ b/core/java/com/android/internal/util/ArrayUtils.java @@ -425,14 +425,17 @@ public class ArrayUtils { * Adds value to given array if not already present, providing set-like * behavior. */ - public static @NonNull long[] appendLong(@Nullable long[] cur, long val) { + public static @NonNull long[] appendLong(@Nullable long[] cur, long val, + boolean allowDuplicates) { if (cur == null) { return new long[] { val }; } final int N = cur.length; - for (int i = 0; i < N; i++) { - if (cur[i] == val) { - return cur; + if (!allowDuplicates) { + for (int i = 0; i < N; i++) { + if (cur[i] == val) { + return cur; + } } } long[] ret = new long[N + 1]; @@ -442,6 +445,14 @@ public class ArrayUtils { } /** + * Adds value to given array if not already present, providing set-like + * behavior. + */ + public static @NonNull long[] appendLong(@Nullable long[] cur, long val) { + return appendLong(cur, val, false); + } + + /** * Removes value from given array if present, providing set-like behavior. */ public static @Nullable long[] removeLong(@Nullable long[] cur, long val) { diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 4d410e5447de..98b40399677f 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -317,6 +317,13 @@ as multiple split APKs, each APK must have the exact same versionCode. --> <attr name="versionCode" format="integer" /> + <!-- Internal major version code. This is essentially additional high bits + for the base version code; it has no other meaning than + that higher numbers are more recent. This is not a version + number generally shown to the user, that is usually supplied + with {@link android.R.attr#versionName}. --> + <attr name="versionCodeMajor" format="integer" /> + <!-- Internal revision code. This number is the number used to determine whether one APK is more recent than another: it has no other meaning than that higher numbers are more recent. This value is only meaningful @@ -1386,6 +1393,7 @@ {@link #AndroidManifestUsesFeature uses-feature}. --> <declare-styleable name="AndroidManifest"> <attr name="versionCode" /> + <attr name="versionCodeMajor" /> <attr name="versionName" /> <attr name="revisionCode" /> <attr name="sharedUserId" /> @@ -1784,6 +1792,10 @@ <attr name="name" /> <!-- Required specific library version. --> <attr name="version" /> + <!-- Required specific library major version code. This matches + android:versionCodeMajor of the library. --> + <!-- Required specific library version. --> + <attr name="versionMajor" format="integer" /> </declare-styleable> <!-- The <code>uses-libraries</code> specifies a shared library that this diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 3dbb89c2a36d..43e1f738bba7 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2854,6 +2854,8 @@ <public name="compileSdkVersionCodename" /> <public name="screenReaderFocusable" /> <public name="buttonCornerRadius" /> + <public name="versionCodeMajor" /> + <public name="versionMajor" /> </public-group> <public-group type="style" first-id="0x010302e0"> diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java index 4a771ebdf565..8b01aef81c67 100644 --- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java +++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java @@ -138,6 +138,7 @@ public class DefaultContainerService extends IntentService { ret.packageName = pkg.packageName; ret.splitNames = pkg.splitNames; ret.versionCode = pkg.versionCode; + ret.versionCodeMajor = pkg.versionCodeMajor; ret.baseRevisionCode = pkg.baseRevisionCode; ret.splitRevisionCodes = pkg.splitRevisionCodes; ret.installLocation = pkg.installLocation; diff --git a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java index 2c2641079953..8055caaad536 100644 --- a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java @@ -227,7 +227,7 @@ public class HelpUtils { // cache the version code PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), 0); - sCachedVersionCode = Integer.toString(info.versionCode); + sCachedVersionCode = Long.toString(info.getLongVersionCode()); // append the version code to the uri builder.appendQueryParameter(PARAM_VERSION, sCachedVersionCode); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 09fe579b83c6..f41cb293aeb0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -615,6 +615,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, .addCategory(Intent.CATEGORY_BROWSABLE) .addCategory("unique:" + System.currentTimeMillis()) .putExtra(Intent.EXTRA_PACKAGE_NAME, appInfo.packageName) + .putExtra(Intent.EXTRA_VERSION_CODE, (int) (appInfo.versionCode & 0x7fffffff)) .putExtra(Intent.EXTRA_VERSION_CODE, appInfo.versionCode) .putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, pendingIntent); diff --git a/services/backup/java/com/android/server/backup/FileMetadata.java b/services/backup/java/com/android/server/backup/FileMetadata.java index 5465609fdfbd..3d260cba4a16 100644 --- a/services/backup/java/com/android/server/backup/FileMetadata.java +++ b/services/backup/java/com/android/server/backup/FileMetadata.java @@ -36,7 +36,7 @@ public class FileMetadata { public long mode; // e.g. 0666 (actually int) public long mtime; // last mod time, UTC time_t (actually int) public long size; // bytes of content - public int version; // App version. + public long version; // App version. public boolean hasApk; // Whether backup file contains apk. @Override diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java index f658f22d8548..2d2993dced69 100644 --- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java +++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java @@ -99,10 +99,10 @@ public class PackageManagerBackupAgent extends BackupAgent { // For compactness we store the SHA-256 hash of each app's Signatures // rather than the Signature blocks themselves. public class Metadata { - public int versionCode; + public long versionCode; public ArrayList<byte[]> sigHashes; - Metadata(int version, ArrayList<byte[]> hashes) { + Metadata(long version, ArrayList<byte[]> hashes) { versionCode = version; sigHashes = hashes; } @@ -206,7 +206,7 @@ public class PackageManagerBackupAgent extends BackupAgent { homeInfo = mPackageManager.getPackageInfo(home.getPackageName(), PackageManager.GET_SIGNATURES); homeInstaller = mPackageManager.getInstallerPackageName(home.getPackageName()); - homeVersion = homeInfo.versionCode; + homeVersion = homeInfo.getLongVersionCode(); homeSigHashes = BackupUtils.hashSignatureArray(homeInfo.signatures); } catch (NameNotFoundException e) { Slog.w(TAG, "Can't access preferred home info"); @@ -287,7 +287,7 @@ public class PackageManagerBackupAgent extends BackupAgent { // metadata again. In either case, take it out of mExisting so that // we don't consider it deleted later. mExisting.remove(packName); - if (info.versionCode == mStateVersions.get(packName).versionCode) { + if (info.getLongVersionCode() == mStateVersions.get(packName).versionCode) { continue; } } @@ -309,13 +309,18 @@ public class PackageManagerBackupAgent extends BackupAgent { // marshal the version code in a canonical form outputBuffer.reset(); - outputBufferStream.writeInt(info.versionCode); + if (info.versionCodeMajor != 0) { + outputBufferStream.writeInt(Integer.MIN_VALUE); + outputBufferStream.writeLong(info.getLongVersionCode()); + } else { + outputBufferStream.writeInt(info.versionCode); + } writeSignatureHashArray(outputBufferStream, BackupUtils.hashSignatureArray(info.signatures)); if (DEBUG) { Slog.v(TAG, "+ writing metadata for " + packName - + " version=" + info.versionCode + + " version=" + info.getLongVersionCode() + " entityLen=" + outputBuffer.size()); } @@ -409,7 +414,13 @@ public class PackageManagerBackupAgent extends BackupAgent { } } else { // it's a file metadata record - int versionCode = inputBufferStream.readInt(); + int versionCodeInt = inputBufferStream.readInt(); + long versionCode; + if (versionCodeInt == Integer.MIN_VALUE) { + versionCode = inputBufferStream.readLong(); + } else { + versionCode = versionCodeInt; + } ArrayList<byte[]> sigs = readSignatureHashArray(inputBufferStream); if (DEBUG) { Slog.i(TAG, " read metadata for " + key @@ -561,7 +572,13 @@ public class PackageManagerBackupAgent extends BackupAgent { // The global metadata was last; now read all the apps while (true) { pkg = in.readUTF(); - int versionCode = in.readInt(); + int versionCodeInt = in.readInt(); + long versionCode; + if (versionCodeInt == Integer.MIN_VALUE) { + versionCode = in.readLong(); + } else { + versionCode = versionCodeInt; + } if (!ignoreExisting) { mExisting.add(pkg); @@ -609,7 +626,12 @@ public class PackageManagerBackupAgent extends BackupAgent { // now write all the app names + versions for (PackageInfo pkg : pkgs) { out.writeUTF(pkg.packageName); - out.writeInt(pkg.versionCode); + if (pkg.versionCodeMajor != 0) { + out.writeInt(Integer.MIN_VALUE); + out.writeLong(pkg.getLongVersionCode()); + } else { + out.writeInt(pkg.versionCode); + } } out.flush(); diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java index b538c6d4e472..5884dc536080 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java @@ -495,14 +495,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { return; } - if (metaInfo.versionCode > mCurrentPackage.versionCode) { + if (metaInfo.versionCode > mCurrentPackage.getLongVersionCode()) { // Data is from a "newer" version of the app than we have currently // installed. If the app has not declared that it is prepared to // handle this case, we do not attempt the restore. if ((mCurrentPackage.applicationInfo.flags & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) == 0) { String message = "Source version " + metaInfo.versionCode - + " > installed version " + mCurrentPackage.versionCode; + + " > installed version " + mCurrentPackage.getLongVersionCode(); Slog.w(TAG, "Package " + pkgName + ": " + message); Bundle monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra(null, BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION, @@ -522,7 +522,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { } else { if (DEBUG) { Slog.v(TAG, "Source version " + metaInfo.versionCode - + " > installed version " + mCurrentPackage.versionCode + + " > installed version " + mCurrentPackage.getLongVersionCode() + " but restoreAnyVersion"); } Bundle monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra(null, @@ -543,7 +543,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { Slog.v(TAG, "Package " + pkgName + " restore version [" + metaInfo.versionCode + "] is compatible with installed version [" - + mCurrentPackage.versionCode + "]"); + + mCurrentPackage.getLongVersionCode() + "]"); } // Reset per-package preconditions and fire the appropriate next state @@ -635,7 +635,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { } // Guts of a key/value restore operation - void initiateOneRestore(PackageInfo app, int appVersionCode) { + void initiateOneRestore(PackageInfo app, long appVersionCode) { final String packageName = app.packageName; if (DEBUG) { diff --git a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java index 734fa1d6cd7b..010684e86b55 100644 --- a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java +++ b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java @@ -56,6 +56,8 @@ public class BackupManagerMonitorUtils { pkg.packageName); bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION, pkg.versionCode); + bundle.putLong(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION, + pkg.getLongVersionCode()); } if (extras != null) { bundle.putAll(extras); diff --git a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java index b3e20dcfb2a6..a731fc9a0932 100644 --- a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java +++ b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java @@ -97,7 +97,7 @@ public class FullBackupUtils { printer.println(Integer.toString(BACKUP_MANIFEST_VERSION)); printer.println(pkg.packageName); - printer.println(Integer.toString(pkg.versionCode)); + printer.println(Long.toString(pkg.getLongVersionCode())); printer.println(Integer.toString(Build.VERSION.SDK_INT)); String installerName = packageManager.getInstallerPackageName(pkg.packageName); diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java index 2910ba2ee2f1..ff9cb5696c77 100644 --- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java +++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java @@ -422,7 +422,7 @@ public class TarBackupReader { LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, null); policy = RestorePolicy.ACCEPT; - } else if (pkgInfo.versionCode >= info.version) { + } else if (pkgInfo.getLongVersionCode() >= info.version) { Slog.i(TAG, "Sig + version match; taking data"); policy = RestorePolicy.ACCEPT; mMonitor = BackupManagerMonitorUtils.monitorEvent( @@ -439,7 +439,7 @@ public class TarBackupReader { Slog.i(TAG, "Data version " + info.version + " is newer than installed " + "version " - + pkgInfo.versionCode + + pkgInfo.getLongVersionCode() + " - requiring apk"); policy = RestorePolicy.ACCEPT_IF_APK; } else { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 43a4aefb89ba..cbf09b7e1476 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14596,7 +14596,7 @@ public class ActivityManagerService extends IActivityManager.Stub try { PackageInfo pi = pm.getPackageInfo(pkg, 0, UserHandle.getCallingUserId()); if (pi != null) { - sb.append(" v").append(pi.versionCode); + sb.append(" v").append(pi.getLongVersionCode()); if (pi.versionName != null) { sb.append(" (").append(pi.versionName).append(")"); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 9e9318a256e3..87690d1961a9 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -935,7 +935,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } - public void notePackageInstalled(String pkgName, int versionCode) { + public void notePackageInstalled(String pkgName, long versionCode) { enforceCallingPermission(); synchronized (mStats) { mStats.notePackageInstalledLocked(pkgName, versionCode); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 9d3c2ae3617a..71d6604a44bf 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -730,7 +730,7 @@ final class ProcessRecord { /* * Return true if package has been added false if not */ - public boolean addPackage(String pkg, int versionCode, ProcessStatsService tracker) { + public boolean addPackage(String pkg, long versionCode, ProcessStatsService tracker) { if (!pkgList.containsKey(pkg)) { ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder( versionCode); diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java index effb86c1bc07..5f9d61621ede 100644 --- a/services/core/java/com/android/server/am/ProcessStatsService.java +++ b/services/core/java/com/android/server/am/ProcessStatsService.java @@ -27,6 +27,7 @@ import android.service.procstats.ProcessStatsProto; import android.service.procstats.ProcessStatsServiceDumpProto; import android.util.ArrayMap; import android.util.AtomicFile; +import android.util.LongSparseArray; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; @@ -120,12 +121,12 @@ public final class ProcessStatsService extends IProcessStats.Stub { } public ProcessState getProcessStateLocked(String packageName, - int uid, int versionCode, String processName) { + int uid, long versionCode, String processName) { return mProcessStats.getProcessStateLocked(packageName, uid, versionCode, processName); } public ServiceState getServiceStateLocked(String packageName, int uid, - int versionCode, String processName, String className) { + long versionCode, String processName, String className) { return mProcessStats.getServiceStateLocked(packageName, uid, versionCode, processName, className); } @@ -150,12 +151,13 @@ public final class ProcessStatsService extends IProcessStats.Stub { } mProcessStats.mMemFactor = memFactor; mProcessStats.mStartTime = now; - final ArrayMap<String, SparseArray<SparseArray<ProcessStats.PackageState>>> pmap + final ArrayMap<String, SparseArray<LongSparseArray<ProcessStats.PackageState>>> pmap = mProcessStats.mPackages.getMap(); for (int ipkg=pmap.size()-1; ipkg>=0; ipkg--) { - final SparseArray<SparseArray<ProcessStats.PackageState>> uids = pmap.valueAt(ipkg); + final SparseArray<LongSparseArray<ProcessStats.PackageState>> uids = + pmap.valueAt(ipkg); for (int iuid=uids.size()-1; iuid>=0; iuid--) { - final SparseArray<ProcessStats.PackageState> vers = uids.valueAt(iuid); + final LongSparseArray<ProcessStats.PackageState> vers = uids.valueAt(iuid); for (int iver=vers.size()-1; iver>=0; iver--) { final ProcessStats.PackageState pkg = vers.valueAt(iver); final ArrayMap<String, ServiceState> services = pkg.mServices; @@ -308,17 +310,17 @@ public final class ProcessStatsService extends IProcessStats.Stub { Slog.w(TAG, " Uid " + uids.keyAt(iu) + ": " + uids.valueAt(iu)); } } - ArrayMap<String, SparseArray<SparseArray<ProcessStats.PackageState>>> pkgMap + ArrayMap<String, SparseArray<LongSparseArray<ProcessStats.PackageState>>> pkgMap = stats.mPackages.getMap(); final int NPKG = pkgMap.size(); for (int ip=0; ip<NPKG; ip++) { Slog.w(TAG, "Package: " + pkgMap.keyAt(ip)); - SparseArray<SparseArray<ProcessStats.PackageState>> uids + SparseArray<LongSparseArray<ProcessStats.PackageState>> uids = pkgMap.valueAt(ip); final int NUID = uids.size(); for (int iu=0; iu<NUID; iu++) { Slog.w(TAG, " Uid: " + uids.keyAt(iu)); - SparseArray<ProcessStats.PackageState> vers = uids.valueAt(iu); + LongSparseArray<ProcessStats.PackageState> vers = uids.valueAt(iu); final int NVERS = vers.size(); for (int iv=0; iv<NVERS; iv++) { Slog.w(TAG, " Vers: " + vers.keyAt(iv)); diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java index 5f54c67a35a1..f9fff794896f 100644 --- a/services/core/java/com/android/server/pm/InstantAppResolver.java +++ b/services/core/java/com/android/server/pm/InstantAppResolver.java @@ -159,7 +159,7 @@ public abstract class InstantAppResolver { long startTime) { final String packageName; final String splitName; - final int versionCode; + final long versionCode; final Intent failureIntent; if (instantAppResolveInfoList != null && instantAppResolveInfoList.size() > 0) { final AuxiliaryResolveInfo instantAppIntentInfo = @@ -241,7 +241,7 @@ public abstract class InstantAppResolver { @NonNull String instantAppPackageName, @Nullable String instantAppSplitName, @Nullable ComponentName installFailureActivity, - int versionCode, + long versionCode, @Nullable String token, boolean needsPhaseTwo) { // Construct the intent that launches the instant installer @@ -307,7 +307,8 @@ public abstract class InstantAppResolver { intent.putExtra(Intent.EXTRA_PACKAGE_NAME, instantAppPackageName); intent.putExtra(Intent.EXTRA_SPLIT_NAME, instantAppSplitName); - intent.putExtra(Intent.EXTRA_VERSION_CODE, versionCode); + intent.putExtra(Intent.EXTRA_VERSION_CODE, (int) (versionCode & 0x7fffffff)); + intent.putExtra(Intent.EXTRA_LONG_VERSION_CODE, versionCode); intent.putExtra(Intent.EXTRA_CALLING_PACKAGE, callingPackage); if (verificationBundle != null) { intent.putExtra(Intent.EXTRA_VERIFICATION_BUNDLE, verificationBundle); diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 711352f905be..5cf08dc42a24 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -225,7 +225,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @GuardedBy("mLock") private String mPackageName; @GuardedBy("mLock") - private int mVersionCode; + private long mVersionCode; @GuardedBy("mLock") private Signature[] mSignatures; @GuardedBy("mLock") @@ -1006,7 +1006,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // Use first package to define unknown values if (mPackageName == null) { mPackageName = apk.packageName; - mVersionCode = apk.versionCode; + mVersionCode = apk.getLongVersionCode(); } if (mSignatures == null) { mSignatures = apk.signatures; @@ -1057,7 +1057,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // ensure we've got appropriate package name, version code and signatures if (mPackageName == null) { mPackageName = pkgInfo.packageName; - mVersionCode = pkgInfo.versionCode; + mVersionCode = pkgInfo.getLongVersionCode(); } if (mSignatures == null) { mSignatures = pkgInfo.signatures; @@ -1149,7 +1149,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { + " specified package " + params.appPackageName + " inconsistent with " + apk.packageName); } - if (mVersionCode != apk.versionCode) { + if (mVersionCode != apk.getLongVersionCode()) { throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, tag + " version code " + apk.versionCode + " inconsistent with " + mVersionCode); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d0ad4acce050..519b2a8a2cd1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -111,7 +111,6 @@ import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures; import static com.android.server.pm.permission.PermissionsState.PERMISSION_OPERATION_FAILURE; import static com.android.server.pm.permission.PermissionsState.PERMISSION_OPERATION_SUCCESS; import static com.android.server.pm.permission.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED; -import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter; import android.Manifest; import android.annotation.IntDef; @@ -242,6 +241,8 @@ import android.util.EventLog; import android.util.ExceptionUtils; import android.util.Log; import android.util.LogPrinter; +import android.util.LongSparseArray; +import android.util.LongSparseLongArray; import android.util.MathUtils; import android.util.PackageUtils; import android.util.Pair; @@ -263,16 +264,13 @@ import com.android.internal.app.ResolverActivity; import com.android.internal.content.NativeLibraryHelper; import com.android.internal.content.PackageHelper; import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.IParcelFileDescriptorFactory; -import com.android.internal.os.RoSystemProperties; import com.android.internal.os.SomeArgs; import com.android.internal.os.Zygote; import com.android.internal.telephony.CarrierAppUtils; import com.android.internal.util.ArrayUtils; import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.DumpUtils; -import com.android.internal.util.FastPrintWriter; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; @@ -307,30 +305,23 @@ import com.android.server.pm.permission.PermissionsState.PermissionState; import com.android.server.storage.DeviceStorageMonitorInternal; import dalvik.system.CloseGuard; -import dalvik.system.DexFile; import dalvik.system.VMRuntime; import libcore.io.IoUtils; -import libcore.io.Streams; -import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.BufferedOutputStream; -import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -341,15 +332,12 @@ import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.SecureRandom; import java.security.cert.Certificate; -import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -363,7 +351,6 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.zip.GZIPInputStream; /** * Keep track of all those APKs everywhere. @@ -887,8 +874,8 @@ public class PackageManagerService extends IPackageManager.Stub public final @Nullable String apk; public final @NonNull SharedLibraryInfo info; - SharedLibraryEntry(String _path, String _apk, String name, int version, int type, - String declaringPackageName, int declaringPackageVersionCode) { + SharedLibraryEntry(String _path, String _apk, String name, long version, int type, + String declaringPackageName, long declaringPackageVersionCode) { path = _path; apk = _apk; info = new SharedLibraryInfo(name, version, type, new VersionedPackage( @@ -897,8 +884,8 @@ public class PackageManagerService extends IPackageManager.Stub } // Currently known shared libraries. - final ArrayMap<String, SparseArray<SharedLibraryEntry>> mSharedLibraries = new ArrayMap<>(); - final ArrayMap<String, SparseArray<SharedLibraryEntry>> mStaticLibsByDeclaringPackage = + final ArrayMap<String, LongSparseArray<SharedLibraryEntry>> mSharedLibraries = new ArrayMap<>(); + final ArrayMap<String, LongSparseArray<SharedLibraryEntry>> mStaticLibsByDeclaringPackage = new ArrayMap<>(); // All available activities, for your resolving pleasure. @@ -2642,7 +2629,7 @@ public class PackageManagerService extends IPackageManager.Stub + ps.name + "; removing system app. Last known codePath=" + ps.codePathString + ", installStatus=" + ps.installStatus + ", versionCode=" + ps.versionCode + "; scanned versionCode=" - + scannedPkg.mVersionCode); + + scannedPkg.getLongVersionCode()); removePackageLI(scannedPkg, true); mExpectingBetter.put(ps.name, ps.codePath); } @@ -3830,7 +3817,7 @@ public class PackageManagerService extends IPackageManager.Stub public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage, int flags, int userId) { return getPackageInfoInternal(versionedPackage.getPackageName(), - versionedPackage.getVersionCode(), flags, Binder.getCallingUid(), userId); + versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId); } /** @@ -3839,7 +3826,7 @@ public class PackageManagerService extends IPackageManager.Stub * to clearing. Because it can only be provided by trusted code, it's value can be * trusted and will be used as-is; unlike userId which will be validated by this method. */ - private PackageInfo getPackageInfoInternal(String packageName, int versionCode, + private PackageInfo getPackageInfoInternal(String packageName, long versionCode, int flags, int filterCallingUid, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForPackage(flags, userId, packageName); @@ -4036,7 +4023,7 @@ public class PackageManagerService extends IPackageManager.Stub if (index < 0) { continue; } - if (uidPs.pkg.usesStaticLibrariesVersions[index] == libEntry.info.getVersion()) { + if (uidPs.pkg.usesStaticLibrariesVersions[index] == libEntry.info.getLongVersion()) { return false; } } @@ -4432,7 +4419,8 @@ public class PackageManagerService extends IPackageManager.Stub final int[] allUsers = sUserManager.getUserIds(); final int libCount = mSharedLibraries.size(); for (int i = 0; i < libCount; i++) { - final SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i); + final LongSparseArray<SharedLibraryEntry> versionedLib + = mSharedLibraries.valueAt(i); if (versionedLib == null) { continue; } @@ -4449,7 +4437,8 @@ public class PackageManagerService extends IPackageManager.Stub final VersionedPackage declaringPackage = libInfo.getDeclaringPackage(); // Resolve the package name - we use synthetic package names internally final String internalPackageName = resolveInternalPackageNameLPr( - declaringPackage.getPackageName(), declaringPackage.getVersionCode()); + declaringPackage.getPackageName(), + declaringPackage.getLongVersionCode()); final PackageSetting ps = mSettings.getPackageLPr(internalPackageName); // Skip unused static shared libs cached less than the min period // to prevent pruning a lib needed by a subsequently installed package. @@ -4460,7 +4449,7 @@ public class PackageManagerService extends IPackageManager.Stub packagesToDelete = new ArrayList<>(); } packagesToDelete.add(new VersionedPackage(internalPackageName, - declaringPackage.getVersionCode())); + declaringPackage.getLongVersionCode())); } } } @@ -4470,7 +4459,7 @@ public class PackageManagerService extends IPackageManager.Stub for (int i = 0; i < packageCount; i++) { final VersionedPackage pkgToDelete = packagesToDelete.get(i); // Delete the package synchronously (will fail of the lib used for any user). - if (deletePackageX(pkgToDelete.getPackageName(), pkgToDelete.getVersionCode(), + if (deletePackageX(pkgToDelete.getPackageName(), pkgToDelete.getLongVersionCode(), UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS) == PackageManager.DELETE_SUCCEEDED) { if (volume.getUsableSpace() >= neededSpace) { @@ -4775,7 +4764,7 @@ public class PackageManagerService extends IPackageManager.Stub final int libCount = mSharedLibraries.size(); for (int i = 0; i < libCount; i++) { - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i); + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i); if (versionedLib == null) { continue; } @@ -4799,7 +4788,7 @@ public class PackageManagerService extends IPackageManager.Stub } SharedLibraryInfo resLibInfo = new SharedLibraryInfo(libInfo.getName(), - libInfo.getVersion(), libInfo.getType(), + libInfo.getLongVersion(), libInfo.getType(), libInfo.getDeclaringPackage(), getPackagesUsingSharedLibraryLPr(libInfo, flags, userId)); @@ -4835,7 +4824,7 @@ public class PackageManagerService extends IPackageManager.Stub if (libIdx < 0) { continue; } - if (ps.usesStaticLibrariesVersions[libIdx] != libInfo.getVersion()) { + if (ps.usesStaticLibrariesVersions[libIdx] != libInfo.getLongVersion()) { continue; } if (versionedPackages == null) { @@ -4916,7 +4905,7 @@ public class PackageManagerService extends IPackageManager.Stub Set<String> libs = null; final int libCount = mSharedLibraries.size(); for (int i = 0; i < libCount; i++) { - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i); + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i); if (versionedLib == null) { continue; } @@ -8341,12 +8330,12 @@ public class PackageManagerService extends IPackageManager.Stub // version of the new path against what we have stored to determine // what to do. if (DEBUG_INSTALL) Slog.d(TAG, "Path changing from " + ps.codePath); - if (pkg.mVersionCode <= ps.versionCode) { + if (pkg.getLongVersionCode() <= ps.versionCode) { // The system package has been updated and the code path does not match // Ignore entry. Skip it. if (DEBUG_INSTALL) Slog.i(TAG, "Package " + ps.name + " at " + pkg.codePath + " ignored: updated version " + ps.versionCode - + " better than this " + pkg.mVersionCode); + + " better than this " + pkg.getLongVersionCode()); if (!updatedPs.codePathString.equals(pkg.codePath)) { Slog.w(PackageManagerService.TAG, "Code path for hidden system pkg " + ps.name + " changing from " + updatedPs.codePathString @@ -8358,7 +8347,7 @@ public class PackageManagerService extends IPackageManager.Stub updatedPs.resourcePathString = pkg.codePath; } updatedPs.pkg = pkg; - updatedPs.versionCode = pkg.mVersionCode; + updatedPs.versionCode = pkg.getLongVersionCode(); // Update the disabled system child packages to point to the package too. final int childCount = updatedPs.childPackageNames != null @@ -8369,7 +8358,7 @@ public class PackageManagerService extends IPackageManager.Stub childPackageName); if (updatedChildPkg != null) { updatedChildPkg.pkg = pkg; - updatedChildPkg.versionCode = pkg.mVersionCode; + updatedChildPkg.versionCode = pkg.getLongVersionCode(); } } } else { @@ -8387,7 +8376,7 @@ public class PackageManagerService extends IPackageManager.Stub logCriticalInfo(Log.WARN, "Package " + ps.name + " at " + pkg.codePath + " reverting from " + ps.codePathString - + ": new version " + pkg.mVersionCode + + ": new version " + pkg.getLongVersionCode() + " better than installed " + ps.versionCode); InstallArgs args = createInstallArgsForExisting(packageFlagsToInstallFlags(ps), @@ -8442,7 +8431,7 @@ public class PackageManagerService extends IPackageManager.Stub throw new PackageManagerException(Log.WARN, "Package " + pkg.packageName + " at " + pkg.codePath + " ignored: updated version " + updatedPs.versionCode - + " better than this " + pkg.mVersionCode); + + " better than this " + pkg.getLongVersionCode()); } if (isUpdatedPkg) { @@ -8491,11 +8480,11 @@ public class PackageManagerService extends IPackageManager.Stub * already installed version, hide it. It will be scanned later * and re-added like an update. */ - if (pkg.mVersionCode <= ps.versionCode) { + if (pkg.getLongVersionCode() <= ps.versionCode) { shouldHideSystemApp = true; logCriticalInfo(Log.INFO, "Package " + ps.name + " appeared at " + pkg.codePath - + " but new version " + pkg.mVersionCode + " better than installed " - + ps.versionCode + "; hiding system"); + + " but new version " + pkg.getLongVersionCode() + + " better than installed " + ps.versionCode + "; hiding system"); } else { /* * The newly found system app is a newer version that the @@ -8505,7 +8494,8 @@ public class PackageManagerService extends IPackageManager.Stub */ logCriticalInfo(Log.WARN, "Package " + ps.name + " at " + pkg.codePath + " reverting from " + ps.codePathString + ": new version " - + pkg.mVersionCode + " better than installed " + ps.versionCode); + + pkg.getLongVersionCode() + " better than installed " + + ps.versionCode); InstallArgs args = createInstallArgsForExisting(packageFlagsToInstallFlags(ps), ps.codePathString, ps.resourcePathString, getAppDexInstructionSets(ps)); synchronized (mInstallLock) { @@ -9083,12 +9073,12 @@ public class PackageManagerService extends IPackageManager.Stub } } - private void findSharedNonSystemLibrariesRecursive(ArrayList<String> libs, int[] versions, + private void findSharedNonSystemLibrariesRecursive(ArrayList<String> libs, long[] versions, ArrayList<PackageParser.Package> collected, Set<String> collectedNames) { final int libNameCount = libs.size(); for (int i = 0; i < libNameCount; i++) { String libName = libs.get(i); - int version = (versions != null && versions.length == libNameCount) + long version = (versions != null && versions.length == libNameCount) ? versions[i] : PackageManager.VERSION_CODE_HIGHEST; PackageParser.Package libPkg = findSharedNonSystemLibrary(libName, version); if (libPkg != null) { @@ -9097,7 +9087,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - private PackageParser.Package findSharedNonSystemLibrary(String name, int version) { + private PackageParser.Package findSharedNonSystemLibrary(String name, long version) { synchronized (mPackages) { SharedLibraryEntry libEntry = getSharedLibraryEntryLPr(name, version); if (libEntry != null) { @@ -9107,8 +9097,8 @@ public class PackageManagerService extends IPackageManager.Stub } } - private SharedLibraryEntry getSharedLibraryEntryLPr(String name, int version) { - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(name); + private SharedLibraryEntry getSharedLibraryEntryLPr(String name, long version) { + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(name); if (versionedLib == null) { return null; } @@ -9116,15 +9106,15 @@ public class PackageManagerService extends IPackageManager.Stub } private SharedLibraryEntry getLatestSharedLibraVersionLPr(PackageParser.Package pkg) { - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get( + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get( pkg.staticSharedLibName); if (versionedLib == null) { return null; } - int previousLibVersion = -1; + long previousLibVersion = -1; final int versionCount = versionedLib.size(); for (int i = 0; i < versionCount; i++) { - final int libVersion = versionedLib.keyAt(i); + final long libVersion = versionedLib.keyAt(i); if (libVersion < pkg.staticSharedLibVersion) { previousLibVersion = Math.max(previousLibVersion, libVersion); } @@ -9408,14 +9398,14 @@ public class PackageManagerService extends IPackageManager.Stub } private Set<String> addSharedLibrariesLPw(@NonNull List<String> requestedLibraries, - @Nullable int[] requiredVersions, @Nullable String[][] requiredCertDigests, + @Nullable long[] requiredVersions, @Nullable String[][] requiredCertDigests, @NonNull String packageName, @Nullable PackageParser.Package changingLib, boolean required, int targetSdk, @Nullable Set<String> outUsedLibraries) throws PackageManagerException { final int libCount = requestedLibraries.size(); for (int i = 0; i < libCount; i++) { final String libName = requestedLibraries.get(i); - final int libVersion = requiredVersions != null ? requiredVersions[i] + final long libVersion = requiredVersions != null ? requiredVersions[i] : SharedLibraryInfo.VERSION_UNDEFINED; final SharedLibraryEntry libEntry = getSharedLibraryEntryLPr(libName, libVersion); if (libEntry == null) { @@ -9430,11 +9420,11 @@ public class PackageManagerService extends IPackageManager.Stub } } else { if (requiredVersions != null && requiredCertDigests != null) { - if (libEntry.info.getVersion() != requiredVersions[i]) { + if (libEntry.info.getLongVersion() != requiredVersions[i]) { throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY, "Package " + packageName + " requires unavailable static shared" + " library " + libName + " version " - + libEntry.info.getVersion() + "; failing!"); + + libEntry.info.getLongVersion() + "; failing!"); } PackageParser.Package libPkg = mPackages.get(libEntry.apk); @@ -9793,7 +9783,7 @@ public class PackageManagerService extends IPackageManager.Stub pkgSetting = Settings.createNewSetting(pkg.packageName, origPackage, disabledPkgSetting, realName, suid, destCodeFile, destResourceFile, pkg.applicationInfo.nativeLibraryRootDir, pkg.applicationInfo.primaryCpuAbi, - pkg.applicationInfo.secondaryCpuAbi, pkg.mVersionCode, + pkg.applicationInfo.secondaryCpuAbi, pkg.getLongVersionCode(), pkg.applicationInfo.flags, pkg.applicationInfo.privateFlags, user, true /*allowInstall*/, instantApp, virtualPreload, parentPackageName, pkg.getChildPackageNames(), @@ -10357,20 +10347,20 @@ public class PackageManagerService extends IPackageManager.Stub } // The version codes must be ordered as lib versions - int minVersionCode = Integer.MIN_VALUE; - int maxVersionCode = Integer.MAX_VALUE; + long minVersionCode = Long.MIN_VALUE; + long maxVersionCode = Long.MAX_VALUE; - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get( + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get( pkg.staticSharedLibName); if (versionedLib != null) { final int versionCount = versionedLib.size(); for (int i = 0; i < versionCount; i++) { SharedLibraryInfo libInfo = versionedLib.valueAt(i).info; - final int libVersionCode = libInfo.getDeclaringPackage() - .getVersionCode(); - if (libInfo.getVersion() < pkg.staticSharedLibVersion) { + final long libVersionCode = libInfo.getDeclaringPackage() + .getLongVersionCode(); + if (libInfo.getLongVersion() < pkg.staticSharedLibVersion) { minVersionCode = Math.max(minVersionCode, libVersionCode + 1); - } else if (libInfo.getVersion() > pkg.staticSharedLibVersion) { + } else if (libInfo.getLongVersion() > pkg.staticSharedLibVersion) { maxVersionCode = Math.min(maxVersionCode, libVersionCode - 1); } else { minVersionCode = maxVersionCode = libVersionCode; @@ -10378,7 +10368,8 @@ public class PackageManagerService extends IPackageManager.Stub } } } - if (pkg.mVersionCode < minVersionCode || pkg.mVersionCode > maxVersionCode) { + if (pkg.getLongVersionCode() < minVersionCode + || pkg.getLongVersionCode() > maxVersionCode) { throw new PackageManagerException("Static shared" + " lib version codes must be ordered as lib versions"); } @@ -10468,11 +10459,11 @@ public class PackageManagerService extends IPackageManager.Stub } } - private boolean addSharedLibraryLPw(String path, String apk, String name, int version, - int type, String declaringPackageName, int declaringVersionCode) { - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(name); + private boolean addSharedLibraryLPw(String path, String apk, String name, long version, + int type, String declaringPackageName, long declaringVersionCode) { + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(name); if (versionedLib == null) { - versionedLib = new SparseArray<>(); + versionedLib = new LongSparseArray<>(); mSharedLibraries.put(name, versionedLib); if (type == SharedLibraryInfo.TYPE_STATIC) { mStaticLibsByDeclaringPackage.put(declaringPackageName, versionedLib); @@ -10486,8 +10477,8 @@ public class PackageManagerService extends IPackageManager.Stub return true; } - private boolean removeSharedLibraryLPw(String name, int version) { - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(name); + private boolean removeSharedLibraryLPw(String name, long version) { + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(name); if (versionedLib == null) { return false; } @@ -10526,6 +10517,7 @@ public class PackageManagerService extends IPackageManager.Stub // Set up information for our fall-back user intent resolution activity. mPlatformPackage = pkg; pkg.mVersionCode = mSdkVersion; + pkg.mVersionCodeMajor = 0; mAndroidApplication = pkg.applicationInfo; if (!mResolverReplaced) { mResolveActivity.applicationInfo = mAndroidApplication; @@ -10567,7 +10559,7 @@ public class PackageManagerService extends IPackageManager.Stub // names to allow install of multiple versions, so use name from manifest. if (addSharedLibraryLPw(null, pkg.packageName, pkg.staticSharedLibName, pkg.staticSharedLibVersion, SharedLibraryInfo.TYPE_STATIC, - pkg.manifestPackageName, pkg.mVersionCode)) { + pkg.manifestPackageName, pkg.getLongVersionCode())) { hasStaticSharedLibs = true; } else { Slog.w(TAG, "Package " + pkg.packageName + " library " @@ -10613,7 +10605,7 @@ public class PackageManagerService extends IPackageManager.Stub if (!addSharedLibraryLPw(null, pkg.packageName, name, SharedLibraryInfo.VERSION_UNDEFINED, SharedLibraryInfo.TYPE_DYNAMIC, - pkg.packageName, pkg.mVersionCode)) { + pkg.packageName, pkg.getLongVersionCode())) { Slog.w(TAG, "Package " + pkg.packageName + " library " + name + " already exists; skipping"); } @@ -14608,6 +14600,9 @@ public class PackageManagerService extends IPackageManager.Stub verification.putExtra(PackageManager.EXTRA_VERIFICATION_VERSION_CODE, pkgLite.versionCode); + verification.putExtra(PackageManager.EXTRA_VERIFICATION_LONG_VERSION_CODE, + pkgLite.getLongVersionCode()); + if (verificationInfo != null) { if (verificationInfo.originatingUri != null) { verification.putExtra(Intent.EXTRA_ORIGINATING_URI, @@ -16525,7 +16520,8 @@ public class PackageManagerService extends IPackageManager.Stub // unless this is the exact same version code which is useful for // development. PackageParser.Package existingPkg = mPackages.get(pkg.packageName); - if (existingPkg != null && existingPkg.mVersionCode != pkg.mVersionCode) { + if (existingPkg != null && + existingPkg.getLongVersionCode() != pkg.getLongVersionCode()) { res.setError(INSTALL_FAILED_DUPLICATE_PACKAGE, "Packages declaring " + "static-shared libs cannot be updated"); return; @@ -16828,17 +16824,16 @@ public class PackageManagerService extends IPackageManager.Stub final boolean canViewInstantApps = canViewInstantApps(callingUid, userId); Preconditions.checkNotNull(versionedPackage); Preconditions.checkNotNull(observer); - Preconditions.checkArgumentInRange(versionedPackage.getVersionCode(), + Preconditions.checkArgumentInRange(versionedPackage.getLongVersionCode(), PackageManager.VERSION_CODE_HIGHEST, - Integer.MAX_VALUE, "versionCode must be >= -1"); + Long.MAX_VALUE, "versionCode must be >= -1"); final String packageName = versionedPackage.getPackageName(); - final int versionCode = versionedPackage.getVersionCode(); + final long versionCode = versionedPackage.getLongVersionCode(); final String internalPackageName; synchronized (mPackages) { // Normalize package name to handle renamed packages and static libs - internalPackageName = resolveInternalPackageNameLPr(versionedPackage.getPackageName(), - versionedPackage.getVersionCode()); + internalPackageName = resolveInternalPackageNameLPr(packageName, versionCode); } final int uid = Binder.getCallingUid(); @@ -16946,24 +16941,24 @@ public class PackageManagerService extends IPackageManager.Stub return pkg.packageName; } - private String resolveInternalPackageNameLPr(String packageName, int versionCode) { + private String resolveInternalPackageNameLPr(String packageName, long versionCode) { // Handle renamed packages String normalizedPackageName = mSettings.getRenamedPackageLPr(packageName); packageName = normalizedPackageName != null ? normalizedPackageName : packageName; // Is this a static library? - SparseArray<SharedLibraryEntry> versionedLib = + LongSparseArray<SharedLibraryEntry> versionedLib = mStaticLibsByDeclaringPackage.get(packageName); if (versionedLib == null || versionedLib.size() <= 0) { return packageName; } // Figure out which lib versions the caller can see - SparseIntArray versionsCallerCanSee = null; + LongSparseLongArray versionsCallerCanSee = null; final int callingAppId = UserHandle.getAppId(Binder.getCallingUid()); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.SHELL_UID && callingAppId != Process.ROOT_UID) { - versionsCallerCanSee = new SparseIntArray(); + versionsCallerCanSee = new LongSparseLongArray(); String libName = versionedLib.valueAt(0).info.getName(); String[] uidPackages = getPackagesForUid(Binder.getCallingUid()); if (uidPackages != null) { @@ -16971,7 +16966,7 @@ public class PackageManagerService extends IPackageManager.Stub PackageSetting ps = mSettings.getPackageLPr(uidPackage); final int libIdx = ArrayUtils.indexOf(ps.usesStaticLibraries, libName); if (libIdx >= 0) { - final int libVersion = ps.usesStaticLibrariesVersions[libIdx]; + final long libVersion = ps.usesStaticLibrariesVersions[libIdx]; versionsCallerCanSee.append(libVersion, libVersion); } } @@ -16989,10 +16984,10 @@ public class PackageManagerService extends IPackageManager.Stub for (int i = 0; i < versionCount; i++) { SharedLibraryEntry libEntry = versionedLib.valueAt(i); if (versionsCallerCanSee != null && versionsCallerCanSee.indexOfKey( - libEntry.info.getVersion()) < 0) { + libEntry.info.getLongVersion()) < 0) { continue; } - final int libVersionCode = libEntry.info.getDeclaringPackage().getVersionCode(); + final long libVersionCode = libEntry.info.getDeclaringPackage().getLongVersionCode(); if (versionCode != PackageManager.VERSION_CODE_HIGHEST) { if (libVersionCode == versionCode) { return libEntry.apk; @@ -17000,7 +16995,7 @@ public class PackageManagerService extends IPackageManager.Stub } else if (highestVersion == null) { highestVersion = libEntry; } else if (libVersionCode > highestVersion.info - .getDeclaringPackage().getVersionCode()) { + .getDeclaringPackage().getLongVersionCode()) { highestVersion = libEntry; } } @@ -17129,7 +17124,7 @@ public class PackageManagerService extends IPackageManager.Stub * persisting settings for later use * sending a broadcast if necessary */ - int deletePackageX(String packageName, int versionCode, int userId, int deleteFlags) { + int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags) { final PackageRemovedInfo info = new PackageRemovedInfo(this); final boolean res; @@ -17180,7 +17175,7 @@ public class PackageManagerService extends IPackageManager.Stub if (!ArrayUtils.isEmpty(libClientPackages)) { Slog.w(TAG, "Not removing package " + pkg.manifestPackageName + " hosting lib " + libEntry.info.getName() + " version " - + libEntry.info.getVersion() + " used by " + libClientPackages + + libEntry.info.getLongVersion() + " used by " + libClientPackages + " for user " + currUserId); return PackageManager.DELETE_FAILED_USED_SHARED_LIBRARY; } @@ -20450,7 +20445,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final Iterator<String> it = mSharedLibraries.keySet().iterator(); while (it.hasNext()) { String libName = it.next(); - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(libName); + LongSparseArray<SharedLibraryEntry> versionedLib + = mSharedLibraries.get(libName); if (versionedLib == null) { continue; } @@ -20470,7 +20466,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } pw.print(libEntry.info.getName()); if (libEntry.info.isStatic()) { - pw.print(" version=" + libEntry.info.getVersion()); + pw.print(" version=" + libEntry.info.getLongVersion()); } if (!checkin) { pw.print(" -> "); @@ -20839,7 +20835,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final int count = mSharedLibraries.size(); for (int i = 0; i < count; i++) { final String libName = mSharedLibraries.keyAt(i); - SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(libName); + LongSparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.get(libName); if (versionedLib == null) { continue; } @@ -22344,11 +22340,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); */ private static void checkDowngrade(PackageParser.Package before, PackageInfoLite after) throws PackageManagerException { - if (after.versionCode < before.mVersionCode) { + if (after.getLongVersionCode() < before.getLongVersionCode()) { throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, "Update version code " + after.versionCode + " is older than current " - + before.mVersionCode); - } else if (after.versionCode == before.mVersionCode) { + + before.getLongVersionCode()); + } else if (after.getLongVersionCode() == before.getLongVersionCode()) { if (after.baseRevisionCode < before.baseRevisionCode) { throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, "Update base revision code " + after.baseRevisionCode @@ -22535,12 +22531,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } @Override - public int getVersionCodeForPackage(String packageName) throws RemoteException { + public long getVersionCodeForPackage(String packageName) throws RemoteException { try { int callingUser = UserHandle.getUserId(Binder.getCallingUid()); PackageInfo pInfo = getPackageInfo(packageName, 0, callingUser); if (pInfo != null) { - return pInfo.versionCode; + return pInfo.getLongVersionCode(); } } catch (Exception e) { } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 44f36d1734c8..6c542bdaaf03 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -1245,7 +1245,7 @@ class PackageManagerShellCommand extends ShellCommand { final PrintWriter pw = getOutPrintWriter(); int flags = 0; int userId = UserHandle.USER_ALL; - int versionCode = PackageManager.VERSION_CODE_HIGHEST; + long versionCode = PackageManager.VERSION_CODE_HIGHEST; String opt; while ((opt = getNextOption()) != null) { @@ -1257,7 +1257,7 @@ class PackageManagerShellCommand extends ShellCommand { userId = UserHandle.parseUserArg(getNextArgRequired()); break; case "--versionCode": - versionCode = Integer.parseInt(getNextArgRequired()); + versionCode = Long.parseLong(getNextArgRequired()); break; default: pw.println("Error: Unknown option: " + opt); diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 3b414e9a0dc5..02056567eb6a 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -50,9 +50,9 @@ public final class PackageSetting extends PackageSettingBase { PackageSetting(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, - int pVersionCode, int pkgFlags, int privateFlags, String parentPackageName, + long pVersionCode, int pkgFlags, int privateFlags, String parentPackageName, List<String> childPackageNames, int sharedUserId, String[] usesStaticLibraries, - int[] usesStaticLibrariesVersions) { + long[] usesStaticLibrariesVersions) { super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode, pkgFlags, privateFlags, parentPackageName, childPackageNames, diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index a83876848910..9733624cddc6 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -75,7 +75,7 @@ public abstract class PackageSettingBase extends SettingBase { String resourcePathString; String[] usesStaticLibraries; - int[] usesStaticLibrariesVersions; + long[] usesStaticLibrariesVersions; /** * The path under which native libraries have been unpacked. This path is @@ -105,7 +105,7 @@ public abstract class PackageSettingBase extends SettingBase { long timeStamp; long firstInstallTime; long lastUpdateTime; - int versionCode; + long versionCode; boolean uidError; @@ -149,9 +149,9 @@ public abstract class PackageSettingBase extends SettingBase { PackageSettingBase(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, - int pVersionCode, int pkgFlags, int pkgPrivateFlags, + long pVersionCode, int pkgFlags, int pkgPrivateFlags, String parentPackageName, List<String> childPackageNames, - String[] usesStaticLibraries, int[] usesStaticLibrariesVersions) { + String[] usesStaticLibraries, long[] usesStaticLibrariesVersions) { super(pkgFlags, pkgPrivateFlags); this.name = name; this.realName = realName; @@ -180,7 +180,7 @@ public abstract class PackageSettingBase extends SettingBase { void init(File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, - String cpuAbiOverrideString, int pVersionCode) { + String cpuAbiOverrideString, long pVersionCode) { this.codePath = codePath; this.codePathString = codePath.toString(); this.resourcePath = resourcePath; diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index ddad6774871d..a8bc3c719673 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -593,10 +593,10 @@ public final class Settings { PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, - String secondaryCpuAbiString, String cpuAbiOverrideString, int uid, int vc, int + String secondaryCpuAbiString, String cpuAbiOverrideString, int uid, long vc, int pkgFlags, int pkgPrivateFlags, String parentPackageName, List<String> childPackageNames, String[] usesStaticLibraries, - int[] usesStaticLibraryNames) { + long[] usesStaticLibraryNames) { PackageSetting p = mPackages.get(name); if (p != null) { if (p.appId == uid) { @@ -673,11 +673,11 @@ public final class Settings { static @NonNull PackageSetting createNewSetting(String pkgName, PackageSetting originalPkg, PackageSetting disabledPkg, String realPkgName, SharedUserSetting sharedUser, File codePath, File resourcePath, String legacyNativeLibraryPath, String primaryCpuAbi, - String secondaryCpuAbi, int versionCode, int pkgFlags, int pkgPrivateFlags, + String secondaryCpuAbi, long versionCode, int pkgFlags, int pkgPrivateFlags, UserHandle installUser, boolean allowInstall, boolean instantApp, boolean virtualPreload, String parentPkgName, List<String> childPkgNames, UserManagerService userManager, - String[] usesStaticLibraries, int[] usesStaticLibrariesVersions) { + String[] usesStaticLibraries, long[] usesStaticLibrariesVersions) { final PackageSetting pkgSetting; if (originalPkg != null) { if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " @@ -788,7 +788,7 @@ public final class Settings { @Nullable String primaryCpuAbi, @Nullable String secondaryCpuAbi, int pkgFlags, int pkgPrivateFlags, @Nullable List<String> childPkgNames, @NonNull UserManagerService userManager, @Nullable String[] usesStaticLibraries, - @Nullable int[] usesStaticLibrariesVersions) throws PackageManagerException { + @Nullable long[] usesStaticLibrariesVersions) throws PackageManagerException { final String pkgName = pkgSetting.name; if (pkgSetting.sharedUser != sharedUser) { PackageManagerService.reportSettingsProblem(Log.WARN, @@ -949,8 +949,8 @@ public final class Settings { p.secondaryCpuAbiString = pkg.applicationInfo.secondaryCpuAbi; p.cpuAbiOverrideString = pkg.cpuAbiOverride; // Update version code if needed - if (pkg.mVersionCode != p.versionCode) { - p.versionCode = pkg.mVersionCode; + if (pkg.getLongVersionCode() != p.versionCode) { + p.versionCode = pkg.getLongVersionCode(); } // Update signatures if needed. if (p.signatures.mSignatures == null) { @@ -2287,9 +2287,9 @@ public final class Settings { String libName = parser.getAttributeValue(null, ATTR_NAME); String libVersionStr = parser.getAttributeValue(null, ATTR_VERSION); - int libVersion = -1; + long libVersion = -1; try { - libVersion = Integer.parseInt(libVersionStr); + libVersion = Long.parseLong(libVersionStr); } catch (NumberFormatException e) { // ignore } @@ -2297,7 +2297,7 @@ public final class Settings { if (libName != null && libVersion >= 0) { outPs.usesStaticLibraries = ArrayUtils.appendElement(String.class, outPs.usesStaticLibraries, libName); - outPs.usesStaticLibrariesVersions = ArrayUtils.appendInt( + outPs.usesStaticLibrariesVersions = ArrayUtils.appendLong( outPs.usesStaticLibrariesVersions, libVersion); } @@ -2306,7 +2306,7 @@ public final class Settings { } void writeUsesStaticLibLPw(XmlSerializer serializer, String[] usesStaticLibraries, - int[] usesStaticLibraryVersions) throws IOException { + long[] usesStaticLibraryVersions) throws IOException { if (ArrayUtils.isEmpty(usesStaticLibraries) || ArrayUtils.isEmpty(usesStaticLibraryVersions) || usesStaticLibraries.length != usesStaticLibraryVersions.length) { return; @@ -2314,10 +2314,10 @@ public final class Settings { final int libCount = usesStaticLibraries.length; for (int i = 0; i < libCount; i++) { final String libName = usesStaticLibraries[i]; - final int libVersion = usesStaticLibraryVersions[i]; + final long libVersion = usesStaticLibraryVersions[i]; serializer.startTag(null, TAG_USES_STATIC_LIB); serializer.attribute(null, ATTR_NAME, libName); - serializer.attribute(null, ATTR_VERSION, Integer.toString(libVersion)); + serializer.attribute(null, ATTR_VERSION, Long.toString(libVersion)); serializer.endTag(null, TAG_USES_STATIC_LIB); } } @@ -3561,10 +3561,10 @@ public final class Settings { resourcePathStr = codePathStr; } String version = parser.getAttributeValue(null, "version"); - int versionCode = 0; + long versionCode = 0; if (version != null) { try { - versionCode = Integer.parseInt(version); + versionCode = Long.parseLong(version); } catch (NumberFormatException e) { } } @@ -3677,7 +3677,7 @@ public final class Settings { long lastUpdateTime = 0; PackageSetting packageSetting = null; String version = null; - int versionCode = 0; + long versionCode = 0; String parentPackageName; try { name = parser.getAttributeValue(null, ATTR_NAME); @@ -3705,7 +3705,7 @@ public final class Settings { version = parser.getAttributeValue(null, "version"); if (version != null) { try { - versionCode = Integer.parseInt(version); + versionCode = Long.parseLong(version); } catch (NumberFormatException e) { } } diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index ba97c428bb44..7bab318069ff 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -725,7 +725,7 @@ class ShortcutPackage extends ShortcutPackageItem { // This means if a system app's version code doesn't change on an OTA, // we don't notice it's updated. But that's fine since their version code *should* // really change on OTAs. - if ((getPackageInfo().getVersionCode() == pi.versionCode) + if ((getPackageInfo().getVersionCode() == pi.getLongVersionCode()) && (getPackageInfo().getLastUpdateTime() == pi.lastUpdateTime) && areAllActivitiesStillEnabled()) { return false; @@ -759,11 +759,11 @@ class ShortcutPackage extends ShortcutPackageItem { if (ShortcutService.DEBUG) { Slog.d(TAG, String.format("Package %s %s, version %d -> %d", getPackageName(), (isNewApp ? "added" : "updated"), - getPackageInfo().getVersionCode(), pi.versionCode)); + getPackageInfo().getVersionCode(), pi.getLongVersionCode())); } getPackageInfo().updateFromPackageInfo(pi); - final int newVersionCode = getPackageInfo().getVersionCode(); + final long newVersionCode = getPackageInfo().getVersionCode(); // See if there are any shortcuts that were prevented restoring because the app was of a // lower version, and re-enable them. @@ -1412,7 +1412,7 @@ class ShortcutPackage extends ShortcutPackageItem { ShortcutService.writeAttr(out, ATTR_FLAGS, flags); // Set the publisher version code at every backup. - final int packageVersionCode = getPackageInfo().getVersionCode(); + final long packageVersionCode = getPackageInfo().getVersionCode(); if (packageVersionCode == 0) { s.wtf("Package version code should be available at this point."); // However, 0 is a valid version code, so we just go ahead with it... diff --git a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java index 3a9bbc8926ed..b14e9c99b138 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java +++ b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java @@ -59,8 +59,8 @@ class ShortcutPackageInfo { * been installed yet. */ private boolean mIsShadow; - private int mVersionCode = ShortcutInfo.VERSION_CODE_UNKNOWN; - private int mBackupSourceVersionCode = ShortcutInfo.VERSION_CODE_UNKNOWN; + private long mVersionCode = ShortcutInfo.VERSION_CODE_UNKNOWN; + private long mBackupSourceVersionCode = ShortcutInfo.VERSION_CODE_UNKNOWN; private long mLastUpdateTime; private ArrayList<byte[]> mSigHashes; @@ -73,7 +73,7 @@ class ShortcutPackageInfo { private boolean mBackupAllowed; private boolean mBackupSourceBackupAllowed; - private ShortcutPackageInfo(int versionCode, long lastUpdateTime, + private ShortcutPackageInfo(long versionCode, long lastUpdateTime, ArrayList<byte[]> sigHashes, boolean isShadow) { mVersionCode = versionCode; mLastUpdateTime = lastUpdateTime; @@ -96,11 +96,11 @@ class ShortcutPackageInfo { mIsShadow = shadow; } - public int getVersionCode() { + public long getVersionCode() { return mVersionCode; } - public int getBackupSourceVersionCode() { + public long getBackupSourceVersionCode() { return mBackupSourceVersionCode; } @@ -123,7 +123,7 @@ class ShortcutPackageInfo { */ public void updateFromPackageInfo(@NonNull PackageInfo pi) { if (pi != null) { - mVersionCode = pi.versionCode; + mVersionCode = pi.getLongVersionCode(); mLastUpdateTime = pi.lastUpdateTime; mBackupAllowed = ShortcutService.shouldBackupApp(pi); mBackupAllowedInitialized = true; @@ -145,7 +145,7 @@ class ShortcutPackageInfo { Slog.w(TAG, "Can't restore: package didn't or doesn't allow backup"); return ShortcutInfo.DISABLED_REASON_BACKUP_NOT_SUPPORTED; } - if (!anyVersionOkay && (currentPackage.versionCode < mBackupSourceVersionCode)) { + if (!anyVersionOkay && (currentPackage.getLongVersionCode() < mBackupSourceVersionCode)) { Slog.w(TAG, String.format( "Can't restore: package current version %d < backed up version %d", currentPackage.versionCode, mBackupSourceVersionCode)); @@ -162,11 +162,12 @@ class ShortcutPackageInfo { Slog.e(TAG, "Can't get signatures: package=" + packageName); return null; } - final ShortcutPackageInfo ret = new ShortcutPackageInfo(pi.versionCode, pi.lastUpdateTime, - BackupUtils.hashSignatureArray(pi.signatures), /* shadow=*/ false); + final ShortcutPackageInfo ret = new ShortcutPackageInfo(pi.getLongVersionCode(), + pi.lastUpdateTime, BackupUtils.hashSignatureArray(pi.signatures), + /* shadow=*/ false); ret.mBackupSourceBackupAllowed = s.shouldBackupApp(pi); - ret.mBackupSourceVersionCode = pi.versionCode; + ret.mBackupSourceVersionCode = pi.getLongVersionCode(); return ret; } @@ -213,7 +214,7 @@ class ShortcutPackageInfo { throws IOException, XmlPullParserException { // Don't use the version code from the backup file. - final int versionCode = ShortcutService.parseIntAttribute(parser, ATTR_VERSION, + final long versionCode = ShortcutService.parseLongAttribute(parser, ATTR_VERSION, ShortcutInfo.VERSION_CODE_UNKNOWN); final long lastUpdateTime = ShortcutService.parseLongAttribute( @@ -225,7 +226,7 @@ class ShortcutPackageInfo { // We didn't used to save these attributes, and all backed up shortcuts were from // apps that support backups, so the default values take this fact into consideration. - final int backupSourceVersion = ShortcutService.parseIntAttribute(parser, + final long backupSourceVersion = ShortcutService.parseLongAttribute(parser, ATTR_BACKUP_SOURCE_VERSION, ShortcutInfo.VERSION_CODE_UNKNOWN); // Note the only time these "true" default value is used is when restoring from an old diff --git a/services/core/java/com/android/server/pm/ShortcutPackageItem.java b/services/core/java/com/android/server/pm/ShortcutPackageItem.java index 689099cfcc3a..0629d9e45d64 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackageItem.java +++ b/services/core/java/com/android/server/pm/ShortcutPackageItem.java @@ -108,7 +108,7 @@ abstract class ShortcutPackageItem { return; // Not installed, no need to restore yet. } int restoreBlockReason; - int currentVersionCode = ShortcutInfo.VERSION_CODE_UNKNOWN; + long currentVersionCode = ShortcutInfo.VERSION_CODE_UNKNOWN; if (!mPackageInfo.hasSignatures()) { s.wtf("Attempted to restore package " + mPackageName + "/u" + mPackageUserId @@ -116,7 +116,7 @@ abstract class ShortcutPackageItem { restoreBlockReason = ShortcutInfo.DISABLED_REASON_SIGNATURE_MISMATCH; } else { final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); - currentVersionCode = pi.versionCode; + currentVersionCode = pi.getLongVersionCode(); restoreBlockReason = mPackageInfo.canRestoreTo(s, pi, canRestoreAnyVersion()); } diff --git a/services/core/java/com/android/server/security/KeyAttestationApplicationIdProviderService.java b/services/core/java/com/android/server/security/KeyAttestationApplicationIdProviderService.java index ab9ab6713eea..a8c68c07231d 100644 --- a/services/core/java/com/android/server/security/KeyAttestationApplicationIdProviderService.java +++ b/services/core/java/com/android/server/security/KeyAttestationApplicationIdProviderService.java @@ -63,7 +63,7 @@ public class KeyAttestationApplicationIdProviderService PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageNames[i], PackageManager.GET_SIGNATURES, userId); keyAttestationPackageInfos[i] = new KeyAttestationPackageInfo(packageNames[i], - packageInfo.versionCode, packageInfo.signatures); + packageInfo.getLongVersionCode(), packageInfo.signatures); } } catch (NameNotFoundException nnfe) { throw new RemoteException(nnfe.getMessage()); diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index 00c208d08883..1ce140004bcd 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -155,6 +155,14 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { return ret; } + private final static long[] toLongArray(List<Long> list) { + long[] ret = new long[list.size()]; + for (int i = 0; i < ret.length; i++) { + ret[i] = list.get(i); + } + return ret; + } + // Assumes that sStatsdLock is held. private final void informAllUidsLocked(Context context) throws RemoteException { UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); @@ -165,7 +173,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } List<Integer> uids = new ArrayList(); - List<Integer> versions = new ArrayList(); + List<Long> versions = new ArrayList(); List<String> apps = new ArrayList(); // Add in all the apps for every user/profile. @@ -174,12 +182,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { for (int j = 0; j < pi.size(); j++) { if (pi.get(j).applicationInfo != null) { uids.add(pi.get(j).applicationInfo.uid); - versions.add(pi.get(j).versionCode); + versions.add(pi.get(j).getLongVersionCode()); apps.add(pi.get(j).packageName); } } } - sStatsd.informAllUidData(toIntArray(uids), toIntArray(versions), apps.toArray(new + sStatsd.informAllUidData(toIntArray(uids), toLongArray(versions), apps.toArray(new String[apps.size()])); if (DEBUG) { Slog.w(TAG, "Sent data for " + uids.size() + " apps"); @@ -222,7 +230,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { int uid = b.getInt(Intent.EXTRA_UID); String app = intent.getData().getSchemeSpecificPart(); PackageInfo pi = pm.getPackageInfo(app, PackageManager.MATCH_ANY_USER); - sStatsd.informOnePackage(app, uid, pi.versionCode); + sStatsd.informOnePackage(app, uid, pi.getLongVersionCode()); } } catch (Exception e) { Slog.w(TAG, "Failed to inform statsd of an app update", e); diff --git a/services/core/java/com/android/server/timezone/CheckToken.java b/services/core/java/com/android/server/timezone/CheckToken.java index 51283608c66e..4c4a8d72f51d 100644 --- a/services/core/java/com/android/server/timezone/CheckToken.java +++ b/services/core/java/com/android/server/timezone/CheckToken.java @@ -46,8 +46,8 @@ final class CheckToken { ByteArrayOutputStream baos = new ByteArrayOutputStream(12 /* (3 * sizeof(int)) */); try (DataOutputStream dos = new DataOutputStream(baos)) { dos.writeInt(mOptimisticLockId); - dos.writeInt(mPackageVersions.mUpdateAppVersion); - dos.writeInt(mPackageVersions.mDataAppVersion); + dos.writeLong(mPackageVersions.mUpdateAppVersion); + dos.writeLong(mPackageVersions.mDataAppVersion); } catch (IOException e) { throw new RuntimeException("Unable to write into a ByteArrayOutputStream", e); } @@ -58,8 +58,8 @@ final class CheckToken { ByteArrayInputStream bais = new ByteArrayInputStream(tokenBytes); try (DataInputStream dis = new DataInputStream(bais)) { int versionId = dis.readInt(); - int updateAppVersion = dis.readInt(); - int dataAppVersion = dis.readInt(); + long updateAppVersion = dis.readLong(); + long dataAppVersion = dis.readLong(); return new CheckToken(versionId, new PackageVersions(updateAppVersion, dataAppVersion)); } } diff --git a/services/core/java/com/android/server/timezone/PackageManagerHelper.java b/services/core/java/com/android/server/timezone/PackageManagerHelper.java index 804941add891..f6e35e8fdd56 100644 --- a/services/core/java/com/android/server/timezone/PackageManagerHelper.java +++ b/services/core/java/com/android/server/timezone/PackageManagerHelper.java @@ -26,7 +26,7 @@ import android.content.pm.PackageManager; */ interface PackageManagerHelper { - int getInstalledPackageVersion(String packageName) + long getInstalledPackageVersion(String packageName) throws PackageManager.NameNotFoundException; boolean isPrivilegedApp(String packageName) throws PackageManager.NameNotFoundException; diff --git a/services/core/java/com/android/server/timezone/PackageStatusStorage.java b/services/core/java/com/android/server/timezone/PackageStatusStorage.java index cac7f7b811bf..5601c91a78e7 100644 --- a/services/core/java/com/android/server/timezone/PackageStatusStorage.java +++ b/services/core/java/com/android/server/timezone/PackageStatusStorage.java @@ -76,7 +76,7 @@ final class PackageStatusStorage { */ private static final String ATTRIBUTE_DATA_APP_VERSION = "dataAppPackageVersion"; - private static final int UNKNOWN_PACKAGE_VERSION = -1; + private static final long UNKNOWN_PACKAGE_VERSION = -1; private final AtomicFile mPackageStatusFile; @@ -320,14 +320,14 @@ final class PackageStatusStorage { serializer.attribute(namespace, ATTRIBUTE_CHECK_STATUS, statusAttributeValue); serializer.attribute(namespace, ATTRIBUTE_OPTIMISTIC_LOCK_ID, Integer.toString(optimisticLockId)); - int updateAppVersion = status == null + long updateAppVersion = status == null ? UNKNOWN_PACKAGE_VERSION : packageVersions.mUpdateAppVersion; serializer.attribute(namespace, ATTRIBUTE_UPDATE_APP_VERSION, - Integer.toString(updateAppVersion)); - int dataAppVersion = status == null + Long.toString(updateAppVersion)); + long dataAppVersion = status == null ? UNKNOWN_PACKAGE_VERSION : packageVersions.mDataAppVersion; serializer.attribute(namespace, ATTRIBUTE_DATA_APP_VERSION, - Integer.toString(dataAppVersion)); + Long.toString(dataAppVersion)); serializer.endTag(namespace, TAG_PACKAGE_STATUS); serializer.endDocument(); serializer.flush(); diff --git a/services/core/java/com/android/server/timezone/PackageTracker.java b/services/core/java/com/android/server/timezone/PackageTracker.java index f0306b9b0c38..1c54320f25b8 100644 --- a/services/core/java/com/android/server/timezone/PackageTracker.java +++ b/services/core/java/com/android/server/timezone/PackageTracker.java @@ -445,8 +445,8 @@ public class PackageTracker { } private PackageVersions lookupInstalledPackageVersions() { - int updatePackageVersion; - int dataPackageVersion; + long updatePackageVersion; + long dataPackageVersion; try { updatePackageVersion = mPackageManagerHelper.getInstalledPackageVersion(mUpdateAppPackageName); diff --git a/services/core/java/com/android/server/timezone/PackageTrackerHelperImpl.java b/services/core/java/com/android/server/timezone/PackageTrackerHelperImpl.java index b89dd3838ae9..6a330e6acf08 100644 --- a/services/core/java/com/android/server/timezone/PackageTrackerHelperImpl.java +++ b/services/core/java/com/android/server/timezone/PackageTrackerHelperImpl.java @@ -81,11 +81,11 @@ final class PackageTrackerHelperImpl implements ClockHelper, ConfigHelper, Packa } @Override - public int getInstalledPackageVersion(String packageName) + public long getInstalledPackageVersion(String packageName) throws PackageManager.NameNotFoundException { int flags = PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS; PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, flags); - return packageInfo.versionCode; + return packageInfo.getLongVersionCode(); } @Override diff --git a/services/core/java/com/android/server/timezone/PackageVersions.java b/services/core/java/com/android/server/timezone/PackageVersions.java index fc0d6e1ad51e..0084c1a2e5e5 100644 --- a/services/core/java/com/android/server/timezone/PackageVersions.java +++ b/services/core/java/com/android/server/timezone/PackageVersions.java @@ -21,10 +21,10 @@ package com.android.server.timezone; */ final class PackageVersions { - final int mUpdateAppVersion; - final int mDataAppVersion; + final long mUpdateAppVersion; + final long mDataAppVersion; - PackageVersions(int updateAppVersion, int dataAppVersion) { + PackageVersions(long updateAppVersion, long dataAppVersion) { this.mUpdateAppVersion = updateAppVersion; this.mDataAppVersion = dataAppVersion; } @@ -48,8 +48,8 @@ final class PackageVersions { @Override public int hashCode() { - int result = mUpdateAppVersion; - result = 31 * result + mDataAppVersion; + int result = Long.hashCode(mUpdateAppVersion); + result = 31 * result + Long.hashCode(mDataAppVersion); return result; } diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java index 1e334b83d8b0..4aa2b3722749 100644 --- a/services/core/java/com/android/server/webkit/SystemImpl.java +++ b/services/core/java/com/android/server/webkit/SystemImpl.java @@ -156,9 +156,10 @@ public class SystemImpl implements SystemInterface { return mWebViewProviderPackages; } - public int getFactoryPackageVersion(String packageName) throws NameNotFoundException { + public long getFactoryPackageVersion(String packageName) throws NameNotFoundException { PackageManager pm = AppGlobals.getInitialApplication().getPackageManager(); - return pm.getPackageInfo(packageName, PackageManager.MATCH_FACTORY_ONLY).versionCode; + return pm.getPackageInfo(packageName, PackageManager.MATCH_FACTORY_ONLY) + .getLongVersionCode(); } /** diff --git a/services/core/java/com/android/server/webkit/SystemInterface.java b/services/core/java/com/android/server/webkit/SystemInterface.java index d57edcd4c44c..405fe7d41e61 100644 --- a/services/core/java/com/android/server/webkit/SystemInterface.java +++ b/services/core/java/com/android/server/webkit/SystemInterface.java @@ -36,7 +36,7 @@ import java.util.List; public interface SystemInterface { public WebViewProviderInfo[] getWebViewPackages(); public int onWebViewProviderChanged(PackageInfo packageInfo); - public int getFactoryPackageVersion(String packageName) throws NameNotFoundException; + public long getFactoryPackageVersion(String packageName) throws NameNotFoundException; public String getUserChosenWebViewProvider(Context context); public void updateUserSetting(Context context, String newProviderName); diff --git a/services/core/java/com/android/server/webkit/WebViewUpdater.java b/services/core/java/com/android/server/webkit/WebViewUpdater.java index 7fc907f95c93..7e05e46a2637 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdater.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdater.java @@ -54,7 +54,7 @@ class WebViewUpdater { private Context mContext; private SystemInterface mSystemInterface; - private int mMinimumVersionCode = -1; + private long mMinimumVersionCode = -1; // Keeps track of the number of running relro creations private int mNumRelroCreationsStarted = 0; @@ -430,7 +430,7 @@ class WebViewUpdater { if (!UserPackage.hasCorrectTargetSdkVersion(packageInfo)) { return VALIDITY_INCORRECT_SDK_VERSION; } - if (!versionCodeGE(packageInfo.versionCode, getMinimumVersionCode()) + if (!versionCodeGE(packageInfo.getLongVersionCode(), getMinimumVersionCode()) && !mSystemInterface.systemIsDebuggable()) { // Webview providers may be downgraded arbitrarily low, prevent that by enforcing // minimum version code. This check is only enforced for user builds. @@ -461,9 +461,9 @@ class WebViewUpdater { * * @return true if versionCode1 is higher than or equal to versionCode2. */ - private static boolean versionCodeGE(int versionCode1, int versionCode2) { - int v1 = versionCode1 / 100000; - int v2 = versionCode2 / 100000; + private static boolean versionCodeGE(long versionCode1, long versionCode2) { + long v1 = versionCode1 / 100000; + long v2 = versionCode2 / 100000; return v1 >= v2; } @@ -478,16 +478,16 @@ class WebViewUpdater { * (mMinimumVersionCode) which is shared between threads. Furthermore, this method does not * hold mLock meaning that we must take extra care to ensure this method is thread-safe. */ - private int getMinimumVersionCode() { + private long getMinimumVersionCode() { if (mMinimumVersionCode > 0) { return mMinimumVersionCode; } - int minimumVersionCode = -1; + long minimumVersionCode = -1; for (WebViewProviderInfo provider : mSystemInterface.getWebViewPackages()) { if (provider.availableByDefault && !provider.isFallback) { try { - int versionCode = + long versionCode = mSystemInterface.getFactoryPackageVersion(provider.packageName); if (minimumVersionCode < 0 || versionCode < minimumVersionCode) { minimumVersionCode = versionCode; @@ -577,7 +577,7 @@ class WebViewUpdater { String packageDetails = String.format( "versionName: %s, versionCode: %d, targetSdkVersion: %d", systemUserPackageInfo.versionName, - systemUserPackageInfo.versionCode, + systemUserPackageInfo.getLongVersionCode(), systemUserPackageInfo.applicationInfo.targetSdkVersion); if (validity == VALIDITY_OK) { boolean installedForAllUsers = isInstalledAndEnabledForAllUsers( diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java index 87c587a241af..c40b411a21d7 100644 --- a/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java @@ -20,6 +20,7 @@ import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_CATEGORY; import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_ID; import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME; import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION; +import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION; import static com.google.common.truth.Truth.assertThat; @@ -102,11 +103,40 @@ public class BackupManagerMonitorUtilsTest { ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); verify(mMonitorMock).onEvent(bundleCaptor.capture()); Bundle eventBundle = bundleCaptor.getValue(); - assertThat(eventBundle.size()).isEqualTo(6); + assertThat(eventBundle.size()).isEqualTo(7); assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_ID)).isEqualTo(1); assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_CATEGORY)).isEqualTo(2); assertThat(eventBundle.getString(EXTRA_LOG_EVENT_PACKAGE_NAME)).isEqualTo("test.package"); assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_PACKAGE_VERSION)).isEqualTo(3); + assertThat(eventBundle.getLong(EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION)).isEqualTo(3); + assertThat(eventBundle.getInt("key1")).isEqualTo(4); + assertThat(eventBundle.getString("key2")).isEqualTo("value2"); + } + + @Test + public void monitorEvent_packageAndExtrasAreNotNull_fillsBundleCorrectlyLong() throws Exception { + PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = "test.package"; + packageInfo.versionCode = 3; + packageInfo.versionCodeMajor = 10; + Bundle extras = new Bundle(); + extras.putInt("key1", 4); + extras.putString("key2", "value2"); + + IBackupManagerMonitor result = BackupManagerMonitorUtils.monitorEvent(mMonitorMock, 1, + packageInfo, 2, extras); + + assertThat(result).isEqualTo(mMonitorMock); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mMonitorMock).onEvent(bundleCaptor.capture()); + Bundle eventBundle = bundleCaptor.getValue(); + assertThat(eventBundle.size()).isEqualTo(7); + assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_ID)).isEqualTo(1); + assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_CATEGORY)).isEqualTo(2); + assertThat(eventBundle.getString(EXTRA_LOG_EVENT_PACKAGE_NAME)).isEqualTo("test.package"); + assertThat(eventBundle.getInt(EXTRA_LOG_EVENT_PACKAGE_VERSION)).isEqualTo(3); + assertThat(eventBundle.getLong(EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION)).isEqualTo( + (10L << 32) | 3); assertThat(eventBundle.getInt("key1")).isEqualTo(4); assertThat(eventBundle.getString("key2")).isEqualTo("value2"); } diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 025ebc36f99b..926a9112ad29 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -1075,6 +1075,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { final PackageInfo ret = new PackageInfo(); ret.packageName = pi.packageName; ret.versionCode = pi.versionCode; + ret.versionCodeMajor = pi.versionCodeMajor; ret.lastUpdateTime = pi.lastUpdateTime; ret.applicationInfo = new ApplicationInfo(pi.applicationInfo); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java index fd105bc8ef1c..0995f2e35d50 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -577,7 +577,7 @@ public class PackageManagerSettingsTests { new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); pkg.usesStaticLibraries = new ArrayList<>( Arrays.asList("foo.bar1", "foo.bar2", "foo.bar3")); - pkg.usesStaticLibrariesVersions = new int[] {2, 4, 6}; + pkg.usesStaticLibrariesVersions = new long[] {2, 4, 6}; settings.insertPackageSettingLPw(ps, pkg); assertEquals(pkg, ps.pkg); assertArrayEquals(pkg.usesStaticLibraries.toArray(new String[0]), ps.usesStaticLibraries); @@ -602,6 +602,11 @@ public class PackageManagerSettingsTests { Arrays.equals(a, b)); } + private void assertArrayEquals(long[] a, long[] b) { + assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), + Arrays.equals(a, b)); + } + private void verifyUserState(PackageUserState userState, PackageUserState oldUserState, boolean userStateChanged) { verifyUserState(userState, oldUserState, userStateChanged, false /*notLaunched*/, diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 1f9a243d0f22..36cc3a059eac 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -471,7 +471,7 @@ public class PackageParserTest { pkg.usesStaticLibraries.add("foo23"); pkg.usesStaticLibrariesCertDigests = new String[1][]; pkg.usesStaticLibrariesCertDigests[0] = new String[] { "digest" }; - pkg.usesStaticLibrariesVersions = new int[] { 100 }; + pkg.usesStaticLibrariesVersions = new long[] { 100 }; pkg.libraryNames = new ArrayList<>(); pkg.libraryNames.add("foo10"); diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java index 7d73e82eaf76..0ea8d4f5e353 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java @@ -1246,13 +1246,13 @@ public class PackageTrackerTest { } private void configureUpdateAppPackageVersion(String updateAppPackageName, - int updataAppPackageVersion) throws Exception { + long updataAppPackageVersion) throws Exception { when(mMockPackageManagerHelper.getInstalledPackageVersion(updateAppPackageName)) .thenReturn(updataAppPackageVersion); } private void configureDataAppPackageVersion(String dataAppPackageName, - int dataAppPackageVersion) throws Exception { + long dataAppPackageVersion) throws Exception { when(mMockPackageManagerHelper.getInstalledPackageVersion(dataAppPackageName)) .thenReturn(dataAppPackageVersion); } diff --git a/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java b/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java index cd3ae1ae8b03..26853a9a7fa5 100644 --- a/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java +++ b/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java @@ -165,7 +165,7 @@ public class TestSystemImpl implements SystemInterface { } @Override - public int getFactoryPackageVersion(String packageName) throws NameNotFoundException { + public long getFactoryPackageVersion(String packageName) throws NameNotFoundException { PackageInfo pi = null; Map<Integer, PackageInfo> userPackages = mPackages.get(packageName); if (userPackages == null) throw new NameNotFoundException(); diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java index 2224de56f21c..401f585886a2 100644 --- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java @@ -1512,8 +1512,8 @@ public class WebViewUpdateServiceTest { // Ensure the API is correct before running waitForAndGetProvider assertEquals(firstPackage.packageName, mWebViewUpdateServiceImpl.getCurrentWebViewPackage().packageName); - assertEquals(firstPackage.versionCode, - mWebViewUpdateServiceImpl.getCurrentWebViewPackage().versionCode); + assertEquals(firstPackage.getLongVersionCode(), + mWebViewUpdateServiceImpl.getCurrentWebViewPackage().getLongVersionCode()); assertEquals(firstPackage.versionName, mWebViewUpdateServiceImpl.getCurrentWebViewPackage().versionName); @@ -1524,8 +1524,8 @@ public class WebViewUpdateServiceTest { // Ensure the API is still correct after running waitForAndGetProvider assertEquals(firstPackage.packageName, mWebViewUpdateServiceImpl.getCurrentWebViewPackage().packageName); - assertEquals(firstPackage.versionCode, - mWebViewUpdateServiceImpl.getCurrentWebViewPackage().versionCode); + assertEquals(firstPackage.getLongVersionCode(), + mWebViewUpdateServiceImpl.getCurrentWebViewPackage().getLongVersionCode()); assertEquals(firstPackage.versionName, mWebViewUpdateServiceImpl.getCurrentWebViewPackage().versionName); } |