-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
PackageUtils.java
799 lines (727 loc) · 30.2 KB
/
PackageUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
package cn.trinea.android.common.util;
import java.io.File;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import cn.trinea.android.common.util.ShellUtils.CommandResult;
/**
* PackageUtils
* <ul>
* <strong>Install package</strong>
* <li>{@link PackageUtils#installNormal(Context, String)}</li>
* <li>{@link PackageUtils#installSilent(Context, String)}</li>
* <li>{@link PackageUtils#install(Context, String)}</li>
* </ul>
* <ul>
* <strong>Uninstall package</strong>
* <li>{@link PackageUtils#uninstallNormal(Context, String)}</li>
* <li>{@link PackageUtils#uninstallSilent(Context, String)}</li>
* <li>{@link PackageUtils#uninstall(Context, String)}</li>
* </ul>
* <ul>
* <strong>Is system application</strong>
* <li>{@link PackageUtils#isSystemApplication(Context)}</li>
* <li>{@link PackageUtils#isSystemApplication(Context, String)}</li>
* <li>{@link PackageUtils#isSystemApplication(PackageManager, String)}</li>
* </ul>
* <ul>
* <strong>Others</strong>
* <li>{@link PackageUtils#getInstallLocation()} get system install location</li>
* <li>{@link PackageUtils#isTopActivity(Context, String)} whether the app whost package's name is packageName is on the
* top of the stack</li>
* <li>{@link PackageUtils#startInstalledAppDetails(Context, String)} start InstalledAppDetails Activity</li>
* </ul>
*
* @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-15
*/
public class PackageUtils {
public static final String TAG = "PackageUtils";
private PackageUtils() {
throw new AssertionError();
}
/**
* App installation location settings values, same to {@link #PackageHelper}
*/
public static final int APP_INSTALL_AUTO = 0;
public static final int APP_INSTALL_INTERNAL = 1;
public static final int APP_INSTALL_EXTERNAL = 2;
/**
* install according conditions
* <ul>
* <li>if system application or rooted, see {@link #installSilent(Context, String)}</li>
* <li>else see {@link #installNormal(Context, String)}</li>
* </ul>
*
* @param context
* @param filePath
* @return
*/
public static final int install(Context context, String filePath) {
if (PackageUtils.isSystemApplication(context) || ShellUtils.checkRootPermission()) {
return installSilent(context, filePath);
}
return installNormal(context, filePath) ? INSTALL_SUCCEEDED : INSTALL_FAILED_INVALID_URI;
}
/**
* install package normal by system intent
*
* @param context
* @param filePath file path of package
* @return whether apk exist
*/
public static boolean installNormal(Context context, String filePath) {
Intent i = new Intent(Intent.ACTION_VIEW);
File file = new File(filePath);
if (file == null || !file.exists() || !file.isFile() || file.length() <= 0) {
return false;
}
i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
return true;
}
/**
* install package silent by root
* <ul>
* <strong>Attentions:</strong>
* <li>Don't call this on the ui thread, it may costs some times.</li>
* <li>You should add <strong>android.permission.INSTALL_PACKAGES</strong> in manifest, so no need to request root
* permission, if you are system app.</li>
* <li>Default pm install params is "-r".</li>
* </ul>
*
* @param context
* @param filePath file path of package
* @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see
* {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_*
* @see #installSilent(Context, String, String)
*/
public static int installSilent(Context context, String filePath) {
return installSilent(context, filePath, " -r " + getInstallLocationParams());
}
/**
* install package silent by root
* <ul>
* <strong>Attentions:</strong>
* <li>Don't call this on the ui thread, it may costs some times.</li>
* <li>You should add <strong>android.permission.INSTALL_PACKAGES</strong> in manifest, so no need to request root
* permission, if you are system app.</li>
* </ul>
*
* @param context
* @param filePath file path of package
* @param pmParams pm install params
* @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see
* {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_*
*/
public static int installSilent(Context context, String filePath, String pmParams) {
if (filePath == null || filePath.length() == 0) {
return INSTALL_FAILED_INVALID_URI;
}
File file = new File(filePath);
if (file == null || file.length() <= 0 || !file.exists() || !file.isFile()) {
return INSTALL_FAILED_INVALID_URI;
}
/**
* if context is system app, don't need root permission, but should add <uses-permission
* android:name="android.permission.INSTALL_PACKAGES" /> in mainfest
**/
StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm install ")
.append(pmParams == null ? "" : pmParams).append(" ").append(filePath.replace(" ", "\\ "));
CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true);
if (commandResult.successMsg != null
&& (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) {
return INSTALL_SUCCEEDED;
}
Log.e(TAG,
new StringBuilder().append("installSilent successMsg:").append(commandResult.successMsg)
.append(", ErrorMsg:").append(commandResult.errorMsg).toString());
if (commandResult.errorMsg == null) {
return INSTALL_FAILED_OTHER;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_ALREADY_EXISTS")) {
return INSTALL_FAILED_ALREADY_EXISTS;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_APK")) {
return INSTALL_FAILED_INVALID_APK;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_URI")) {
return INSTALL_FAILED_INVALID_URI;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_INSUFFICIENT_STORAGE")) {
return INSTALL_FAILED_INSUFFICIENT_STORAGE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_DUPLICATE_PACKAGE")) {
return INSTALL_FAILED_DUPLICATE_PACKAGE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_NO_SHARED_USER")) {
return INSTALL_FAILED_NO_SHARED_USER;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_UPDATE_INCOMPATIBLE")) {
return INSTALL_FAILED_UPDATE_INCOMPATIBLE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE")) {
return INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_MISSING_SHARED_LIBRARY")) {
return INSTALL_FAILED_MISSING_SHARED_LIBRARY;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_REPLACE_COULDNT_DELETE")) {
return INSTALL_FAILED_REPLACE_COULDNT_DELETE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_DEXOPT")) {
return INSTALL_FAILED_DEXOPT;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_OLDER_SDK")) {
return INSTALL_FAILED_OLDER_SDK;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_CONFLICTING_PROVIDER")) {
return INSTALL_FAILED_CONFLICTING_PROVIDER;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_NEWER_SDK")) {
return INSTALL_FAILED_NEWER_SDK;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_TEST_ONLY")) {
return INSTALL_FAILED_TEST_ONLY;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_CPU_ABI_INCOMPATIBLE")) {
return INSTALL_FAILED_CPU_ABI_INCOMPATIBLE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_MISSING_FEATURE")) {
return INSTALL_FAILED_MISSING_FEATURE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_CONTAINER_ERROR")) {
return INSTALL_FAILED_CONTAINER_ERROR;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_INSTALL_LOCATION")) {
return INSTALL_FAILED_INVALID_INSTALL_LOCATION;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_MEDIA_UNAVAILABLE")) {
return INSTALL_FAILED_MEDIA_UNAVAILABLE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_VERIFICATION_TIMEOUT")) {
return INSTALL_FAILED_VERIFICATION_TIMEOUT;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_VERIFICATION_FAILURE")) {
return INSTALL_FAILED_VERIFICATION_FAILURE;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_PACKAGE_CHANGED")) {
return INSTALL_FAILED_PACKAGE_CHANGED;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_UID_CHANGED")) {
return INSTALL_FAILED_UID_CHANGED;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NOT_APK")) {
return INSTALL_PARSE_FAILED_NOT_APK;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_MANIFEST")) {
return INSTALL_PARSE_FAILED_BAD_MANIFEST;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION")) {
return INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES")) {
return INSTALL_PARSE_FAILED_NO_CERTIFICATES;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES")) {
return INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING")) {
return INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME")) {
return INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID")) {
return INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_MALFORMED")) {
return INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
}
if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_EMPTY")) {
return INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
}
if (commandResult.errorMsg.contains("INSTALL_FAILED_INTERNAL_ERROR")) {
return INSTALL_FAILED_INTERNAL_ERROR;
}
return INSTALL_FAILED_OTHER;
}
/**
* uninstall according conditions
* <ul>
* <li>if system application or rooted, see {@link #uninstallSilent(Context, String)}</li>
* <li>else see {@link #uninstallNormal(Context, String)}</li>
* </ul>
*
* @param context
* @param packageName package name of app
* @return whether package name is empty
* @return
*/
public static final int uninstall(Context context, String packageName) {
if (PackageUtils.isSystemApplication(context) || ShellUtils.checkRootPermission()) {
return uninstallSilent(context, packageName);
}
return uninstallNormal(context, packageName) ? DELETE_SUCCEEDED : DELETE_FAILED_INVALID_PACKAGE;
}
/**
* uninstall package normal by system intent
*
* @param context
* @param packageName package name of app
* @return whether package name is empty
*/
public static boolean uninstallNormal(Context context, String packageName) {
if (packageName == null || packageName.length() == 0) {
return false;
}
Intent i = new Intent(Intent.ACTION_DELETE, Uri.parse(new StringBuilder(32).append("package:")
.append(packageName).toString()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
return true;
}
/**
* uninstall package and clear data of app silent by root
*
* @param context
* @param packageName package name of app
* @return
* @see #uninstallSilent(Context, String, boolean)
*/
public static int uninstallSilent(Context context, String packageName) {
return uninstallSilent(context, packageName, true);
}
/**
* uninstall package silent by root
* <ul>
* <strong>Attentions:</strong>
* <li>Don't call this on the ui thread, it may costs some times.</li>
* <li>You should add <strong>android.permission.DELETE_PACKAGES</strong> in manifest, so no need to request root
* permission, if you are system app.</li>
* </ul>
*
* @param context file path of package
* @param packageName package name of app
* @param isKeepData whether keep the data and cache directories around after package removal
* @return <ul>
* <li>{@link #DELETE_SUCCEEDED} means uninstall success</li>
* <li>{@link #DELETE_FAILED_INTERNAL_ERROR} means internal error</li>
* <li>{@link #DELETE_FAILED_INVALID_PACKAGE} means package name error</li>
* <li>{@link #DELETE_FAILED_PERMISSION_DENIED} means permission denied</li>
*/
public static int uninstallSilent(Context context, String packageName, boolean isKeepData) {
if (packageName == null || packageName.length() == 0) {
return DELETE_FAILED_INVALID_PACKAGE;
}
/**
* if context is system app, don't need root permission, but should add <uses-permission
* android:name="android.permission.DELETE_PACKAGES" /> in mainfest
**/
StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm uninstall")
.append(isKeepData ? " -k " : " ").append(packageName.replace(" ", "\\ "));
CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true);
if (commandResult.successMsg != null
&& (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) {
return DELETE_SUCCEEDED;
}
Log.e(TAG,
new StringBuilder().append("uninstallSilent successMsg:").append(commandResult.successMsg)
.append(", ErrorMsg:").append(commandResult.errorMsg).toString());
if (commandResult.errorMsg == null) {
return DELETE_FAILED_INTERNAL_ERROR;
}
if (commandResult.errorMsg.contains("Permission denied")) {
return DELETE_FAILED_PERMISSION_DENIED;
}
return DELETE_FAILED_INTERNAL_ERROR;
}
/**
* whether context is system application
*
* @param context
* @return
*/
public static boolean isSystemApplication(Context context) {
if (context == null) {
return false;
}
return isSystemApplication(context, context.getPackageName());
}
/**
* whether packageName is system application
*
* @param context
* @param packageName
* @return
*/
public static boolean isSystemApplication(Context context, String packageName) {
if (context == null) {
return false;
}
return isSystemApplication(context.getPackageManager(), packageName);
}
/**
* whether packageName is system application
*
* @param packageManager
* @param packageName
* @return <ul>
* <li>if packageManager is null, return false</li>
* <li>if package name is null or is empty, return false</li>
* <li>if package name not exit, return false</li>
* <li>if package name exit, but not system app, return false</li>
* <li>else return true</li>
* </ul>
*/
public static boolean isSystemApplication(PackageManager packageManager, String packageName) {
if (packageManager == null || packageName == null || packageName.length() == 0) {
return false;
}
try {
ApplicationInfo app = packageManager.getApplicationInfo(packageName, 0);
return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return false;
}
/**
* whether the app whost package's name is packageName is on the top of the stack
* <ul>
* <strong>Attentions:</strong>
* <li>You should add <strong>android.permission.GET_TASKS</strong> in manifest</li>
* </ul>
*
* @param context
* @param packageName
* @return if params error or task stack is null, return null, otherwise retun whether the app is on the top of
* stack
*/
public static Boolean isTopActivity(Context context, String packageName) {
if (context == null || StringUtils.isEmpty(packageName)) {
return null;
}
ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(1);
if (ListUtils.isEmpty(tasksInfo)) {
return null;
}
try {
return packageName.equals(tasksInfo.get(0).topActivity.getPackageName());
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* get app version code
*
* @param context
* @return
*/
public static int getAppVersionCode(Context context) {
if (context != null) {
PackageManager pm = context.getPackageManager();
if (pm != null) {
PackageInfo pi;
try {
pi = pm.getPackageInfo(context.getPackageName(), 0);
if (pi != null) {
return pi.versionCode;
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
}
return -1;
}
/**
* get system install location<br/>
* can be set by System Menu Setting->Storage->Prefered install location
*
* @return
* @see {@link IPackageManager#getInstallLocation()}
*/
public static int getInstallLocation() {
CommandResult commandResult = ShellUtils.execCommand(
"LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm get-install-location", false, true);
if (commandResult.result == 0 && commandResult.successMsg != null && commandResult.successMsg.length() > 0) {
try {
int location = Integer.parseInt(commandResult.successMsg.substring(0, 1));
switch (location) {
case APP_INSTALL_INTERNAL:
return APP_INSTALL_INTERNAL;
case APP_INSTALL_EXTERNAL:
return APP_INSTALL_EXTERNAL;
}
} catch (NumberFormatException e) {
e.printStackTrace();
Log.e(TAG, "pm get-install-location error");
}
}
return APP_INSTALL_AUTO;
}
/**
* get params for pm install location
*
* @return
*/
private static String getInstallLocationParams() {
int location = getInstallLocation();
switch (location) {
case APP_INSTALL_INTERNAL:
return "-f";
case APP_INSTALL_EXTERNAL:
return "-s";
}
return "";
}
/**
* start InstalledAppDetails Activity
*
* @param context
* @param packageName
*/
public static void startInstalledAppDetails(Context context, String packageName) {
Intent intent = new Intent();
int sdkVersion = Build.VERSION.SDK_INT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", packageName, null));
} else {
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
intent.putExtra((sdkVersion == Build.VERSION_CODES.FROYO ? "pkg"
: "com.android.settings.ApplicationPkgName"), packageName);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
* Installation return code<br/>
* install success.
*/
public static final int INSTALL_SUCCEEDED = 1;
/**
* Installation return code<br/>
* the package is already installed.
*/
public static final int INSTALL_FAILED_ALREADY_EXISTS = -1;
/**
* Installation return code<br/>
* the package archive file is invalid.
*/
public static final int INSTALL_FAILED_INVALID_APK = -2;
/**
* Installation return code<br/>
* the URI passed in is invalid.
*/
public static final int INSTALL_FAILED_INVALID_URI = -3;
/**
* Installation return code<br/>
* the package manager service found that the device didn't have enough storage space to install the app.
*/
public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4;
/**
* Installation return code<br/>
* a package is already installed with the same name.
*/
public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5;
/**
* Installation return code<br/>
* the requested shared user does not exist.
*/
public static final int INSTALL_FAILED_NO_SHARED_USER = -6;
/**
* Installation return code<br/>
* a previously installed package of the same name has a different signature than the new package (and the old
* package's data was not removed).
*/
public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7;
/**
* Installation return code<br/>
* the new package is requested a shared user which is already installed on the device and does not have matching
* signature.
*/
public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8;
/**
* Installation return code<br/>
* the new package uses a shared library that is not available.
*/
public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9;
/**
* Installation return code<br/>
* the new package uses a shared library that is not available.
*/
public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10;
/**
* Installation return code<br/>
* the new package failed while optimizing and validating its dex files, either because there was not enough storage
* or the validation failed.
*/
public static final int INSTALL_FAILED_DEXOPT = -11;
/**
* Installation return code<br/>
* the new package failed because the current SDK version is older than that required by the package.
*/
public static final int INSTALL_FAILED_OLDER_SDK = -12;
/**
* Installation return code<br/>
* the new package failed because it contains a content provider with the same authority as a provider already
* installed in the system.
*/
public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13;
/**
* Installation return code<br/>
* the new package failed because the current SDK version is newer than that required by the package.
*/
public static final int INSTALL_FAILED_NEWER_SDK = -14;
/**
* Installation return code<br/>
* the new package failed because it has specified that it is a test-only package and the caller has not supplied
* the {@link #INSTALL_ALLOW_TEST} flag.
*/
public static final int INSTALL_FAILED_TEST_ONLY = -15;
/**
* Installation return code<br/>
* the package being installed contains native code, but none that is compatible with the the device's CPU_ABI.
*/
public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16;
/**
* Installation return code<br/>
* the new package uses a feature that is not available.
*/
public static final int INSTALL_FAILED_MISSING_FEATURE = -17;
/**
* Installation return code<br/>
* a secure container mount point couldn't be accessed on external media.
*/
public static final int INSTALL_FAILED_CONTAINER_ERROR = -18;
/**
* Installation return code<br/>
* the new package couldn't be installed in the specified install location.
*/
public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19;
/**
* Installation return code<br/>
* the new package couldn't be installed in the specified install location because the media is not available.
*/
public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20;
/**
* Installation return code<br/>
* the new package couldn't be installed because the verification timed out.
*/
public static final int INSTALL_FAILED_VERIFICATION_TIMEOUT = -21;
/**
* Installation return code<br/>
* the new package couldn't be installed because the verification did not succeed.
*/
public static final int INSTALL_FAILED_VERIFICATION_FAILURE = -22;
/**
* Installation return code<br/>
* the package changed from what the calling program expected.
*/
public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23;
/**
* Installation return code<br/>
* the new package is assigned a different UID than it previously held.
*/
public static final int INSTALL_FAILED_UID_CHANGED = -24;
/**
* Installation return code<br/>
* if the parser was given a path that is not a file, or does not end with the expected '.apk' extension.
*/
public static final int INSTALL_PARSE_FAILED_NOT_APK = -100;
/**
* Installation return code<br/>
* if the parser was unable to retrieve the AndroidManifest.xml file.
*/
public static final int INSTALL_PARSE_FAILED_BAD_MANIFEST = -101;
/**
* Installation return code<br/>
* if the parser encountered an unexpected exception.
*/
public static final int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102;
/**
* Installation return code<br/>
* if the parser did not find any certificates in the .apk.
*/
public static final int INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103;
/**
* Installation return code<br/>
* if the parser found inconsistent certificates on the files in the .apk.
*/
public static final int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104;
/**
* Installation return code<br/>
* if the parser encountered a CertificateEncodingException in one of the files in the .apk.
*/
public static final int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105;
/**
* Installation return code<br/>
* if the parser encountered a bad or missing package name in the manifest.
*/
public static final int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106;
/**
* Installation return code<br/>
* if the parser encountered a bad shared user id name in the manifest.
*/
public static final int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107;
/**
* Installation return code<br/>
* if the parser encountered some structural problem in the manifest.
*/
public static final int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108;
/**
* Installation return code<br/>
* if the parser did not find any actionable tags (instrumentation or application) in the manifest.
*/
public static final int INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109;
/**
* Installation return code<br/>
* if the system failed to install the package because of system issues.
*/
public static final int INSTALL_FAILED_INTERNAL_ERROR = -110;
/**
* Installation return code<br/>
* other reason
*/
public static final int INSTALL_FAILED_OTHER = -1000000;
/**
* Uninstall return code<br/>
* uninstall success.
*/
public static final int DELETE_SUCCEEDED = 1;
/**
* Uninstall return code<br/>
* uninstall fail if the system failed to delete the package for an unspecified reason.
*/
public static final int DELETE_FAILED_INTERNAL_ERROR = -1;
/**
* Uninstall return code<br/>
* uninstall fail if the system failed to delete the package because it is the active DevicePolicy manager.
*/
public static final int DELETE_FAILED_DEVICE_POLICY_MANAGER = -2;
/**
* Uninstall return code<br/>
* uninstall fail if pcakge name is invalid
*/
public static final int DELETE_FAILED_INVALID_PACKAGE = -3;
/**
* Uninstall return code<br/>
* uninstall fail if permission denied
*/
public static final int DELETE_FAILED_PERMISSION_DENIED = -4;
}