Skip to content

Commit d4ec5ae

Browse files
Dianne HackbornAndroid (Google) Code Review
authored andcommitted
Merge "Improve multi-user app management." into jb-mr1-dev
2 parents 7b3ca5b + 0c38049 commit d4ec5ae

File tree

18 files changed

+208
-55
lines changed

18 files changed

+208
-55
lines changed

cmds/installd/commands.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ int protect(char *pkgname, gid_t gid)
432432
return 0;
433433
}
434434

435-
int get_size(const char *pkgname, const char *apkpath,
435+
int get_size(const char *pkgname, int persona, const char *apkpath,
436436
const char *fwdlock_apkpath, const char *asecpath,
437437
int64_t *_codesize, int64_t *_datasize, int64_t *_cachesize,
438438
int64_t* _asecsize)
@@ -479,7 +479,7 @@ int get_size(const char *pkgname, const char *apkpath,
479479
}
480480
}
481481

482-
if (create_pkg_path(path, pkgname, PKG_DIR_POSTFIX, 0)) {
482+
if (create_pkg_path(path, pkgname, PKG_DIR_POSTFIX, persona)) {
483483
goto done;
484484
}
485485

cmds/installd/installd.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ static int do_get_size(char **arg, char reply[REPLY_MAX])
8585
int64_t asecsize = 0;
8686
int res = 0;
8787

88-
/* pkgdir, apkpath */
89-
res = get_size(arg[0], arg[1], arg[2], arg[3], &codesize, &datasize, &cachesize, &asecsize);
88+
/* pkgdir, persona, apkpath */
89+
res = get_size(arg[0], atoi(arg[1]), arg[2], arg[3], arg[4],
90+
&codesize, &datasize, &cachesize, &asecsize);
9091

9192
/*
9293
* Each int64_t can take up 22 characters printed out. Make sure it
@@ -150,7 +151,7 @@ struct cmdinfo cmds[] = {
150151
{ "freecache", 1, do_free_cache },
151152
{ "rmcache", 1, do_rm_cache },
152153
{ "protect", 2, do_protect },
153-
{ "getsize", 4, do_get_size },
154+
{ "getsize", 5, do_get_size },
154155
{ "rmuserdata", 2, do_rm_user_data },
155156
{ "movefiles", 0, do_movefiles },
156157
{ "linklib", 2, do_linklib },

cmds/installd/installd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ int delete_cache(const char *pkgname);
199199
int move_dex(const char *src, const char *dst);
200200
int rm_dex(const char *path);
201201
int protect(char *pkgname, gid_t gid);
202-
int get_size(const char *pkgname, const char *apkpath, const char *fwdlock_apkpath,
202+
int get_size(const char *pkgname, int persona, const char *apkpath, const char *fwdlock_apkpath,
203203
const char *asecpath, int64_t *codesize, int64_t *datasize, int64_t *cachesize,
204204
int64_t *asecsize);
205205
int free_cache(int64_t free_size);

core/java/android/app/ActivityManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,13 @@ public static class RunningAppProcessInfo implements Parcelable {
13771377
*/
13781378
public static final int FLAG_PERSISTENT = 1<<1;
13791379

1380+
/**
1381+
* Constant for {@link #flags}: this process is associated with a
1382+
* persistent system app.
1383+
* @hide
1384+
*/
1385+
public static final int FLAG_HAS_ACTIVITIES = 1<<2;
1386+
13801387
/**
13811388
* Flags of information. May be any of
13821389
* {@link #FLAG_CANT_SAVE_STATE}.

core/java/android/app/ApplicationPackageManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,10 +1079,10 @@ public void freeStorage(long freeStorageSize, IntentSender pi) {
10791079
}
10801080

10811081
@Override
1082-
public void getPackageSizeInfo(String packageName,
1083-
IPackageStatsObserver observer) {
1082+
public void getPackageSizeInfo(String packageName, int userHandle,
1083+
IPackageStatsObserver observer) {
10841084
try {
1085-
mPM.getPackageSizeInfo(packageName, observer);
1085+
mPM.getPackageSizeInfo(packageName, userHandle, observer);
10861086
} catch (RemoteException e) {
10871087
// Should never happen!
10881088
}

core/java/android/content/pm/IPackageManager.aidl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,11 @@ interface IPackageManager {
305305
* Get package statistics including the code, data and cache size for
306306
* an already installed package
307307
* @param packageName The package name of the application
308+
* @param userHandle Which user the size should be retrieved for
308309
* @param observer a callback to use to notify when the asynchronous
309310
* retrieval of information is complete.
310311
*/
311-
void getPackageSizeInfo(in String packageName, IPackageStatsObserver observer);
312+
void getPackageSizeInfo(in String packageName, int userHandle, IPackageStatsObserver observer);
312313

313314
/**
314315
* Get a list of shared libraries that are available on the

core/java/android/content/pm/PackageManager.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import android.graphics.drawable.Drawable;
2929
import android.net.Uri;
3030
import android.os.Environment;
31+
import android.os.UserHandle;
3132
import android.util.AndroidException;
3233
import android.util.DisplayMetrics;
3334

@@ -2407,6 +2408,7 @@ public abstract void deleteApplicationCacheFiles(String packageName,
24072408
* should have the {@link android.Manifest.permission#GET_PACKAGE_SIZE} permission.
24082409
*
24092410
* @param packageName The name of the package whose size information is to be retrieved
2411+
* @param userHandle The user whose size information should be retrieved.
24102412
* @param observer An observer callback to get notified when the operation
24112413
* is complete.
24122414
* {@link android.content.pm.IPackageStatsObserver#onGetStatsCompleted(PackageStats, boolean)}
@@ -2417,9 +2419,19 @@ public abstract void deleteApplicationCacheFiles(String packageName,
24172419
*
24182420
* @hide
24192421
*/
2420-
public abstract void getPackageSizeInfo(String packageName,
2422+
public abstract void getPackageSizeInfo(String packageName, int userHandle,
24212423
IPackageStatsObserver observer);
24222424

2425+
/**
2426+
* Like {@link #getPackageSizeInfo(String, int, IPackageStatsObserver)}, but
2427+
* returns the size for the calling user.
2428+
*
2429+
* @hide
2430+
*/
2431+
public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
2432+
getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
2433+
}
2434+
24232435
/**
24242436
* @deprecated This function no longer does anything; it was an old
24252437
* approach to managing preferred activities, which has been superceeded

core/java/android/content/pm/PackageStats.java

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import android.os.Parcel;
2020
import android.os.Parcelable;
21+
import android.os.UserHandle;
2122

2223
/**
2324
* implementation of PackageStats associated with a
@@ -27,6 +28,9 @@ public class PackageStats implements Parcelable {
2728
/** Name of the package to which this stats applies. */
2829
public String packageName;
2930

31+
/** @hide */
32+
public int userHandle;
33+
3034
/** Size of the code (e.g., APK) */
3135
public long codeSize;
3236

@@ -78,33 +82,58 @@ public PackageStats[] newArray(int size) {
7882
public String toString() {
7983
final StringBuilder sb = new StringBuilder("PackageStats{");
8084
sb.append(Integer.toHexString(System.identityHashCode(this)));
81-
sb.append(" packageName=");
85+
sb.append(" ");
8286
sb.append(packageName);
83-
sb.append(",codeSize=");
84-
sb.append(codeSize);
85-
sb.append(",dataSize=");
86-
sb.append(dataSize);
87-
sb.append(",cacheSize=");
88-
sb.append(cacheSize);
89-
sb.append(",externalCodeSize=");
90-
sb.append(externalCodeSize);
91-
sb.append(",externalDataSize=");
92-
sb.append(externalDataSize);
93-
sb.append(",externalCacheSize=");
94-
sb.append(externalCacheSize);
95-
sb.append(",externalMediaSize=");
96-
sb.append(externalMediaSize);
97-
sb.append(",externalObbSize=");
98-
sb.append(externalObbSize);
87+
if (codeSize != 0) {
88+
sb.append(" code=");
89+
sb.append(codeSize);
90+
}
91+
if (dataSize != 0) {
92+
sb.append(" data=");
93+
sb.append(dataSize);
94+
}
95+
if (cacheSize != 0) {
96+
sb.append(" cache=");
97+
sb.append(cacheSize);
98+
}
99+
if (externalCodeSize != 0) {
100+
sb.append(" extCode=");
101+
sb.append(externalCodeSize);
102+
}
103+
if (externalDataSize != 0) {
104+
sb.append(" extData=");
105+
sb.append(externalDataSize);
106+
}
107+
if (externalCacheSize != 0) {
108+
sb.append(" extCache=");
109+
sb.append(externalCacheSize);
110+
}
111+
if (externalMediaSize != 0) {
112+
sb.append(" media=");
113+
sb.append(externalMediaSize);
114+
}
115+
if (externalObbSize != 0) {
116+
sb.append(" obb=");
117+
sb.append(externalObbSize);
118+
}
119+
sb.append("}");
99120
return sb.toString();
100121
}
101122

102123
public PackageStats(String pkgName) {
103124
packageName = pkgName;
125+
userHandle = UserHandle.myUserId();
126+
}
127+
128+
/** @hide */
129+
public PackageStats(String pkgName, int userHandle) {
130+
this.packageName = pkgName;
131+
this.userHandle = userHandle;
104132
}
105133

106134
public PackageStats(Parcel source) {
107135
packageName = source.readString();
136+
userHandle = source.readInt();
108137
codeSize = source.readLong();
109138
dataSize = source.readLong();
110139
cacheSize = source.readLong();
@@ -117,6 +146,7 @@ public PackageStats(Parcel source) {
117146

118147
public PackageStats(PackageStats pStats) {
119148
packageName = pStats.packageName;
149+
userHandle = pStats.userHandle;
120150
codeSize = pStats.codeSize;
121151
dataSize = pStats.dataSize;
122152
cacheSize = pStats.cacheSize;
@@ -133,6 +163,7 @@ public int describeContents() {
133163

134164
public void writeToParcel(Parcel dest, int parcelableFlags){
135165
dest.writeString(packageName);
166+
dest.writeInt(userHandle);
136167
dest.writeLong(codeSize);
137168
dest.writeLong(dataSize);
138169
dest.writeLong(cacheSize);

core/tests/coretests/src/android/content/pm/AppCacheTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ public PackageStats invokePMGetPackageSizeInfo() throws Exception {
570570
PackageStatsObserver observer = new PackageStatsObserver();
571571
//wait on observer
572572
synchronized(observer) {
573-
getPm().getPackageSizeInfo(packageName, observer);
573+
getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
574574
long waitTime = 0;
575575
while((!observer.isDone()) || (waitTime > MAX_WAIT_TIME) ) {
576576
observer.wait(WAIT_TIME_INCR);

services/java/com/android/server/NotificationManagerService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,15 +1272,15 @@ public void cancelAllNotifications(String pkg) {
12721272

12731273
void checkCallerIsSystem() {
12741274
int uid = Binder.getCallingUid();
1275-
if (uid == Process.SYSTEM_UID || uid == 0) {
1275+
if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
12761276
return;
12771277
}
12781278
throw new SecurityException("Disallowed call for uid " + uid);
12791279
}
12801280

12811281
void checkCallerIsSystemOrSameApp(String pkg) {
12821282
int uid = Binder.getCallingUid();
1283-
if (uid == Process.SYSTEM_UID || uid == 0) {
1283+
if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
12841284
return;
12851285
}
12861286
try {

0 commit comments

Comments
 (0)