• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.pm;
18 
19 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
21 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
22 
23 import android.content.pm.IntentFilterVerificationInfo;
24 import android.content.pm.PackageManager;
25 import android.content.pm.PackageUserState;
26 import android.os.storage.VolumeInfo;
27 import android.util.ArraySet;
28 import android.util.SparseArray;
29 
30 import java.io.File;
31 
32 /**
33  * Settings base class for pending and resolved classes.
34  */
35 abstract class PackageSettingBase extends SettingBase {
36     /**
37      * Indicates the state of installation. Used by PackageManager to figure out
38      * incomplete installations. Say a package is being installed (the state is
39      * set to PKG_INSTALL_INCOMPLETE) and remains so till the package
40      * installation is successful or unsuccessful in which case the
41      * PackageManager will no longer maintain state information associated with
42      * the package. If some exception(like device freeze or battery being pulled
43      * out) occurs during installation of a package, the PackageManager needs
44      * this information to clean up the previously failed installation.
45      */
46     static final int PKG_INSTALL_COMPLETE = 1;
47     static final int PKG_INSTALL_INCOMPLETE = 0;
48 
49     final String name;
50     final String realName;
51 
52     /**
53      * Path where this package was found on disk. For monolithic packages
54      * this is path to single base APK file; for cluster packages this is
55      * path to the cluster directory.
56      */
57     File codePath;
58     String codePathString;
59     File resourcePath;
60     String resourcePathString;
61 
62     /**
63      * The path under which native libraries have been unpacked. This path is
64      * always derived at runtime, and is only stored here for cleanup when a
65      * package is uninstalled.
66      */
67     @Deprecated
68     String legacyNativeLibraryPathString;
69 
70     /**
71      * The primary CPU abi for this package. This value is regenerated at every
72      * boot scan.
73      */
74     String primaryCpuAbiString;
75 
76     /**
77      * The secondary CPU abi for this package. This value is regenerated at every
78      * boot scan.
79      */
80     String secondaryCpuAbiString;
81 
82     /**
83      * The install time CPU override, if any. This value is written at install time
84      * and doesn't change during the life of an install. If non-null,
85      * {@code primaryCpuAbiString} will contain the same value.
86      */
87     String cpuAbiOverrideString;
88 
89     long timeStamp;
90     long firstInstallTime;
91     long lastUpdateTime;
92     int versionCode;
93 
94     boolean uidError;
95 
96     PackageSignatures signatures = new PackageSignatures();
97 
98     boolean installPermissionsFixed;
99 
100     PackageKeySetData keySetData = new PackageKeySetData();
101 
102     private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
103 
104     // Whether this package is currently stopped, thus can not be
105     // started until explicitly launched by the user.
106     private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
107 
108     int installStatus = PKG_INSTALL_COMPLETE;
109 
110     /**
111      * Non-persisted value indicating this package has been temporarily frozen,
112      * usually during a critical section of the package update pipeline. The
113      * platform will refuse to launch packages in a frozen state.
114      */
115     boolean frozen = false;
116 
117     PackageSettingBase origPackage;
118 
119     /** Package name of the app that installed this package */
120     String installerPackageName;
121     /** UUID of {@link VolumeInfo} hosting this app */
122     String volumeUuid;
123 
124     IntentFilterVerificationInfo verificationInfo;
125 
PackageSettingBase(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, int pVersionCode, int pkgFlags, int pkgPrivateFlags)126     PackageSettingBase(String name, String realName, File codePath, File resourcePath,
127             String legacyNativeLibraryPathString, String primaryCpuAbiString,
128             String secondaryCpuAbiString, String cpuAbiOverrideString,
129             int pVersionCode, int pkgFlags, int pkgPrivateFlags) {
130         super(pkgFlags, pkgPrivateFlags);
131         this.name = name;
132         this.realName = realName;
133         init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString,
134                 secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode);
135     }
136 
137     /**
138      * New instance of PackageSetting with one-level-deep cloning.
139      */
140     @SuppressWarnings("unchecked")
PackageSettingBase(PackageSettingBase base)141     PackageSettingBase(PackageSettingBase base) {
142         super(base);
143 
144         name = base.name;
145         realName = base.realName;
146         codePath = base.codePath;
147         codePathString = base.codePathString;
148         resourcePath = base.resourcePath;
149         resourcePathString = base.resourcePathString;
150         legacyNativeLibraryPathString = base.legacyNativeLibraryPathString;
151         primaryCpuAbiString = base.primaryCpuAbiString;
152         secondaryCpuAbiString = base.secondaryCpuAbiString;
153         cpuAbiOverrideString = base.cpuAbiOverrideString;
154         timeStamp = base.timeStamp;
155         firstInstallTime = base.firstInstallTime;
156         lastUpdateTime = base.lastUpdateTime;
157         versionCode = base.versionCode;
158 
159         uidError = base.uidError;
160 
161         signatures = new PackageSignatures(base.signatures);
162 
163         installPermissionsFixed = base.installPermissionsFixed;
164         userState.clear();
165         for (int i=0; i<base.userState.size(); i++) {
166             userState.put(base.userState.keyAt(i),
167                     new PackageUserState(base.userState.valueAt(i)));
168         }
169         installStatus = base.installStatus;
170 
171         origPackage = base.origPackage;
172 
173         installerPackageName = base.installerPackageName;
174         volumeUuid = base.volumeUuid;
175 
176         keySetData = new PackageKeySetData(base.keySetData);
177     }
178 
init(File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, int pVersionCode)179     void init(File codePath, File resourcePath, String legacyNativeLibraryPathString,
180               String primaryCpuAbiString, String secondaryCpuAbiString,
181               String cpuAbiOverrideString, int pVersionCode) {
182         this.codePath = codePath;
183         this.codePathString = codePath.toString();
184         this.resourcePath = resourcePath;
185         this.resourcePathString = resourcePath.toString();
186         this.legacyNativeLibraryPathString = legacyNativeLibraryPathString;
187         this.primaryCpuAbiString = primaryCpuAbiString;
188         this.secondaryCpuAbiString = secondaryCpuAbiString;
189         this.cpuAbiOverrideString = cpuAbiOverrideString;
190         this.versionCode = pVersionCode;
191     }
192 
setInstallerPackageName(String packageName)193     public void setInstallerPackageName(String packageName) {
194         installerPackageName = packageName;
195     }
196 
getInstallerPackageName()197     public String getInstallerPackageName() {
198         return installerPackageName;
199     }
200 
setVolumeUuid(String volumeUuid)201     public void setVolumeUuid(String volumeUuid) {
202         this.volumeUuid = volumeUuid;
203     }
204 
getVolumeUuid()205     public String getVolumeUuid() {
206         return volumeUuid;
207     }
208 
setInstallStatus(int newStatus)209     public void setInstallStatus(int newStatus) {
210         installStatus = newStatus;
211     }
212 
getInstallStatus()213     public int getInstallStatus() {
214         return installStatus;
215     }
216 
setTimeStamp(long newStamp)217     public void setTimeStamp(long newStamp) {
218         timeStamp = newStamp;
219     }
220 
221     /**
222      * Make a shallow copy of this package settings.
223      */
copyFrom(PackageSettingBase base)224     public void copyFrom(PackageSettingBase base) {
225         mPermissionsState.copyFrom(base.mPermissionsState);
226         primaryCpuAbiString = base.primaryCpuAbiString;
227         secondaryCpuAbiString = base.secondaryCpuAbiString;
228         cpuAbiOverrideString = base.cpuAbiOverrideString;
229         timeStamp = base.timeStamp;
230         firstInstallTime = base.firstInstallTime;
231         lastUpdateTime = base.lastUpdateTime;
232         signatures = base.signatures;
233         installPermissionsFixed = base.installPermissionsFixed;
234         userState.clear();
235         for (int i=0; i<base.userState.size(); i++) {
236             userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
237         }
238         installStatus = base.installStatus;
239         keySetData = base.keySetData;
240         verificationInfo = base.verificationInfo;
241         installerPackageName = base.installerPackageName;
242         volumeUuid = base.volumeUuid;
243     }
244 
modifyUserState(int userId)245     private PackageUserState modifyUserState(int userId) {
246         PackageUserState state = userState.get(userId);
247         if (state == null) {
248             state = new PackageUserState();
249             userState.put(userId, state);
250         }
251         return state;
252     }
253 
readUserState(int userId)254     public PackageUserState readUserState(int userId) {
255         PackageUserState state = userState.get(userId);
256         if (state != null) {
257             return state;
258         }
259         return DEFAULT_USER_STATE;
260     }
261 
setEnabled(int state, int userId, String callingPackage)262     void setEnabled(int state, int userId, String callingPackage) {
263         PackageUserState st = modifyUserState(userId);
264         st.enabled = state;
265         st.lastDisableAppCaller = callingPackage;
266     }
267 
getEnabled(int userId)268     int getEnabled(int userId) {
269         return readUserState(userId).enabled;
270     }
271 
getLastDisabledAppCaller(int userId)272     String getLastDisabledAppCaller(int userId) {
273         return readUserState(userId).lastDisableAppCaller;
274     }
275 
setInstalled(boolean inst, int userId)276     void setInstalled(boolean inst, int userId) {
277         modifyUserState(userId).installed = inst;
278     }
279 
getInstalled(int userId)280     boolean getInstalled(int userId) {
281         return readUserState(userId).installed;
282     }
283 
isAnyInstalled(int[] users)284     boolean isAnyInstalled(int[] users) {
285         for (int user: users) {
286             if (readUserState(user).installed) {
287                 return true;
288             }
289         }
290         return false;
291     }
292 
queryInstalledUsers(int[] users, boolean installed)293     int[] queryInstalledUsers(int[] users, boolean installed) {
294         int num = 0;
295         for (int user : users) {
296             if (getInstalled(user) == installed) {
297                 num++;
298             }
299         }
300         int[] res = new int[num];
301         num = 0;
302         for (int user : users) {
303             if (getInstalled(user) == installed) {
304                 res[num] = user;
305                 num++;
306             }
307         }
308         return res;
309     }
310 
getStopped(int userId)311     boolean getStopped(int userId) {
312         return readUserState(userId).stopped;
313     }
314 
setStopped(boolean stop, int userId)315     void setStopped(boolean stop, int userId) {
316         modifyUserState(userId).stopped = stop;
317     }
318 
getNotLaunched(int userId)319     boolean getNotLaunched(int userId) {
320         return readUserState(userId).notLaunched;
321     }
322 
setNotLaunched(boolean stop, int userId)323     void setNotLaunched(boolean stop, int userId) {
324         modifyUserState(userId).notLaunched = stop;
325     }
326 
getHidden(int userId)327     boolean getHidden(int userId) {
328         return readUserState(userId).hidden;
329     }
330 
setHidden(boolean hidden, int userId)331     void setHidden(boolean hidden, int userId) {
332         modifyUserState(userId).hidden = hidden;
333     }
334 
getBlockUninstall(int userId)335     boolean getBlockUninstall(int userId) {
336         return readUserState(userId).blockUninstall;
337     }
338 
setBlockUninstall(boolean blockUninstall, int userId)339     void setBlockUninstall(boolean blockUninstall, int userId) {
340         modifyUserState(userId).blockUninstall = blockUninstall;
341     }
342 
setUserState(int userId, int enabled, boolean installed, boolean stopped, boolean notLaunched, boolean hidden, String lastDisableAppCaller, ArraySet<String> enabledComponents, ArraySet<String> disabledComponents, boolean blockUninstall, int domainVerifState, int linkGeneration)343     void setUserState(int userId, int enabled, boolean installed, boolean stopped,
344             boolean notLaunched, boolean hidden,
345             String lastDisableAppCaller, ArraySet<String> enabledComponents,
346             ArraySet<String> disabledComponents, boolean blockUninstall, int domainVerifState,
347             int linkGeneration) {
348         PackageUserState state = modifyUserState(userId);
349         state.enabled = enabled;
350         state.installed = installed;
351         state.stopped = stopped;
352         state.notLaunched = notLaunched;
353         state.hidden = hidden;
354         state.lastDisableAppCaller = lastDisableAppCaller;
355         state.enabledComponents = enabledComponents;
356         state.disabledComponents = disabledComponents;
357         state.blockUninstall = blockUninstall;
358         state.domainVerificationStatus = domainVerifState;
359         state.appLinkGeneration = linkGeneration;
360     }
361 
getEnabledComponents(int userId)362     ArraySet<String> getEnabledComponents(int userId) {
363         return readUserState(userId).enabledComponents;
364     }
365 
getDisabledComponents(int userId)366     ArraySet<String> getDisabledComponents(int userId) {
367         return readUserState(userId).disabledComponents;
368     }
369 
setEnabledComponents(ArraySet<String> components, int userId)370     void setEnabledComponents(ArraySet<String> components, int userId) {
371         modifyUserState(userId).enabledComponents = components;
372     }
373 
setDisabledComponents(ArraySet<String> components, int userId)374     void setDisabledComponents(ArraySet<String> components, int userId) {
375         modifyUserState(userId).disabledComponents = components;
376     }
377 
setEnabledComponentsCopy(ArraySet<String> components, int userId)378     void setEnabledComponentsCopy(ArraySet<String> components, int userId) {
379         modifyUserState(userId).enabledComponents = components != null
380                 ? new ArraySet<String>(components) : null;
381     }
382 
setDisabledComponentsCopy(ArraySet<String> components, int userId)383     void setDisabledComponentsCopy(ArraySet<String> components, int userId) {
384         modifyUserState(userId).disabledComponents = components != null
385                 ? new ArraySet<String>(components) : null;
386     }
387 
modifyUserStateComponents(int userId, boolean disabled, boolean enabled)388     PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
389         PackageUserState state = modifyUserState(userId);
390         if (disabled && state.disabledComponents == null) {
391             state.disabledComponents = new ArraySet<String>(1);
392         }
393         if (enabled && state.enabledComponents == null) {
394             state.enabledComponents = new ArraySet<String>(1);
395         }
396         return state;
397     }
398 
addDisabledComponent(String componentClassName, int userId)399     void addDisabledComponent(String componentClassName, int userId) {
400         modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
401     }
402 
addEnabledComponent(String componentClassName, int userId)403     void addEnabledComponent(String componentClassName, int userId) {
404         modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
405     }
406 
enableComponentLPw(String componentClassName, int userId)407     boolean enableComponentLPw(String componentClassName, int userId) {
408         PackageUserState state = modifyUserStateComponents(userId, false, true);
409         boolean changed = state.disabledComponents != null
410                 ? state.disabledComponents.remove(componentClassName) : false;
411         changed |= state.enabledComponents.add(componentClassName);
412         return changed;
413     }
414 
disableComponentLPw(String componentClassName, int userId)415     boolean disableComponentLPw(String componentClassName, int userId) {
416         PackageUserState state = modifyUserStateComponents(userId, true, false);
417         boolean changed = state.enabledComponents != null
418                 ? state.enabledComponents.remove(componentClassName) : false;
419         changed |= state.disabledComponents.add(componentClassName);
420         return changed;
421     }
422 
restoreComponentLPw(String componentClassName, int userId)423     boolean restoreComponentLPw(String componentClassName, int userId) {
424         PackageUserState state = modifyUserStateComponents(userId, true, true);
425         boolean changed = state.disabledComponents != null
426                 ? state.disabledComponents.remove(componentClassName) : false;
427         changed |= state.enabledComponents != null
428                 ? state.enabledComponents.remove(componentClassName) : false;
429         return changed;
430     }
431 
getCurrentEnabledStateLPr(String componentName, int userId)432     int getCurrentEnabledStateLPr(String componentName, int userId) {
433         PackageUserState state = readUserState(userId);
434         if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
435             return COMPONENT_ENABLED_STATE_ENABLED;
436         } else if (state.disabledComponents != null
437                 && state.disabledComponents.contains(componentName)) {
438             return COMPONENT_ENABLED_STATE_DISABLED;
439         } else {
440             return COMPONENT_ENABLED_STATE_DEFAULT;
441         }
442     }
443 
removeUser(int userId)444     void removeUser(int userId) {
445         userState.delete(userId);
446     }
447 
getIntentFilterVerificationInfo()448     IntentFilterVerificationInfo getIntentFilterVerificationInfo() {
449         return verificationInfo;
450     }
451 
setIntentFilterVerificationInfo(IntentFilterVerificationInfo info)452     void setIntentFilterVerificationInfo(IntentFilterVerificationInfo info) {
453         verificationInfo = info;
454     }
455 
456     // Returns a packed value as a long:
457     //
458     // high 'int'-sized word: link status: undefined/ask/never/always.
459     // low 'int'-sized word: relative priority among 'always' results.
getDomainVerificationStatusForUser(int userId)460     long getDomainVerificationStatusForUser(int userId) {
461         PackageUserState state = readUserState(userId);
462         long result = (long) state.appLinkGeneration;
463         result |= ((long) state.domainVerificationStatus) << 32;
464         return result;
465     }
466 
setDomainVerificationStatusForUser(final int status, int generation, int userId)467     void setDomainVerificationStatusForUser(final int status, int generation, int userId) {
468         PackageUserState state = modifyUserState(userId);
469         state.domainVerificationStatus = status;
470         if (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
471             state.appLinkGeneration = generation;
472         }
473     }
474 
clearDomainVerificationStatusForUser(int userId)475     void clearDomainVerificationStatusForUser(int userId) {
476         modifyUserState(userId).domainVerificationStatus =
477                 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
478     }
479 }
480