我们一般通过package后调用getPackageInfo就可以的导致合格包名的info,然后返回info.versionCode 就能得到versionCode
xref: /packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java
70 public static int getVersionCode(final Context context) {
71 try {
72 if (context == null) {
73 return 0;
74 }
75 final String packageName = context.getPackageName();
76 final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
77 return info.versionCode;
78 } catch (final NameNotFoundException e) {
79 Log.e(TAG, "Could not find version info.", e);
80 }
81 return 0;
82 }
我们来看看getPackageInfo的实现。
xref: /frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
2691 @Override
2692 public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
2693 if (!sUserManager.exists(userId)) return null;
2694 enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get package info");
2695 // reader
2696 synchronized (mPackages) {
2697 PackageParser.Package p = mPackages.get(packageName);
2698 if (DEBUG_PACKAGE_INFO)
2699 Log.v(TAG, "getPackageInfo " + packageName + ": " + p);
2700 if (p != null) {
2701 return generatePackageInfo(p, flags, userId);
2702 }
2703 if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
2704 return generatePackageInfoFromSettingsLPw(packageName, flags, userId);
2705 }
2706 }
2707 return null;
2708 }
2639行先判定这个userid是否存在。
2629行调用mPackages,根据包名拿到这个包的数据.
2700行一般不为NULL,因此返回generatePackageInfo
在来看看generatePackageInfo的实现
2643 PackageInfo generatePackageInfo(PackageParser.Package p, int flags, int userId) {
2644 if (!sUserManager.exists(userId)) return null;
2645 final PackageSetting ps = (PackageSetting) p.mExtras;
2646 if (ps == null) {
2647 return null;
2648 }
2649
2650 final PermissionsState permissionsState = ps.getPermissionsState();
2651
2652 final int[] gids = permissionsState.computeGids(userId);
2653 final Set<String> permissions = permissionsState.getPermissions(userId);
2654 final PackageUserState state = ps.readUserState(userId);
2655
2656 return PackageParser.generatePackageInfo(p, gids, flags,
2657 ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId);
2658 }
调用generatePackageInfo 返回PackageInfo 。如418行,原来我们在getPackageInfo中已经拿到PackageParser.Package 里面已经包含version code,但是类型不是PackageInfo ,顾最后调用generatePackageInfo 生成PackageInfo 返回给用户.
public static PackageInfo generatePackageInfo(PackageParser.Package p,
412 int gids[], int flags, long firstInstallTime, long lastUpdateTime,
413 Set<String> grantedPermissions, PackageUserState state, int userId) {
414
415 if (!checkUseInstalledOrHidden(flags, state)) {
416 return null;
417 }
418 PackageInfo pi = new PackageInfo();
419 pi.packageName = p.packageName;
420 pi.splitNames = p.splitNames;
421 pi.versionCode = p.mVersionCode;
422 pi.baseRevisionCode = p.baseRevisionCode;
423 pi.splitRevisionCodes = p.splitRevisionCodes;
xref: /packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java
70 public static int getVersionCode(final Context context) {
71 try {
72 if (context == null) {
73 return 0;
74 }
75 final String packageName = context.getPackageName();
76 final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
77 return info.versionCode;
78 } catch (final NameNotFoundException e) {
79 Log.e(TAG, "Could not find version info.", e);
80 }
81 return 0;
82 }
我们来看看getPackageInfo的实现。
xref: /frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
2691 @Override
2692 public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
2693 if (!sUserManager.exists(userId)) return null;
2694 enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get package info");
2695 // reader
2696 synchronized (mPackages) {
2697 PackageParser.Package p = mPackages.get(packageName);
2698 if (DEBUG_PACKAGE_INFO)
2699 Log.v(TAG, "getPackageInfo " + packageName + ": " + p);
2700 if (p != null) {
2701 return generatePackageInfo(p, flags, userId);
2702 }
2703 if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
2704 return generatePackageInfoFromSettingsLPw(packageName, flags, userId);
2705 }
2706 }
2707 return null;
2708 }
2639行先判定这个userid是否存在。
2629行调用mPackages,根据包名拿到这个包的数据.
2700行一般不为NULL,因此返回generatePackageInfo
在来看看generatePackageInfo的实现
2643 PackageInfo generatePackageInfo(PackageParser.Package p, int flags, int userId) {
2644 if (!sUserManager.exists(userId)) return null;
2645 final PackageSetting ps = (PackageSetting) p.mExtras;
2646 if (ps == null) {
2647 return null;
2648 }
2649
2650 final PermissionsState permissionsState = ps.getPermissionsState();
2651
2652 final int[] gids = permissionsState.computeGids(userId);
2653 final Set<String> permissions = permissionsState.getPermissions(userId);
2654 final PackageUserState state = ps.readUserState(userId);
2655
2656 return PackageParser.generatePackageInfo(p, gids, flags,
2657 ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId);
2658 }
调用generatePackageInfo 返回PackageInfo 。如418行,原来我们在getPackageInfo中已经拿到PackageParser.Package 里面已经包含version code,但是类型不是PackageInfo ,顾最后调用generatePackageInfo 生成PackageInfo 返回给用户.
public static PackageInfo generatePackageInfo(PackageParser.Package p,
412 int gids[], int flags, long firstInstallTime, long lastUpdateTime,
413 Set<String> grantedPermissions, PackageUserState state, int userId) {
414
415 if (!checkUseInstalledOrHidden(flags, state)) {
416 return null;
417 }
418 PackageInfo pi = new PackageInfo();
419 pi.packageName = p.packageName;
420 pi.splitNames = p.splitNames;
421 pi.versionCode = p.mVersionCode;
422 pi.baseRevisionCode = p.baseRevisionCode;
423 pi.splitRevisionCodes = p.splitRevisionCodes;