blob: 9e8b3df70486b7363239869f0ad3ee0b5e246621 [file] [log] [blame]
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001/*
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
17package com.android.server.pm;
18
19import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
21import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
22
Dianne Hackborn7767eac2012-08-23 18:25:40 -070023import android.content.pm.PackageUserState;
Jeff Sharkey9f837a92014-10-24 12:07:24 -070024import android.util.ArraySet;
Amith Yamasani483f3b02012-03-13 16:08:00 -070025import android.util.SparseArray;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070026
27import java.io.File;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070028
29/**
30 * Settings base class for pending and resolved classes.
31 */
Svetoslavc6d1c342015-02-26 14:44:43 -080032abstract class PackageSettingBase extends SettingBase {
Kenny Rootcf0b38c2011-03-22 14:17:59 -070033 /**
34 * Indicates the state of installation. Used by PackageManager to figure out
35 * incomplete installations. Say a package is being installed (the state is
36 * set to PKG_INSTALL_INCOMPLETE) and remains so till the package
37 * installation is successful or unsuccessful in which case the
38 * PackageManager will no longer maintain state information associated with
39 * the package. If some exception(like device freeze or battery being pulled
40 * out) occurs during installation of a package, the PackageManager needs
41 * this information to clean up the previously failed installation.
42 */
43 static final int PKG_INSTALL_COMPLETE = 1;
44 static final int PKG_INSTALL_INCOMPLETE = 0;
45
46 final String name;
47 final String realName;
Jeff Sharkey57dcf5b2014-06-18 17:46:05 -070048
49 /**
50 * Path where this package was found on disk. For monolithic packages
51 * this is path to single base APK file; for cluster packages this is
52 * path to the cluster directory.
53 */
Kenny Rootcf0b38c2011-03-22 14:17:59 -070054 File codePath;
55 String codePathString;
56 File resourcePath;
57 String resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +010058
59 /**
Jeff Sharkey84f12942014-07-10 17:48:11 -070060 * The path under which native libraries have been unpacked. This path is
61 * always derived at runtime, and is only stored here for cleanup when a
62 * package is uninstalled.
Narayan Kamathff110bd2014-07-04 18:30:45 +010063 */
Jeff Sharkey84f12942014-07-10 17:48:11 -070064 @Deprecated
Narayan Kamathff110bd2014-07-04 18:30:45 +010065 String legacyNativeLibraryPathString;
66
Narayan Kamath4903f642014-08-11 13:33:45 +010067 /**
68 * The primary CPU abi for this package. This value is regenerated at every
69 * boot scan.
70 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010071 String primaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010072
73 /**
74 * The secondary CPU abi for this package. This value is regenerated at every
75 * boot scan.
76 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010077 String secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010078
79 /**
80 * The install time CPU override, if any. This value is written at install time
81 * and doesn't change during the life of an install. If non-null,
82 * {@code primaryCpuAbiString} will contain the same value.
83 */
84 String cpuAbiOverrideString;
85
Kenny Rootcf0b38c2011-03-22 14:17:59 -070086 long timeStamp;
87 long firstInstallTime;
88 long lastUpdateTime;
89 int versionCode;
90
91 boolean uidError;
92
93 PackageSignatures signatures = new PackageSignatures();
94
95 boolean permissionsFixed;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070096
Geremy Condraf1bcca82013-01-07 22:35:24 -080097 PackageKeySetData keySetData = new PackageKeySetData();
98
Dianne Hackborn4a9f0712012-10-02 15:29:06 -070099 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700100
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700101 // Whether this package is currently stopped, thus can not be
102 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700103 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -0700104
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700105 int installStatus = PKG_INSTALL_COMPLETE;
106
107 PackageSettingBase origPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700108
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700109 /* package name of the app that installed this package */
110 String installerPackageName;
111 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100112 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100113 String secondaryCpuAbiString, String cpuAbiOverrideString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800114 int pVersionCode, int pkgFlags, int pkgPrivateFlags) {
115 super(pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700116 this.name = name;
117 this.realName = realName;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100118 init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100119 secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700120 }
121
122 /**
123 * New instance of PackageSetting with one-level-deep cloning.
124 */
125 @SuppressWarnings("unchecked")
126 PackageSettingBase(PackageSettingBase base) {
127 super(base);
128
129 name = base.name;
130 realName = base.realName;
131 codePath = base.codePath;
132 codePathString = base.codePathString;
133 resourcePath = base.resourcePath;
134 resourcePathString = base.resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100135 legacyNativeLibraryPathString = base.legacyNativeLibraryPathString;
136 primaryCpuAbiString = base.primaryCpuAbiString;
137 secondaryCpuAbiString = base.secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100138 cpuAbiOverrideString = base.cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700139 timeStamp = base.timeStamp;
140 firstInstallTime = base.firstInstallTime;
141 lastUpdateTime = base.lastUpdateTime;
142 versionCode = base.versionCode;
143
144 uidError = base.uidError;
145
146 signatures = new PackageSignatures(base.signatures);
147
148 permissionsFixed = base.permissionsFixed;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700149 userState.clear();
150 for (int i=0; i<base.userState.size(); i++) {
151 userState.put(base.userState.keyAt(i),
152 new PackageUserState(base.userState.valueAt(i)));
153 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700154 installStatus = base.installStatus;
155
156 origPackage = base.origPackage;
157
158 installerPackageName = base.installerPackageName;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800159
160 keySetData = new PackageKeySetData(base.keySetData);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700161 }
162
Narayan Kamathff110bd2014-07-04 18:30:45 +0100163 void init(File codePath, File resourcePath, String legacyNativeLibraryPathString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100164 String primaryCpuAbiString, String secondaryCpuAbiString,
165 String cpuAbiOverrideString, int pVersionCode) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700166 this.codePath = codePath;
167 this.codePathString = codePath.toString();
168 this.resourcePath = resourcePath;
169 this.resourcePathString = resourcePath.toString();
Narayan Kamathff110bd2014-07-04 18:30:45 +0100170 this.legacyNativeLibraryPathString = legacyNativeLibraryPathString;
171 this.primaryCpuAbiString = primaryCpuAbiString;
172 this.secondaryCpuAbiString = secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100173 this.cpuAbiOverrideString = cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700174 this.versionCode = pVersionCode;
175 }
176
177 public void setInstallerPackageName(String packageName) {
178 installerPackageName = packageName;
179 }
180
181 String getInstallerPackageName() {
182 return installerPackageName;
183 }
184
185 public void setInstallStatus(int newStatus) {
186 installStatus = newStatus;
187 }
188
189 public int getInstallStatus() {
190 return installStatus;
191 }
192
193 public void setTimeStamp(long newStamp) {
194 timeStamp = newStamp;
195 }
196
197 /**
198 * Make a shallow copy of this package settings.
199 */
200 public void copyFrom(PackageSettingBase base) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800201 getPermissionsState().copyFrom(base.getPermissionsState());
Narayan Kamathff110bd2014-07-04 18:30:45 +0100202 primaryCpuAbiString = base.primaryCpuAbiString;
203 secondaryCpuAbiString = base.secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100204 cpuAbiOverrideString = base.cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700205 timeStamp = base.timeStamp;
206 firstInstallTime = base.firstInstallTime;
207 lastUpdateTime = base.lastUpdateTime;
208 signatures = base.signatures;
209 permissionsFixed = base.permissionsFixed;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700210 userState.clear();
211 for (int i=0; i<base.userState.size(); i++) {
212 userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
213 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700214 installStatus = base.installStatus;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800215 keySetData = base.keySetData;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700216 }
217
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700218 private PackageUserState modifyUserState(int userId) {
219 PackageUserState state = userState.get(userId);
220 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700221 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700222 userState.put(userId, state);
223 }
224 return state;
225 }
226
227 public PackageUserState readUserState(int userId) {
228 PackageUserState state = userState.get(userId);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700229 if (state != null) {
230 return state;
231 }
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700232 return DEFAULT_USER_STATE;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700233 }
234
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700235 void setEnabled(int state, int userId, String callingPackage) {
236 PackageUserState st = modifyUserState(userId);
237 st.enabled = state;
238 st.lastDisableAppCaller = callingPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700239 }
240
241 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700242 return readUserState(userId).enabled;
243 }
244
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700245 String getLastDisabledAppCaller(int userId) {
246 return readUserState(userId).lastDisableAppCaller;
247 }
248
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700249 void setInstalled(boolean inst, int userId) {
250 modifyUserState(userId).installed = inst;
251 }
252
253 boolean getInstalled(int userId) {
254 return readUserState(userId).installed;
255 }
256
257 boolean isAnyInstalled(int[] users) {
258 for (int user: users) {
259 if (readUserState(user).installed) {
260 return true;
261 }
262 }
263 return false;
264 }
265
Dianne Hackborn786b4402012-08-27 15:14:02 -0700266 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700267 int num = 0;
268 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700269 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700270 num++;
271 }
272 }
273 int[] res = new int[num];
274 num = 0;
275 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700276 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700277 res[num] = user;
278 num++;
279 }
280 }
281 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700282 }
283
284 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700285 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700286 }
287
288 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700289 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700290 }
291
292 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700293 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700294 }
295
296 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700297 modifyUserState(userId).notLaunched = stop;
298 }
299
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700300 boolean getHidden(int userId) {
301 return readUserState(userId).hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700302 }
303
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700304 void setHidden(boolean hidden, int userId) {
305 modifyUserState(userId).hidden = hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700306 }
307
Kenny Guyc13053b2014-05-29 14:17:17 +0100308 boolean getBlockUninstall(int userId) {
309 return readUserState(userId).blockUninstall;
310 }
311
312 void setBlockUninstall(boolean blockUninstall, int userId) {
313 modifyUserState(userId).blockUninstall = blockUninstall;
314 }
315
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700316 void setUserState(int userId, int enabled, boolean installed, boolean stopped,
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700317 boolean notLaunched, boolean hidden,
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700318 String lastDisableAppCaller, ArraySet<String> enabledComponents,
319 ArraySet<String> disabledComponents, boolean blockUninstall) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700320 PackageUserState state = modifyUserState(userId);
321 state.enabled = enabled;
322 state.installed = installed;
323 state.stopped = stopped;
324 state.notLaunched = notLaunched;
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700325 state.hidden = hidden;
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700326 state.lastDisableAppCaller = lastDisableAppCaller;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700327 state.enabledComponents = enabledComponents;
328 state.disabledComponents = disabledComponents;
Kenny Guyc13053b2014-05-29 14:17:17 +0100329 state.blockUninstall = blockUninstall;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700330 }
331
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700332 ArraySet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700333 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700334 }
335
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700336 ArraySet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700337 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700338 }
339
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700340 void setEnabledComponents(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700341 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700342 }
343
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700344 void setDisabledComponents(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700345 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700346 }
347
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700348 void setEnabledComponentsCopy(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700349 modifyUserState(userId).enabledComponents = components != null
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700350 ? new ArraySet<String>(components) : null;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700351 }
352
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700353 void setDisabledComponentsCopy(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700354 modifyUserState(userId).disabledComponents = components != null
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700355 ? new ArraySet<String>(components) : null;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700356 }
357
358 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
359 PackageUserState state = modifyUserState(userId);
360 if (disabled && state.disabledComponents == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700361 state.disabledComponents = new ArraySet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700362 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700363 if (enabled && state.enabledComponents == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700364 state.enabledComponents = new ArraySet<String>(1);
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700365 }
366 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700367 }
368
369 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700370 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700371 }
372
373 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700374 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700375 }
376
377 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700378 PackageUserState state = modifyUserStateComponents(userId, false, true);
379 boolean changed = state.disabledComponents != null
380 ? state.disabledComponents.remove(componentClassName) : false;
381 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700382 return changed;
383 }
384
Amith Yamasani483f3b02012-03-13 16:08:00 -0700385 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700386 PackageUserState state = modifyUserStateComponents(userId, true, false);
387 boolean changed = state.enabledComponents != null
388 ? state.enabledComponents.remove(componentClassName) : false;
389 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700390 return changed;
391 }
392
Amith Yamasani483f3b02012-03-13 16:08:00 -0700393 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700394 PackageUserState state = modifyUserStateComponents(userId, true, true);
395 boolean changed = state.disabledComponents != null
396 ? state.disabledComponents.remove(componentClassName) : false;
397 changed |= state.enabledComponents != null
398 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700399 return changed;
400 }
401
Amith Yamasani483f3b02012-03-13 16:08:00 -0700402 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700403 PackageUserState state = readUserState(userId);
404 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700405 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700406 } else if (state.disabledComponents != null
407 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700408 return COMPONENT_ENABLED_STATE_DISABLED;
409 } else {
410 return COMPONENT_ENABLED_STATE_DEFAULT;
411 }
412 }
Amith Yamasani13593602012-03-22 16:16:17 -0700413
414 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700415 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700416 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700417}