blob: a32363dc39c0db2231c451c49a4e05e7ed7a451a [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 {
51 return arg;
52 }
53 }
54
55 @Deprecated
Robert Craig0f40dc92013-03-25 06:33:03 -040056 public int install(String name, int uid, int gid, String seinfo) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070057 return install(null, name, uid, gid, seinfo);
58 }
59
60 public int install(String uuid, String name, int uid, int gid, String seinfo) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080061 StringBuilder builder = new StringBuilder("install");
62 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -070063 builder.append(escapeNull(uuid));
64 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080065 builder.append(name);
66 builder.append(' ');
67 builder.append(uid);
68 builder.append(' ');
69 builder.append(gid);
Robert Craig0f40dc92013-03-25 06:33:03 -040070 builder.append(' ');
71 builder.append(seinfo != null ? seinfo : "!");
Narayan Kamath29564cd2014-08-07 10:57:40 +010072 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080073 }
74
Richard Uhler7b08b352015-03-25 16:25:57 -070075 public int dexopt(String apkPath, int uid, boolean isPublic,
76 String instructionSet, int dexoptNeeded) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +010077 if (!isValidInstructionSet(instructionSet)) {
78 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
79 return -1;
80 }
81
Richard Uhler7b08b352015-03-25 16:25:57 -070082 return mInstaller.dexopt(apkPath, uid, isPublic, instructionSet, dexoptNeeded);
Dave Allison0efbd9a2014-01-30 14:19:51 -080083 }
84
Narayan Kamath0349e8c2014-05-01 11:41:20 +010085 public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
Richard Uhler7b08b352015-03-25 16:25:57 -070086 String instructionSet, int dexoptNeeded, boolean vmSafeMode,
87 boolean debuggable, @Nullable String outputPath) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +010088 if (!isValidInstructionSet(instructionSet)) {
89 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
90 return -1;
91 }
Richard Uhler7b08b352015-03-25 16:25:57 -070092 return mInstaller.dexopt(apkPath, uid, isPublic, pkgName,
93 instructionSet, dexoptNeeded, vmSafeMode,
Fyodor Kupolovb94c1652015-03-03 12:25:30 -080094 debuggable, outputPath);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095 }
96
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +010097 public int idmap(String targetApkPath, String overlayApkPath, int uid) {
98 StringBuilder builder = new StringBuilder("idmap");
99 builder.append(' ');
100 builder.append(targetApkPath);
101 builder.append(' ');
102 builder.append(overlayApkPath);
103 builder.append(' ');
104 builder.append(uid);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100105 return mInstaller.execute(builder.toString());
MÃ¥rten Kongstad48d22322014-01-31 14:43:27 +0100106 }
107
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100108 public int movedex(String srcPath, String dstPath, String instructionSet) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100109 if (!isValidInstructionSet(instructionSet)) {
110 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
111 return -1;
112 }
113
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114 StringBuilder builder = new StringBuilder("movedex");
115 builder.append(' ');
116 builder.append(srcPath);
117 builder.append(' ');
118 builder.append(dstPath);
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100119 builder.append(' ');
120 builder.append(instructionSet);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100121 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800122 }
123
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100124 public int rmdex(String codePath, String instructionSet) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100125 if (!isValidInstructionSet(instructionSet)) {
126 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
127 return -1;
128 }
129
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800130 StringBuilder builder = new StringBuilder("rmdex");
131 builder.append(' ');
132 builder.append(codePath);
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100133 builder.append(' ');
134 builder.append(instructionSet);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100135 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800136 }
137
Fyodor Kupolovb94c1652015-03-03 12:25:30 -0800138 /**
139 * Removes packageDir or its subdirectory
140 */
141 public int rmPackageDir(String packageDir) {
142 StringBuilder builder = new StringBuilder("rmpackagedir");
143 builder.append(' ');
144 builder.append(packageDir);
145 return mInstaller.execute(builder.toString());
146 }
147
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700148 @Deprecated
Amith Yamasani0b285492011-04-14 17:35:23 -0700149 public int remove(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700150 return remove(null, name, userId);
151 }
152
153 public int remove(String uuid, String name, int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154 StringBuilder builder = new StringBuilder("remove");
155 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700156 builder.append(escapeNull(uuid));
157 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 builder.append(name);
Amith Yamasani0b285492011-04-14 17:35:23 -0700159 builder.append(' ');
160 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100161 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 }
163
Kenny Root35ab3ad2011-02-02 16:42:14 -0800164 public int rename(String oldname, String newname) {
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800165 StringBuilder builder = new StringBuilder("rename");
166 builder.append(' ');
167 builder.append(oldname);
168 builder.append(' ');
169 builder.append(newname);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100170 return mInstaller.execute(builder.toString());
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800171 }
172
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700173 @Deprecated
Dave Burke383fa182012-10-23 23:12:19 -0700174 public int fixUid(String name, int uid, int gid) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700175 return fixUid(null, name, uid, gid);
176 }
177
178 public int fixUid(String uuid, String name, int uid, int gid) {
Dianne Hackbornd0c5f512012-06-07 16:53:59 -0700179 StringBuilder builder = new StringBuilder("fixuid");
180 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700181 builder.append(escapeNull(uuid));
182 builder.append(' ');
Dianne Hackbornd0c5f512012-06-07 16:53:59 -0700183 builder.append(name);
184 builder.append(' ');
185 builder.append(uid);
186 builder.append(' ');
Dave Burke383fa182012-10-23 23:12:19 -0700187 builder.append(gid);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100188 return mInstaller.execute(builder.toString());
Dianne Hackbornd0c5f512012-06-07 16:53:59 -0700189 }
190
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700191 @Deprecated
Amith Yamasani54289b82012-10-01 10:39:14 -0700192 public int deleteCacheFiles(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700193 return deleteCacheFiles(null, name, userId);
194 }
195
196 public int deleteCacheFiles(String uuid, String name, int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 StringBuilder builder = new StringBuilder("rmcache");
198 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700199 builder.append(escapeNull(uuid));
200 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201 builder.append(name);
Amith Yamasani54289b82012-10-01 10:39:14 -0700202 builder.append(' ');
203 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100204 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800205 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700206
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700207 @Deprecated
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700208 public int deleteCodeCacheFiles(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700209 return deleteCodeCacheFiles(null, name, userId);
210 }
211
212 public int deleteCodeCacheFiles(String uuid, String name, int userId) {
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700213 StringBuilder builder = new StringBuilder("rmcodecache");
214 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700215 builder.append(escapeNull(uuid));
216 builder.append(' ');
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700217 builder.append(name);
218 builder.append(' ');
219 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100220 return mInstaller.execute(builder.toString());
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700221 }
222
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700223 @Deprecated
Robert Craig8643dc62013-07-29 09:06:51 -0400224 public int createUserData(String name, int uid, int userId, String seinfo) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700225 return createUserData(null, name, uid, userId, seinfo);
226 }
227
228 public int createUserData(String uuid, String name, int uid, int userId, String seinfo) {
Amith Yamasani0b285492011-04-14 17:35:23 -0700229 StringBuilder builder = new StringBuilder("mkuserdata");
230 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700231 builder.append(escapeNull(uuid));
232 builder.append(' ');
Amith Yamasani0b285492011-04-14 17:35:23 -0700233 builder.append(name);
234 builder.append(' ');
235 builder.append(uid);
236 builder.append(' ');
237 builder.append(userId);
Robert Craig8643dc62013-07-29 09:06:51 -0400238 builder.append(' ');
239 builder.append(seinfo != null ? seinfo : "!");
Narayan Kamath29564cd2014-08-07 10:57:40 +0100240 return mInstaller.execute(builder.toString());
Amith Yamasani0b285492011-04-14 17:35:23 -0700241 }
242
Robin Lee06505d22014-07-09 17:43:56 +0000243 public int createUserConfig(int userId) {
244 StringBuilder builder = new StringBuilder("mkuserconfig");
245 builder.append(' ');
246 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100247 return mInstaller.execute(builder.toString());
Robin Lee06505d22014-07-09 17:43:56 +0000248 }
249
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700250 @Deprecated
Amith Yamasani0b285492011-04-14 17:35:23 -0700251 public int removeUserDataDirs(int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700252 return removeUserDataDirs(null, userId);
253 }
254
255 public int removeUserDataDirs(String uuid, int userId) {
Amith Yamasani0b285492011-04-14 17:35:23 -0700256 StringBuilder builder = new StringBuilder("rmuser");
257 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700258 builder.append(escapeNull(uuid));
259 builder.append(' ');
Amith Yamasani0b285492011-04-14 17:35:23 -0700260 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100261 return mInstaller.execute(builder.toString());
Amith Yamasani0b285492011-04-14 17:35:23 -0700262 }
263
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700264 public int moveUserDataDirs(String fromUuid, String toUuid, String packageName, int appId,
265 String seinfo) {
266 StringBuilder builder = new StringBuilder("mvuserdata");
267 builder.append(' ');
268 builder.append(escapeNull(fromUuid));
269 builder.append(' ');
270 builder.append(escapeNull(toUuid));
271 builder.append(' ');
272 builder.append(packageName);
273 builder.append(' ');
274 builder.append(appId);
275 builder.append(' ');
276 builder.append(seinfo);
277 return mInstaller.execute(builder.toString());
278 }
279
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700280 @Deprecated
Amith Yamasani0b285492011-04-14 17:35:23 -0700281 public int clearUserData(String name, int userId) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700282 return clearUserData(null, name, userId);
283 }
284
285 public int clearUserData(String uuid, String name, int userId) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800286 StringBuilder builder = new StringBuilder("rmuserdata");
287 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700288 builder.append(escapeNull(uuid));
289 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800290 builder.append(name);
Amith Yamasani0b285492011-04-14 17:35:23 -0700291 builder.append(' ');
292 builder.append(userId);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100293 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800294 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700295
Narayan Kamath343f4782014-11-10 14:23:41 +0000296 public int markBootComplete(String instructionSet) {
297 if (!isValidInstructionSet(instructionSet)) {
298 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
299 return -1;
300 }
301
302 StringBuilder builder = new StringBuilder("markbootcomplete");
303 builder.append(' ');
304 builder.append(instructionSet);
305 return mInstaller.execute(builder.toString());
306 }
307
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800308 public boolean ping() {
Narayan Kamath29564cd2014-08-07 10:57:40 +0100309 if (mInstaller.execute("ping") < 0) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800310 return false;
311 } else {
312 return true;
313 }
314 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700315
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700316 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800317 public int freeCache(long freeStorageSize) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700318 return freeCache(null, freeStorageSize);
319 }
320
321 public int freeCache(String uuid, long freeStorageSize) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800322 StringBuilder builder = new StringBuilder("freecache");
323 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700324 builder.append(escapeNull(uuid));
325 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800326 builder.append(String.valueOf(freeStorageSize));
Narayan Kamath29564cd2014-08-07 10:57:40 +0100327 return mInstaller.execute(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800328 }
329
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700330 @Deprecated
Dianne Hackbornecc8d6f2013-05-01 18:54:11 -0700331 public int getSizeInfo(String pkgName, int persona, String apkPath, String libDirPath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100332 String fwdLockApkPath, String asecPath, String[] instructionSets, PackageStats pStats) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700333 return getSizeInfo(null, pkgName, persona, apkPath, libDirPath, fwdLockApkPath, asecPath,
334 instructionSets, pStats);
335 }
336
337 public int getSizeInfo(String uuid, String pkgName, int persona, String apkPath,
338 String libDirPath, String fwdLockApkPath, String asecPath, String[] instructionSets,
339 PackageStats pStats) {
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100340 for (String instructionSet : instructionSets) {
341 if (!isValidInstructionSet(instructionSet)) {
342 Slog.e(TAG, "Invalid instruction set: " + instructionSet);
343 return -1;
344 }
345 }
346
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800347 StringBuilder builder = new StringBuilder("getsize");
348 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700349 builder.append(escapeNull(uuid));
350 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351 builder.append(pkgName);
352 builder.append(' ');
Dianne Hackborn0c380492012-08-20 17:23:30 -0700353 builder.append(persona);
354 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800355 builder.append(apkPath);
356 builder.append(' ');
Narayan Kamathff110bd2014-07-04 18:30:45 +0100357 // TODO: Extend getSizeInfo to look at the full subdirectory tree,
358 // not just the first level.
Dianne Hackbornecc8d6f2013-05-01 18:54:11 -0700359 builder.append(libDirPath != null ? libDirPath : "!");
360 builder.append(' ');
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800361 builder.append(fwdLockApkPath != null ? fwdLockApkPath : "!");
Dianne Hackborn292f8bc2011-06-27 16:27:41 -0700362 builder.append(' ');
363 builder.append(asecPath != null ? asecPath : "!");
Narayan Kamath0349e8c2014-05-01 11:41:20 +0100364 builder.append(' ');
Narayan Kamathff110bd2014-07-04 18:30:45 +0100365 // TODO: Extend getSizeInfo to look at *all* instrution sets, not
366 // just the primary.
367 builder.append(instructionSets[0]);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800368
Narayan Kamath29564cd2014-08-07 10:57:40 +0100369 String s = mInstaller.transact(builder.toString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370 String res[] = s.split(" ");
371
Dianne Hackborn292f8bc2011-06-27 16:27:41 -0700372 if ((res == null) || (res.length != 5)) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 return -1;
374 }
375 try {
376 pStats.codeSize = Long.parseLong(res[1]);
377 pStats.dataSize = Long.parseLong(res[2]);
378 pStats.cacheSize = Long.parseLong(res[3]);
Dianne Hackborn292f8bc2011-06-27 16:27:41 -0700379 pStats.externalCodeSize = Long.parseLong(res[4]);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800380 return Integer.parseInt(res[0]);
381 } catch (NumberFormatException e) {
382 return -1;
383 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700384 }
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800385
386 public int moveFiles() {
Narayan Kamath29564cd2014-08-07 10:57:40 +0100387 return mInstaller.execute("movefiles");
Dianne Hackbornb858dfd2010-02-02 10:49:14 -0800388 }
Kenny Root6a6b0072010-10-07 16:46:10 -0700389
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700390 @Deprecated
391 public int linkNativeLibraryDirectory(String dataPath, String nativeLibPath32, int userId) {
392 return linkNativeLibraryDirectory(null, dataPath, nativeLibPath32, userId);
393 }
394
Kenny Rootddbe50d2012-09-06 13:18:37 -0700395 /**
Narayan Kamathff110bd2014-07-04 18:30:45 +0100396 * Links the 32 bit native library directory in an application's data directory to the
397 * real location for backward compatibility. Note that no such symlink is created for
398 * 64 bit shared libraries.
Kenny Rootddbe50d2012-09-06 13:18:37 -0700399 *
Kenny Rootddbe50d2012-09-06 13:18:37 -0700400 * @return -1 on error
401 */
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700402 public int linkNativeLibraryDirectory(String uuid, String dataPath, String nativeLibPath32,
403 int userId) {
Kenny Root6a6b0072010-10-07 16:46:10 -0700404 if (dataPath == null) {
Kenny Root9bbd70a2012-09-10 11:13:36 -0700405 Slog.e(TAG, "linkNativeLibraryDirectory dataPath is null");
Kenny Root6a6b0072010-10-07 16:46:10 -0700406 return -1;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100407 } else if (nativeLibPath32 == null) {
Kenny Root9bbd70a2012-09-10 11:13:36 -0700408 Slog.e(TAG, "linkNativeLibraryDirectory nativeLibPath is null");
Kenny Root6a6b0072010-10-07 16:46:10 -0700409 return -1;
410 }
411
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700412 StringBuilder builder = new StringBuilder("linklib");
413 builder.append(' ');
414 builder.append(escapeNull(uuid));
415 builder.append(' ');
Kenny Root6a6b0072010-10-07 16:46:10 -0700416 builder.append(dataPath);
417 builder.append(' ');
Narayan Kamathff110bd2014-07-04 18:30:45 +0100418 builder.append(nativeLibPath32);
Kenny Roota3e90792012-10-18 10:58:36 -0700419 builder.append(' ');
420 builder.append(userId);
Kenny Root6a6b0072010-10-07 16:46:10 -0700421
Narayan Kamath29564cd2014-08-07 10:57:40 +0100422 return mInstaller.execute(builder.toString());
Kenny Root6a6b0072010-10-07 16:46:10 -0700423 }
Robert Craig43853432014-03-04 11:57:23 -0500424
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700425 @Deprecated
Nick Kralevichce30fca852014-03-31 20:20:41 +0000426 public boolean restoreconData(String pkgName, String seinfo, int uid) {
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700427 return restoreconData(null, pkgName, seinfo, uid);
428 }
429
430 public boolean restoreconData(String uuid, String pkgName, String seinfo, int uid) {
Nick Kralevichce30fca852014-03-31 20:20:41 +0000431 StringBuilder builder = new StringBuilder("restorecondata");
432 builder.append(' ');
Jeff Sharkey790a4ec2015-04-09 13:18:44 -0700433 builder.append(escapeNull(uuid));
434 builder.append(' ');
Nick Kralevichce30fca852014-03-31 20:20:41 +0000435 builder.append(pkgName);
436 builder.append(' ');
437 builder.append(seinfo != null ? seinfo : "!");
438 builder.append(' ');
439 builder.append(uid);
Narayan Kamath29564cd2014-08-07 10:57:40 +0100440 return (mInstaller.execute(builder.toString()) == 0);
Robert Craig43853432014-03-04 11:57:23 -0500441 }
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100442
Fyodor Kupolovb94c1652015-03-03 12:25:30 -0800443 public int createOatDir(String oatDir, String dexInstructionSet) {
444 StringBuilder builder = new StringBuilder("createoatdir");
445 builder.append(' ');
446 builder.append(oatDir);
447 builder.append(' ');
448 builder.append(dexInstructionSet);
449 return mInstaller.execute(builder.toString());
450 }
451
Narayan Kamath6c4b9de2014-08-08 12:44:12 +0100452 /**
453 * Returns true iff. {@code instructionSet} is a valid instruction set.
454 */
455 private static boolean isValidInstructionSet(String instructionSet) {
456 if (instructionSet == null) {
457 return false;
458 }
459
460 for (String abi : Build.SUPPORTED_ABIS) {
461 if (instructionSet.equals(VMRuntime.getInstructionSet(abi))) {
462 return true;
463 }
464 }
465
466 return false;
467 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800468}