blob: b8506136d071e73101676f1d78e536b8314b531d [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
Christopher Tate628946a2013-10-18 18:11:05 -070019import android.content.pm.ApplicationInfo;
Jeff Sharkeyc5967e92016-01-07 18:50:29 -070020import android.content.pm.PackageManager;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070021import android.content.pm.PackageParser;
Netta P426cbef2017-02-10 14:38:39 -080022import android.content.pm.UserInfo;
23import android.service.pm.PackageProto;
24import android.util.proto.ProtoOutputStream;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070025
Todd Kennedy82b08422017-09-28 13:32:05 -070026import com.android.server.pm.permission.PermissionsState;
27
Kenny Rootcf0b38c2011-03-22 14:17:59 -070028import java.io.File;
Svet Ganov354cd3c2015-12-17 11:35:04 -080029import java.util.List;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070030
31/**
32 * Settings data for a particular package we know about.
33 */
Todd Kennedy82b08422017-09-28 13:32:05 -070034public final class PackageSetting extends PackageSettingBase {
Amith Yamasani13593602012-03-22 16:16:17 -070035 int appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070036 PackageParser.Package pkg;
Todd Kennedy3cd658e2016-08-16 15:00:31 -070037 /**
38 * WARNING. The object reference is important. We perform integer equality and NOT
39 * object equality to check whether shared user settings are the same.
40 */
Kenny Rootcf0b38c2011-03-22 14:17:59 -070041 SharedUserSetting sharedUser;
Todd Kennedy788c8422016-08-10 10:52:34 -070042 /**
43 * Temporary holding space for the shared user ID. While parsing package settings, the
Todd Kennedy3cd658e2016-08-16 15:00:31 -070044 * shared users tag may come after the packages. In this case, we must delay linking the
Todd Kennedy788c8422016-08-10 10:52:34 -070045 * shared user setting with the package setting. The shared user ID lets us link the
46 * two objects.
47 */
48 private int sharedUserId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070049
50 PackageSetting(String name, String realName, File codePath, File resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +010051 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +010052 String secondaryCpuAbiString, String cpuAbiOverrideString,
Dianne Hackborn3accca02013-09-20 09:32:11 -070053 long pVersionCode, int pkgFlags, int privateFlags, String parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -080054 List<String> childPackageNames, int sharedUserId, String[] usesStaticLibraries,
Dianne Hackborn3accca02013-09-20 09:32:11 -070055 long[] usesStaticLibrariesVersions) {
Narayan Kamathff110bd2014-07-04 18:30:45 +010056 super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString,
Narayan Kamath4903f642014-08-11 13:33:45 +010057 primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString,
Svet Ganov67882122016-12-11 16:36:34 -080058 pVersionCode, pkgFlags, privateFlags, parentPackageName, childPackageNames,
59 usesStaticLibraries, usesStaticLibrariesVersions);
Todd Kennedy788c8422016-08-10 10:52:34 -070060 this.sharedUserId = sharedUserId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070061 }
62
63 /**
64 * New instance of PackageSetting replicating the original settings.
65 * Note that it keeps the same PackageParser.Package instance.
66 */
67 PackageSetting(PackageSetting orig) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -070068 super(orig, orig.realName);
69 doCopy(orig);
70 }
71
72 /**
73 * New instance of PackageSetting replicating the original settings, but, allows specifying
74 * a real package name.
75 * Note that it keeps the same PackageParser.Package instance.
76 */
77 PackageSetting(PackageSetting orig, String realPkgName) {
78 super(orig, realPkgName);
Todd Kennedy788c8422016-08-10 10:52:34 -070079 doCopy(orig);
80 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -070081
Todd Kennedy788c8422016-08-10 10:52:34 -070082 public int getSharedUserId() {
83 if (sharedUser != null) {
84 return sharedUser.userId;
85 }
86 return sharedUserId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070087 }
88
Todd Kennedyc29b11a2017-10-23 15:55:59 -070089 public SharedUserSetting getSharedUser() {
90 return sharedUser;
91 }
92
Kenny Rootcf0b38c2011-03-22 14:17:59 -070093 @Override
94 public String toString() {
95 return "PackageSetting{"
96 + Integer.toHexString(System.identityHashCode(this))
Amith Yamasani13593602012-03-22 16:16:17 -070097 + " " + name + "/" + appId + "}";
Kenny Rootcf0b38c2011-03-22 14:17:59 -070098 }
Jeff Sharkey02e4d16e2013-08-12 20:31:36 -070099
Todd Kennedy788c8422016-08-10 10:52:34 -0700100 public void copyFrom(PackageSetting orig) {
101 super.copyFrom(orig);
102 doCopy(orig);
103 }
104
105 private void doCopy(PackageSetting orig) {
106 appId = orig.appId;
107 pkg = orig.pkg;
108 sharedUser = orig.sharedUser;
109 sharedUserId = orig.sharedUserId;
110 }
111
Todd Kennedy91a39d12017-09-27 12:37:04 -0700112 @Override
Svetoslavc6d1c342015-02-26 14:44:43 -0800113 public PermissionsState getPermissionsState() {
114 return (sharedUser != null)
115 ? sharedUser.getPermissionsState()
116 : super.getPermissionsState();
Jeff Sharkey02e4d16e2013-08-12 20:31:36 -0700117 }
Christopher Tate628946a2013-10-18 18:11:05 -0700118
Todd Kennedy82b08422017-09-28 13:32:05 -0700119 public PackageParser.Package getPackage() {
120 return pkg;
121 }
122
Todd Kennedy0eb97382017-10-03 16:57:22 -0700123 public int getAppId() {
124 return appId;
125 }
126
Todd Kennedyc29b11a2017-10-23 15:55:59 -0700127 public void setInstallPermissionsFixed(boolean fixed) {
128 installPermissionsFixed = fixed;
129 }
130
131 public boolean areInstallPermissionsFixed() {
132 return installPermissionsFixed;
133 }
134
Christopher Tate628946a2013-10-18 18:11:05 -0700135 public boolean isPrivileged() {
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800136 return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
Christopher Tate628946a2013-10-18 18:11:05 -0700137 }
Fyodor Kupoloveeea67b2015-02-23 17:14:45 -0800138
Svet Ganov087dce22017-09-07 15:42:16 -0700139 public boolean isOem() {
140 return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
141 }
142
Jiyong Park002fdbd2017-02-13 20:50:31 +0900143 public boolean isVendor() {
144 return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
145 }
146
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900147 public boolean isProduct() {
148 return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
149 }
150
Dario Freni2bef1762018-06-01 14:02:08 +0100151 public boolean isProductServices() {
152 return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT_SERVICES) != 0;
153 }
154
Fyodor Kupoloveeea67b2015-02-23 17:14:45 -0800155 public boolean isForwardLocked() {
156 return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0;
157 }
Svet Ganov12a692a2015-03-28 19:34:15 -0700158
159 public boolean isSystem() {
160 return (pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0;
161 }
Svetoslavd2cf3ae2015-04-02 16:51:55 -0700162
Todd Kennedyc29b11a2017-10-23 15:55:59 -0700163 public boolean isUpdatedSystem() {
164 return (pkgFlags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
165 }
166
Todd Kennedy91a39d12017-09-27 12:37:04 -0700167 @Override
Svetoslavd2cf3ae2015-04-02 16:51:55 -0700168 public boolean isSharedUser() {
169 return sharedUser != null;
170 }
Jeff Sharkeyc5967e92016-01-07 18:50:29 -0700171
172 public boolean isMatch(int flags) {
173 if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) {
174 return isSystem();
175 }
176 return true;
177 }
Netta P426cbef2017-02-10 14:38:39 -0800178
Todd Kennedy0eb97382017-10-03 16:57:22 -0700179 public boolean hasChildPackages() {
180 return childPackageNames != null && !childPackageNames.isEmpty();
181 }
182
Netta P426cbef2017-02-10 14:38:39 -0800183 public void writeToProto(ProtoOutputStream proto, long fieldId, List<UserInfo> users) {
184 final long packageToken = proto.start(fieldId);
185 proto.write(PackageProto.NAME, (realName != null ? realName : name));
186 proto.write(PackageProto.UID, appId);
187 proto.write(PackageProto.VERSION_CODE, versionCode);
188 proto.write(PackageProto.VERSION_STRING, pkg.mVersionName);
189 proto.write(PackageProto.INSTALL_TIME_MS, firstInstallTime);
190 proto.write(PackageProto.UPDATE_TIME_MS, lastUpdateTime);
191 proto.write(PackageProto.INSTALLER_NAME, installerPackageName);
192
193 if (pkg != null) {
194 long splitToken = proto.start(PackageProto.SPLITS);
195 proto.write(PackageProto.SplitProto.NAME, "base");
196 proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.baseRevisionCode);
197 proto.end(splitToken);
198 if (pkg.splitNames != null) {
199 for (int i = 0; i < pkg.splitNames.length; i++) {
200 splitToken = proto.start(PackageProto.SPLITS);
201 proto.write(PackageProto.SplitProto.NAME, pkg.splitNames[i]);
202 proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.splitRevisionCodes[i]);
203 proto.end(splitToken);
204 }
205 }
206 }
207 writeUsersInfoToProto(proto, PackageProto.USERS);
208 proto.end(packageToken);
209 }
Patrick4ccae942018-07-17 09:15:55 -0700210
211 /** Updates all fields in the current setting from another. */
212 public void updateFrom(PackageSetting other) {
213 super.updateFrom(other);
214 appId = other.appId;
215 pkg = other.pkg;
216 sharedUserId = other.sharedUserId;
217 sharedUser = other.sharedUser;
218 }
Jeff Sharkey02e4d16e2013-08-12 20:31:36 -0700219}