blob: 0f3b4e6bfa7979ca5294016cbfb5baeb71347964 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 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
Kenny Rootcf0b38c2011-03-22 14:17:59 -070017package com.android.server.pm;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
Fyodor Kupolovb94c1652015-03-03 12:25:30 -080019import android.annotation.Nullable;
Jeff Brownb880d882014-02-10 19:47:07 -080020import android.content.Context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021import android.content.pm.PackageStats;
Narayan Kamath29564cd2014-08-07 10:57:40 +010022import android.os.Build;
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070023import android.text.TextUtils;
Joe Onorato8a9b2202010-02-26 18:56:32 -080024import android.util.Slog;
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070025
Narayan Kamath6c4b9de2014-08-08 12:44:12 +010026import dalvik.system.VMRuntime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027
Narayan Kamath29564cd2014-08-07 10:57:40 +010028import com.android.internal.os.InstallerConnection;
29import com.android.server.SystemService;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030
Jeff Brown6f357d32014-01-15 20:40:55 -080031public final class Installer extends SystemService {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032 private static final String TAG = "Installer";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033
Narayan Kamath29564cd2014-08-07 10:57:40 +010034 private final InstallerConnection mInstaller;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035
Jeff Brownb880d882014-02-10 19:47:07 -080036 public Installer(Context context) {
37 super(context);
Narayan Kamath29564cd2014-08-07 10:57:40 +010038 mInstaller = new InstallerConnection();
Jeff Brownb880d882014-02-10 19:47:07 -080039 }
40
Jeff Brown6f357d32014-01-15 20:40:55 -080041 @Override
42 public void onStart() {
43 Slog.i(TAG, "Waiting for installd to be ready.");
44 ping();
45 }
46
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070047 private static String escapeNull(String arg) {
48 if (TextUtils.isEmpty(arg)) {
49 return "!";
50 } else {
Jeff Sharkey529f91f2015-04-18 20:23:13 -070051 if (arg.indexOf('\0') != -1 || arg.indexOf(' ') != -1) {
52 throw new IllegalArgumentException(arg);
53 }
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070054 return arg;
55 }
56 }
57
58 @Deprecated
Robert Craig0f40dc92013-03-25 06:33:03 -040059 public int install(String name, int uid, int gid, String seinfo) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070060 return install(null, name, uid, gid, seinfo);
61 }
62
63 public int install(String uuid, String name, int uid, int gid, String seinfo) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064 StringBuilder builder = new StringBuilder("install");
65 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070066 builder.append(escapeNull(uuid));
67 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080068 builder.append(name);
69 builder.append(' ');
70 builder.append(uid);
71 builder.append(' ');
72 builder.append(gid);
Robert Craig0f40dc92013-03-25 06:33:03 -040073 builder.append(' ');
74 builder.append(seinfo != null ? seinfo : "!");
Narayan Kamath29564cd2014-08-07 10:57:40 +010075 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080076 }
77
Richard Uhler7b08b352015-03-25 16:25:57 -070078 public int dexopt(String apkPath, int uid, boolean isPublic,
79 String instructionSet, int dexoptNeeded) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +010080 if (!isValidInstructionSet(instructionSet)) {
81 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
82 return -1;
83 }
84
Richard Uhler7b08b352015-03-25 16:25:57 -070085 return mInstaller.dexopt(apkPath, uid, isPublic, instructionSet, dexoptNeeded);
Dave Allison0efbd9a2014-01-30 14:19:51 -080086 }
87
Narayan Kamath0349e8c2014-05-01 11:41:20 +010088 public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
Richard Uhler7b08b352015-03-25 16:25:57 -070089 String instructionSet, int dexoptNeeded, boolean vmSafeMode,
90 boolean debuggable, @Nullable String outputPath) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +010091 if (!isValidInstructionSet(instructionSet)) {
92 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
93 return -1;
94 }
Richard Uhler7b08b352015-03-25 16:25:57 -070095 return mInstaller.dexopt(apkPath, uid, isPublic, pkgName,
96 instructionSet, dexoptNeeded, vmSafeMode,
Fyodor Kupolovb94c1652015-03-03 12:25:30 -080097 debuggable, outputPath);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098 }
99
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100100 public int idmap(String targetApkPath, String overlayApkPath, int uid) {
101 StringBuilder builder = new StringBuilder("idmap");
102 builder.append(' ');
103 builder.append(targetApkPath);
104 builder.append(' ');
105 builder.append(overlayApkPath);
106 builder.append(' ');
107 builder.append(uid);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100108 return mInstaller.execute(builder.toString());
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100109 }
110
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100111 public int movedex(String srcPath, String dstPath, String instructionSet) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100112 if (!isValidInstructionSet(instructionSet)) {
113 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
114 return -1;
115 }
116
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800117 StringBuilder builder = new StringBuilder("movedex");
118 builder.append(' ');
119 builder.append(srcPath);
120 builder.append(' ');
121 builder.append(dstPath);
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100122 builder.append(' ');
123 builder.append(instructionSet);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100124 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800125 }
126
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100127 public int rmdex(String codePath, String instructionSet) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100128 if (!isValidInstructionSet(instructionSet)) {
129 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
130 return -1;
131 }
132
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800133 StringBuilder builder = new StringBuilder("rmdex");
134 builder.append(' ');
135 builder.append(codePath);
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100136 builder.append(' ');
137 builder.append(instructionSet);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100138 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800139 }
140
Fyodor Kupolovb94c1652015-03-03 12:25:30 -0800141 /**
142 * Removes packageDir or its subdirectory
143 */
144 public int rmPackageDir(String packageDir) {
145 StringBuilder builder = new StringBuilder("rmpackagedir");
146 builder.append(' ');
147 builder.append(packageDir);
148 return mInstaller.execute(builder.toString());
149 }
150
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700151 @Deprecated
Amith Yamasani0b285492011-04-14 17:35:23 -0700152 public int remove(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700153 return remove(null, name, userId);
154 }
155
156 public int remove(String uuid, String name, int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800157 StringBuilder builder = new StringBuilder("remove");
158 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700159 builder.append(escapeNull(uuid));
160 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161 builder.append(name);
Amith Yamasani0b285492011-04-14 17:35:23 -0700162 builder.append(' ');
163 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100164 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800165 }
166
Kenny Root35ab3ad2011-02-02 16:42:14 -0800167 public int rename(String oldname, String newname) {
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800168 StringBuilder builder = new StringBuilder("rename");
169 builder.append(' ');
170 builder.append(oldname);
171 builder.append(' ');
172 builder.append(newname);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100173 return mInstaller.execute(builder.toString());
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800174 }
175
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700176 @Deprecated
Dave Burke383fa182012-10-23 23:12:19 -0700177 public int fixUid(String name, int uid, int gid) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700178 return fixUid(null, name, uid, gid);
179 }
180
181 public int fixUid(String uuid, String name, int uid, int gid) {
Dianne Hackbornd0c5f512012-06-07 16:53:59 -0700182 StringBuilder builder = new StringBuilder("fixuid");
183 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700184 builder.append(escapeNull(uuid));
185 builder.append(' ');
Dianne Hackbornd0c5f512012-06-07 16:53:59 -0700186 builder.append(name);
187 builder.append(' ');
188 builder.append(uid);
189 builder.append(' ');
Dave Burke383fa182012-10-23 23:12:19 -0700190 builder.append(gid);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100191 return mInstaller.execute(builder.toString());
Dianne Hackbornd0c5f512012-06-07 16:53:59 -0700192 }
193
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700194 @Deprecated
Amith Yamasani54289b82012-10-01 10:39:14 -0700195 public int deleteCacheFiles(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700196 return deleteCacheFiles(null, name, userId);
197 }
198
199 public int deleteCacheFiles(String uuid, String name, int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800200 StringBuilder builder = new StringBuilder("rmcache");
201 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700202 builder.append(escapeNull(uuid));
203 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800204 builder.append(name);
Amith Yamasani54289b82012-10-01 10:39:14 -0700205 builder.append(' ');
206 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100207 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800208 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700209
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700210 @Deprecated
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700211 public int deleteCodeCacheFiles(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700212 return deleteCodeCacheFiles(null, name, userId);
213 }
214
215 public int deleteCodeCacheFiles(String uuid, String name, int userId) {
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700216 StringBuilder builder = new StringBuilder("rmcodecache");
217 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700218 builder.append(escapeNull(uuid));
219 builder.append(' ');
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700220 builder.append(name);
221 builder.append(' ');
222 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100223 return mInstaller.execute(builder.toString());
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700224 }
225
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700226 @Deprecated
Robert Craig8643dc62013-07-29 09:06:51 -0400227 public int createUserData(String name, int uid, int userId, String seinfo) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700228 return createUserData(null, name, uid, userId, seinfo);
229 }
230
231 public int createUserData(String uuid, String name, int uid, int userId, String seinfo) {
Amith Yamasani0b285492011-04-14 17:35:23 -0700232 StringBuilder builder = new StringBuilder("mkuserdata");
233 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700234 builder.append(escapeNull(uuid));
235 builder.append(' ');
Amith Yamasani0b285492011-04-14 17:35:23 -0700236 builder.append(name);
237 builder.append(' ');
238 builder.append(uid);
239 builder.append(' ');
240 builder.append(userId);
Robert Craig8643dc62013-07-29 09:06:51 -0400241 builder.append(' ');
242 builder.append(seinfo != null ? seinfo : "!");
Narayan Kamath29564cd2014-08-07 10:57:40 +0100243 return mInstaller.execute(builder.toString());
Amith Yamasani0b285492011-04-14 17:35:23 -0700244 }
245
Robin Lee06505d22014-07-09 17:43:56 +0000246 public int createUserConfig(int userId) {
247 StringBuilder builder = new StringBuilder("mkuserconfig");
248 builder.append(' ');
249 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100250 return mInstaller.execute(builder.toString());
Robin Lee06505d22014-07-09 17:43:56 +0000251 }
252
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700253 @Deprecated
Amith Yamasani0b285492011-04-14 17:35:23 -0700254 public int removeUserDataDirs(int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700255 return removeUserDataDirs(null, userId);
256 }
257
258 public int removeUserDataDirs(String uuid, int userId) {
Amith Yamasani0b285492011-04-14 17:35:23 -0700259 StringBuilder builder = new StringBuilder("rmuser");
260 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700261 builder.append(escapeNull(uuid));
262 builder.append(' ');
Amith Yamasani0b285492011-04-14 17:35:23 -0700263 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100264 return mInstaller.execute(builder.toString());
Amith Yamasani0b285492011-04-14 17:35:23 -0700265 }
266
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700267 public int moveUserDataDirs(String fromUuid, String toUuid, String packageName, int appId,
268 String seinfo) {
269 StringBuilder builder = new StringBuilder("mvuserdata");
270 builder.append(' ');
271 builder.append(escapeNull(fromUuid));
272 builder.append(' ');
273 builder.append(escapeNull(toUuid));
274 builder.append(' ');
275 builder.append(packageName);
276 builder.append(' ');
277 builder.append(appId);
278 builder.append(' ');
279 builder.append(seinfo);
280 return mInstaller.execute(builder.toString());
281 }
282
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700283 @Deprecated
Amith Yamasani0b285492011-04-14 17:35:23 -0700284 public int clearUserData(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700285 return clearUserData(null, name, userId);
286 }
287
288 public int clearUserData(String uuid, String name, int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 StringBuilder builder = new StringBuilder("rmuserdata");
290 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700291 builder.append(escapeNull(uuid));
292 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800293 builder.append(name);
Amith Yamasani0b285492011-04-14 17:35:23 -0700294 builder.append(' ');
295 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100296 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800297 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700298
Narayan Kamath343f4782014-11-10 14:23:41 +0000299 public int markBootComplete(String instructionSet) {
300 if (!isValidInstructionSet(instructionSet)) {
301 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
302 return -1;
303 }
304
305 StringBuilder builder = new StringBuilder("markbootcomplete");
306 builder.append(' ');
307 builder.append(instructionSet);
308 return mInstaller.execute(builder.toString());
309 }
310
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800311 public boolean ping() {
Narayan Kamath29564cd2014-08-07 10:57:40 +0100312 if (mInstaller.execute("ping") < 0) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800313 return false;
314 } else {
315 return true;
316 }
317 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700318
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700319 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800320 public int freeCache(long freeStorageSize) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700321 return freeCache(null, freeStorageSize);
322 }
323
324 public int freeCache(String uuid, long freeStorageSize) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800325 StringBuilder builder = new StringBuilder("freecache");
326 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700327 builder.append(escapeNull(uuid));
328 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800329 builder.append(String.valueOf(freeStorageSize));
Narayan Kamath29564cd2014-08-07 10:57:40 +0100330 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800331 }
332
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700333 @Deprecated
Dianne Hackbornecc8d6f2013-05-01 18:54:11 -0700334 public int getSizeInfo(String pkgName, int persona, String apkPath, String libDirPath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100335 String fwdLockApkPath, String asecPath, String[] instructionSets, PackageStats pStats) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700336 return getSizeInfo(null, pkgName, persona, apkPath, libDirPath, fwdLockApkPath, asecPath,
337 instructionSets, pStats);
338 }
339
340 public int getSizeInfo(String uuid, String pkgName, int persona, String apkPath,
341 String libDirPath, String fwdLockApkPath, String asecPath, String[] instructionSets,
342 PackageStats pStats) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100343 for (String instructionSet : instructionSets) {
344 if (!isValidInstructionSet(instructionSet)) {
345 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
346 return -1;
347 }
348 }
349
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800350 StringBuilder builder = new StringBuilder("getsize");
351 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700352 builder.append(escapeNull(uuid));
353 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800354 builder.append(pkgName);
355 builder.append(' ');
Dianne Hackborn0c380492012-08-20 17:23:30 -0700356 builder.append(persona);
357 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800358 builder.append(apkPath);
359 builder.append(' ');
Narayan Kamathff110bd2014-07-04 18:30:45 +0100360 // TODO: Extend getSizeInfo to look at the full subdirectory tree,
361 // not just the first level.
Dianne Hackbornecc8d6f2013-05-01 18:54:11 -0700362 builder.append(libDirPath != null ? libDirPath : "!");
363 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364 builder.append(fwdLockApkPath != null ? fwdLockApkPath : "!");
Dianne Hackborn292f8bc2011-06-27 16:27:41 -0700365 builder.append(' ');
366 builder.append(asecPath != null ? asecPath : "!");
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100367 builder.append(' ');
Narayan Kamathff110bd2014-07-04 18:30:45 +0100368 // TODO: Extend getSizeInfo to look at *all* instrution sets, not
369 // just the primary.
370 builder.append(instructionSets[0]);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800371
Narayan Kamath29564cd2014-08-07 10:57:40 +0100372 String s = mInstaller.transact(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 String res[] = s.split(" ");
374
Dianne Hackborn292f8bc2011-06-27 16:27:41 -0700375 if ((res == null) || (res.length != 5)) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800376 return -1;
377 }
378 try {
379 pStats.codeSize = Long.parseLong(res[1]);
380 pStats.dataSize = Long.parseLong(res[2]);
381 pStats.cacheSize = Long.parseLong(res[3]);
Dianne Hackborn292f8bc2011-06-27 16:27:41 -0700382 pStats.externalCodeSize = Long.parseLong(res[4]);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800383 return Integer.parseInt(res[0]);
384 } catch (NumberFormatException e) {
385 return -1;
386 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700387 }
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800388
389 public int moveFiles() {
Narayan Kamath29564cd2014-08-07 10:57:40 +0100390 return mInstaller.execute("movefiles");
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800391 }
Kenny Root6a6b0072010-10-07 16:46:10 -0700392
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700393 @Deprecated
394 public int linkNativeLibraryDirectory(String dataPath, String nativeLibPath32, int userId) {
395 return linkNativeLibraryDirectory(null, dataPath, nativeLibPath32, userId);
396 }
397
Kenny Rootddbe50d2012-09-06 13:18:37 -0700398 /**
Narayan Kamathff110bd2014-07-04 18:30:45 +0100399 * Links the 32 bit native library directory in an application's data directory to the
400 * real location for backward compatibility. Note that no such symlink is created for
401 * 64 bit shared libraries.
Kenny Rootddbe50d2012-09-06 13:18:37 -0700402 *
Kenny Rootddbe50d2012-09-06 13:18:37 -0700403 * @return -1 on error
404 */
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700405 public int linkNativeLibraryDirectory(String uuid, String dataPath, String nativeLibPath32,
406 int userId) {
Kenny Root6a6b0072010-10-07 16:46:10 -0700407 if (dataPath == null) {
Kenny Root9bbd70a2012-09-10 11:13:36 -0700408 Slog.e(TAG, "linkNativeLibraryDirectory dataPath is null");
Kenny Root6a6b0072010-10-07 16:46:10 -0700409 return -1;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100410 } else if (nativeLibPath32 == null) {
Kenny Root9bbd70a2012-09-10 11:13:36 -0700411 Slog.e(TAG, "linkNativeLibraryDirectory nativeLibPath is null");
Kenny Root6a6b0072010-10-07 16:46:10 -0700412 return -1;
413 }
414
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700415 StringBuilder builder = new StringBuilder("linklib");
416 builder.append(' ');
417 builder.append(escapeNull(uuid));
418 builder.append(' ');
Kenny Root6a6b0072010-10-07 16:46:10 -0700419 builder.append(dataPath);
420 builder.append(' ');
Narayan Kamathff110bd2014-07-04 18:30:45 +0100421 builder.append(nativeLibPath32);
Kenny Roota3e90792012-10-18 10:58:36 -0700422 builder.append(' ');
423 builder.append(userId);
Kenny Root6a6b0072010-10-07 16:46:10 -0700424
Narayan Kamath29564cd2014-08-07 10:57:40 +0100425 return mInstaller.execute(builder.toString());
Kenny Root6a6b0072010-10-07 16:46:10 -0700426 }
Robert Craig43853432014-03-04 11:57:23 -0500427
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700428 @Deprecated
Nick Kralevichce30fca852014-03-31 20:20:41 +0000429 public boolean restoreconData(String pkgName, String seinfo, int uid) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700430 return restoreconData(null, pkgName, seinfo, uid);
431 }
432
433 public boolean restoreconData(String uuid, String pkgName, String seinfo, int uid) {
Nick Kralevichce30fca852014-03-31 20:20:41 +0000434 StringBuilder builder = new StringBuilder("restorecondata");
435 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700436 builder.append(escapeNull(uuid));
437 builder.append(' ');
Nick Kralevichce30fca852014-03-31 20:20:41 +0000438 builder.append(pkgName);
439 builder.append(' ');
440 builder.append(seinfo != null ? seinfo : "!");
441 builder.append(' ');
442 builder.append(uid);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100443 return (mInstaller.execute(builder.toString()) == 0);
Robert Craig43853432014-03-04 11:57:23 -0500444 }
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100445
Fyodor Kupolovb94c1652015-03-03 12:25:30 -0800446 public int createOatDir(String oatDir, String dexInstructionSet) {
447 StringBuilder builder = new StringBuilder("createoatdir");
448 builder.append(' ');
449 builder.append(oatDir);
450 builder.append(' ');
451 builder.append(dexInstructionSet);
452 return mInstaller.execute(builder.toString());
453 }
454
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100455 /**
456 * Returns true iff. {@code instructionSet} is a valid instruction set.
457 */
458 private static boolean isValidInstructionSet(String instructionSet) {
459 if (instructionSet == null) {
460 return false;
461 }
462
463 for (String abi : Build.SUPPORTED_ABIS) {
464 if (instructionSet.equals(VMRuntime.getInstructionSet(abi))) {
465 return true;
466 }
467 }
468
469 return false;
470 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800471}