如何在activity中获得apk的versioncode呢?

我们一般通过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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值