From c53878f38d8323bcf12c18da62929284d69b611c Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Sat, 25 May 2019 01:31:32 +0900 Subject: [PATCH] ApexManager does nothing when ro.apex.updatable is false When ro.apex.updatable isn't set, apexd service does not run. Therefore ApexManager should not try to talk to the native service in that case. Bug: 132413565 Bug: 131697251 Test: marlin is bootable Change-Id: I4285df01a75d57e89e03f98aafde3860de86e9a0 --- .../com/android/server/pm/ApexManager.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 6971ba3ad0bf4..df189235704a8 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -83,13 +83,17 @@ class ApexManager { ApexManager(Context context) { + mContext = context; + if (!isApexSupported()) { + mApexService = null; + return; + } try { mApexService = IApexService.Stub.asInterface( ServiceManager.getServiceOrThrow("apexservice")); } catch (ServiceNotFoundException e) { throw new IllegalStateException("Required service apexservice not available"); } - mContext = context; } static final int MATCH_ACTIVE_PACKAGE = 1 << 0; @@ -102,6 +106,7 @@ class ApexManager { @interface PackageInfoFlags{} void systemReady() { + if (!isApexSupported()) return; mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -175,6 +180,7 @@ class ApexManager { * is not found. */ @Nullable PackageInfo getPackageInfo(String packageName, @PackageInfoFlags int flags) { + if (!isApexSupported()) return null; populateAllPackagesCacheIfNeeded(); boolean matchActive = (flags & MATCH_ACTIVE_PACKAGE) != 0; boolean matchFactory = (flags & MATCH_FACTORY_PACKAGE) != 0; @@ -198,6 +204,7 @@ class ApexManager { // TODO(b/132324953): delete. @Deprecated @Nullable PackageInfo getPackageInfoForApexName(String apexName) { + if (!isApexSupported()) return null; populateAllPackagesCacheIfNeeded(); return mApexNameToPackageInfoCache.get(apexName); } @@ -209,6 +216,7 @@ class ApexManager { * active package. */ List getActivePackages() { + if (!isApexSupported()) return Collections.emptyList(); populateAllPackagesCacheIfNeeded(); return mAllPackagesCache .stream() @@ -223,6 +231,7 @@ class ApexManager { * active pre-installed package. */ List getFactoryPackages() { + if (!isApexSupported()) return Collections.emptyList(); populateAllPackagesCacheIfNeeded(); return mAllPackagesCache .stream() @@ -237,6 +246,7 @@ class ApexManager { * inactive package. */ List getInactivePackages() { + if (!isApexSupported()) return Collections.emptyList(); populateAllPackagesCacheIfNeeded(); return mAllPackagesCache .stream() @@ -251,6 +261,7 @@ class ApexManager { * @return {@code true} if {@code packageName} is an apex package. */ boolean isApexPackage(String packageName) { + if (!isApexSupported()) return false; populateAllPackagesCacheIfNeeded(); for (PackageInfo packageInfo : mAllPackagesCache) { if (packageInfo.packageName.equals(packageName)) { @@ -268,6 +279,7 @@ class ApexManager { * @return an ApexSessionInfo object, or null if the session is not known. */ @Nullable ApexSessionInfo getStagedSessionInfo(int sessionId) { + if (!isApexSupported()) return null; try { ApexSessionInfo apexSessionInfo = mApexService.getStagedSessionInfo(sessionId); if (apexSessionInfo.isUnknown) { @@ -298,6 +310,7 @@ class ApexManager { */ boolean submitStagedSession( int sessionId, @NonNull int[] childSessionIds, @NonNull ApexInfoList apexInfoList) { + if (!isApexSupported()) return false; try { return mApexService.submitStagedSession(sessionId, childSessionIds, apexInfoList); } catch (RemoteException re) { @@ -314,6 +327,7 @@ class ApexManager { * @return true upon success, false if the session is unknown. */ boolean markStagedSessionReady(int sessionId) { + if (!isApexSupported()) return false; try { return mApexService.markStagedSessionReady(sessionId); } catch (RemoteException re) { @@ -331,6 +345,7 @@ class ApexManager { * successful. */ void markStagedSessionSuccessful(int sessionId) { + if (!isApexSupported()) return; try { mApexService.markStagedSessionSuccessful(sessionId); } catch (RemoteException re) { @@ -358,6 +373,7 @@ class ApexManager { * @return {@code true} upon success, {@code false} if any remote exception occurs */ boolean abortActiveSession() { + if (!isApexSupported()) return false; try { mApexService.abortActiveSession(); return true; @@ -376,6 +392,7 @@ class ApexManager { * @return {@code true} upon successful uninstall, {@code false} otherwise. */ boolean uninstallApex(String apexPackagePath) { + if (!isApexSupported()) return false; try { mApexService.unstagePackages(Collections.singletonList(apexPackagePath)); return true; @@ -441,6 +458,7 @@ class ApexManager { * information about that specific package will be dumped. */ void dump(PrintWriter pw, @Nullable String packageName) { + if (!isApexSupported()) return; final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120); try { populateAllPackagesCacheIfNeeded(); @@ -486,6 +504,7 @@ class ApexManager { } public void onBootCompleted() { + if (!isApexSupported()) return; populateAllPackagesCacheIfNeeded(); } -} \ No newline at end of file +}