@@ -950,8 +950,8 @@ public PackageManagerService(Context context, boolean factoryTest, boolean onlyC
950950 mUserAppDataDir = new File (dataDir , "user" );
951951 mDrmAppPrivateInstallDir = new File (dataDir , "app-private" );
952952
953- sUserManager = UserManagerService . getInstance (context );
954- sUserManager . setInstaller ( this , mInstaller );
953+ sUserManager = new UserManagerService (context , this ,
954+ mInstallLock , mPackages );
955955
956956 readPermissions ();
957957
@@ -1145,8 +1145,7 @@ public PackageManagerService(Context context, boolean factoryTest, boolean onlyC
11451145 String msg = "System package " + ps .name
11461146 + " no longer exists; wiping its data" ;
11471147 reportSettingsProblem (Log .WARN , msg );
1148- mInstaller .remove (ps .name , 0 );
1149- sUserManager .removePackageForAllUsers (ps .name );
1148+ removeDataDirsLI (ps .name );
11501149 } else {
11511150 final PackageSetting disabledPs = mSettings .getDisabledSystemPkgLPr (ps .name );
11521151 if (disabledPs .codePath == null || !disabledPs .codePath .exists ()) {
@@ -1195,9 +1194,7 @@ public PackageManagerService(Context context, boolean factoryTest, boolean onlyC
11951194 if (deletedPkg == null ) {
11961195 msg = "Updated system package " + deletedAppName
11971196 + " no longer exists; wiping its data" ;
1198-
1199- mInstaller .remove (deletedAppName , 0 );
1200- sUserManager .removePackageForAllUsers (deletedAppName );
1197+ removeDataDirsLI (deletedAppName );
12011198 } else {
12021199 msg = "Updated system app + " + deletedAppName
12031200 + " no longer present; removing system privileges for "
@@ -1332,13 +1329,7 @@ public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
13321329
13331330 void cleanupInstallFailedPackage (PackageSetting ps ) {
13341331 Slog .i (TAG , "Cleaning up incompletely installed app: " + ps .name );
1335- int retCode = mInstaller .remove (ps .name , 0 );
1336- if (retCode < 0 ) {
1337- Slog .w (TAG , "Couldn't remove app data directory for package: "
1338- + ps .name + ", retcode=" + retCode );
1339- } else {
1340- sUserManager .removePackageForAllUsers (ps .name );
1341- }
1332+ removeDataDirsLI (ps .name );
13421333 if (ps .codePath != null ) {
13431334 if (!ps .codePath .delete ()) {
13441335 Slog .w (TAG , "Unable to remove old code file: " + ps .codePath );
@@ -1818,9 +1809,11 @@ public void freeStorageAndNotify(final long freeStorageSize, final IPackageDataO
18181809 public void run () {
18191810 mHandler .removeCallbacks (this );
18201811 int retCode = -1 ;
1821- retCode = mInstaller .freeCache (freeStorageSize );
1822- if (retCode < 0 ) {
1823- Slog .w (TAG , "Couldn't clear application caches" );
1812+ synchronized (mInstallLock ) {
1813+ retCode = mInstaller .freeCache (freeStorageSize );
1814+ if (retCode < 0 ) {
1815+ Slog .w (TAG , "Couldn't clear application caches" );
1816+ }
18241817 }
18251818 if (observer != null ) {
18261819 try {
@@ -1841,9 +1834,11 @@ public void freeStorage(final long freeStorageSize, final IntentSender pi) {
18411834 public void run () {
18421835 mHandler .removeCallbacks (this );
18431836 int retCode = -1 ;
1844- retCode = mInstaller .freeCache (freeStorageSize );
1845- if (retCode < 0 ) {
1846- Slog .w (TAG , "Couldn't clear application caches" );
1837+ synchronized (mInstallLock ) {
1838+ retCode = mInstaller .freeCache (freeStorageSize );
1839+ if (retCode < 0 ) {
1840+ Slog .w (TAG , "Couldn't clear application caches" );
1841+ }
18471842 }
18481843 if (pi != null ) {
18491844 try {
@@ -2994,7 +2989,9 @@ public List<ProviderInfo> queryContentProviders(String processName,
29942989 }
29952990 ProviderInfo info = PackageParser .generateProviderInfo (p , flags ,
29962991 ps .readUserState (userId ), userId );
2997- finalList .add (info );
2992+ if (info != null ) {
2993+ finalList .add (info );
2994+ }
29982995 }
29992996 }
30002997 }
@@ -3027,8 +3024,11 @@ public List<InstrumentationInfo> queryInstrumentation(String targetPackage,
30273024 final PackageParser .Instrumentation p = i .next ();
30283025 if (targetPackage == null
30293026 || targetPackage .equals (p .info .targetPackage )) {
3030- finalList .add (PackageParser .generateInstrumentationInfo (p ,
3031- flags ));
3027+ InstrumentationInfo ii = PackageParser .generateInstrumentationInfo (p ,
3028+ flags );
3029+ if (ii != null ) {
3030+ finalList .add (ii );
3031+ }
30323032 }
30333033 }
30343034 }
@@ -3189,7 +3189,7 @@ private PackageParser.Package scanPackageLI(File scanFile,
31893189
31903190 InstallArgs args = createInstallArgs (packageFlagsToInstallFlags (ps ),
31913191 ps .codePathString , ps .resourcePathString , ps .nativeLibraryPathString );
3192- synchronized (mInstaller ) {
3192+ synchronized (mInstallLock ) {
31933193 args .cleanUpResourcesLI ();
31943194 }
31953195 synchronized (mPackages ) {
@@ -3245,7 +3245,7 @@ private PackageParser.Package scanPackageLI(File scanFile,
32453245 + " better than installed " + ps .versionCode );
32463246 InstallArgs args = createInstallArgs (packageFlagsToInstallFlags (ps ),
32473247 ps .codePathString , ps .resourcePathString , ps .nativeLibraryPathString );
3248- synchronized (mInstaller ) {
3248+ synchronized (mInstallLock ) {
32493249 args .cleanUpResourcesLI ();
32503250 }
32513251 }
@@ -3479,6 +3479,36 @@ private File getDataPathForPackage(String packageName, int userId) {
34793479 }
34803480 }
34813481
3482+ private int createDataDirsLI (String packageName , int uid ) {
3483+ int [] users = sUserManager .getUserIds ();
3484+ int res = mInstaller .install (packageName , uid , uid );
3485+ if (res < 0 ) {
3486+ return res ;
3487+ }
3488+ for (int user : users ) {
3489+ if (user != 0 ) {
3490+ res = mInstaller .createUserData (packageName ,
3491+ UserHandle .getUid (user , uid ), user );
3492+ if (res < 0 ) {
3493+ return res ;
3494+ }
3495+ }
3496+ }
3497+ return res ;
3498+ }
3499+
3500+ private int removeDataDirsLI (String packageName ) {
3501+ int [] users = sUserManager .getUserIds ();
3502+ int res = 0 ;
3503+ for (int user : users ) {
3504+ int resInner = mInstaller .remove (packageName , user );
3505+ if (resInner < 0 ) {
3506+ res = resInner ;
3507+ }
3508+ }
3509+ return res ;
3510+ }
3511+
34823512 private PackageParser .Package scanPackageLI (PackageParser .Package pkg ,
34833513 int parseFlags , int scanMode , long currentTime , UserHandle user ) {
34843514 File scanFile = new File (pkg .mScanPath );
@@ -3831,11 +3861,9 @@ private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
38313861 || (scanMode &SCAN_BOOTING ) != 0 )) {
38323862 // If this is a system app, we can at least delete its
38333863 // current data so the application will still work.
3834- int ret = mInstaller . remove (pkgName , 0 );
3864+ int ret = removeDataDirsLI (pkgName );
38353865 if (ret >= 0 ) {
38363866 // TODO: Kill the processes first
3837- // Remove the data directories for all users
3838- sUserManager .removePackageForAllUsers (pkgName );
38393867 // Old data gone!
38403868 String prefix = (parseFlags &PackageParser .PARSE_IS_SYSTEM ) != 0
38413869 ? "System package " : "Third party package " ;
@@ -3847,8 +3875,7 @@ private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
38473875 recovered = true ;
38483876
38493877 // And now re-install the app.
3850- ret = mInstaller .install (pkgName , pkg .applicationInfo .uid ,
3851- pkg .applicationInfo .uid );
3878+ ret = createDataDirsLI (pkgName , pkg .applicationInfo .uid );
38523879 if (ret == -1 ) {
38533880 // Ack should not happen!
38543881 msg = prefix + pkg .packageName
@@ -3857,9 +3884,6 @@ private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
38573884 mLastScanError = PackageManager .INSTALL_FAILED_INSUFFICIENT_STORAGE ;
38583885 return null ;
38593886 }
3860- // Create data directories for all users
3861- sUserManager .installPackageForAllUsers (pkgName ,
3862- pkg .applicationInfo .uid );
38633887 }
38643888 if (!recovered ) {
38653889 mHasSystemUidErrors = true ;
@@ -3897,15 +3921,12 @@ private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
38973921 Log .v (TAG , "Want this data dir: " + dataPath );
38983922 }
38993923 //invoke installer to do the actual installation
3900- int ret = mInstaller .install (pkgName , pkg .applicationInfo .uid ,
3901- pkg .applicationInfo .uid );
3924+ int ret = createDataDirsLI (pkgName , pkg .applicationInfo .uid );
39023925 if (ret < 0 ) {
39033926 // Error from installer
39043927 mLastScanError = PackageManager .INSTALL_FAILED_INSUFFICIENT_STORAGE ;
39053928 return null ;
39063929 }
3907- // Create data directories for all users
3908- sUserManager .installPackageForAllUsers (pkgName , pkg .applicationInfo .uid );
39093930
39103931 if (dataPath .exists ()) {
39113932 pkg .applicationInfo .dataDir = dataPath .getPath ();
@@ -5078,6 +5099,9 @@ protected ResolveInfo newResult(PackageParser.ServiceIntentInfo filter,
50785099 }
50795100 ServiceInfo si = PackageParser .generateServiceInfo (service , mFlags ,
50805101 ps .readUserState (userId ), userId );
5102+ if (si == null ) {
5103+ return null ;
5104+ }
50815105 final ResolveInfo res = new ResolveInfo ();
50825106 res .serviceInfo = si ;
50835107 if ((mFlags &PackageManager .GET_RESOLVED_FILTER ) != 0 ) {
@@ -7819,15 +7843,7 @@ private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo out
78197843 }
78207844 }
78217845 if ((flags &PackageManager .DELETE_KEEP_DATA ) == 0 ) {
7822- int retCode = mInstaller .remove (packageName , 0 );
7823- if (retCode < 0 ) {
7824- Slog .w (TAG , "Couldn't remove app data or cache directory for package: "
7825- + packageName + ", retcode=" + retCode );
7826- // we don't consider this to be a failure of the core package deletion
7827- } else {
7828- // TODO: Kill the processes first
7829- sUserManager .removePackageForAllUsers (packageName );
7830- }
7846+ removeDataDirsLI (packageName );
78317847 schedulePackageCleaning (packageName , UserHandle .USER_ALL , true );
78327848 }
78337849 // writer
@@ -9742,15 +9758,36 @@ public int getInstallLocation() {
97429758 }
97439759
97449760 /** Called by UserManagerService */
9745- void cleanUpUser (int userHandle ) {
9761+ void cleanUpUserLILPw (int userHandle ) {
97469762 // Disable all the packages for the user first
9747- synchronized (mPackages ) {
9748- Set <Entry <String , PackageSetting >> entries = mSettings .mPackages .entrySet ();
9749- for (Entry <String , PackageSetting > entry : entries ) {
9750- entry .getValue ().removeUser (userHandle );
9751- }
9752- if (mDirtyUsers .remove (userHandle ));
9753- mSettings .removeUserLPr (userHandle );
9763+ Set <Entry <String , PackageSetting >> entries = mSettings .mPackages .entrySet ();
9764+ for (Entry <String , PackageSetting > entry : entries ) {
9765+ entry .getValue ().removeUser (userHandle );
9766+ }
9767+ if (mDirtyUsers .remove (userHandle ));
9768+ mSettings .removeUserLPr (userHandle );
9769+ if (mInstaller != null ) {
9770+ // Technically, we shouldn't be doing this with the package lock
9771+ // held. However, this is very rare, and there is already so much
9772+ // other disk I/O going on, that we'll let it slide for now.
9773+ mInstaller .removeUserDataDirs (userHandle );
9774+ }
9775+ }
9776+
9777+ /** Called by UserManagerService */
9778+ void createNewUserLILPw (int userHandle , File path ) {
9779+ if (mInstaller != null ) {
9780+ path .mkdir ();
9781+ FileUtils .setPermissions (path .toString (), FileUtils .S_IRWXU | FileUtils .S_IRWXG
9782+ | FileUtils .S_IXOTH , -1 , -1 );
9783+ for (PackageSetting ps : mSettings .mPackages .values ()) {
9784+ // Only system apps are initially installed.
9785+ ps .setInstalled ((ps .pkgFlags &ApplicationInfo .FLAG_SYSTEM ) != 0 , userHandle );
9786+ // Need to create a data directory for all apps under this user.
9787+ mInstaller .createUserData (ps .name ,
9788+ UserHandle .getUid (userHandle , ps .appId ), userHandle );
9789+ }
9790+ mSettings .writePackageRestrictionsLPr (userHandle );
97549791 }
97559792 }
97569793
0 commit comments