Android中用Package 这个类来代表一个apk。
final Package pkg = parseBaseApk(baseApk, assets, flags);
我们Package 是由parseBaseApk 来赋值的,我们看看parseBaseApk是如何得到version code
可以看到1389行的实现com.android.internal.R.styleable.AndroidManifest_versionCode
原来version code是R文件中的一个常量
String[] outError) throws XmlPullParserException, IOException {
1356 final boolean trustedOverlay = (flags & PARSE_TRUSTED_OVERLAY) != 0;
1357
1358 AttributeSet attrs = parser;
1359
1360 mParseInstrumentationArgs = null;
1361 mParseActivityArgs = null;
1362 mParseServiceArgs = null;
1363 mParseProviderArgs = null;
1364
1365 final String pkgName;
1366 final String splitName;
1367 try {
1368 Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs, flags);
1369 pkgName = packageSplit.first;
1370 splitName = packageSplit.second;
1371 } catch (PackageParserException e) {
1372 mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
1373 return null;
1374 }
1375
1376 int type;
1377
1378 if (!TextUtils.isEmpty(splitName)) {
1379 outError[0] = "Expected base APK, but found split " + splitName;
1380 mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
1381 return null;
1382 }
1383
1384 final Package pkg = new Package(pkgName);
1385 boolean foundApp = false;
1386
1387 TypedArray sa = res.obtainAttributes(attrs,
1388 com.android.internal.R.styleable.AndroidManifest);
1389 pkg.mVersionCode = pkg.applicationInfo.versionCode = sa.getInteger(
1390 com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
1391 pkg.baseRevisionCode = sa.getInteger(
1392 com.android.internal.R.styleable.AndroidManifest_revisionCode, 0);
1393 pkg.mVersionName = sa.getNonConfigurationString(
1394 com.android.internal.R.styleable.AndroidManifest_versionName, 0);
1395 if (pkg.mVersionName != null) {
1396 pkg.mVersionName = pkg.mVersionName.intern();
1397 }
}
final Package pkg = parseBaseApk(baseApk, assets, flags);
我们Package 是由parseBaseApk 来赋值的,我们看看parseBaseApk是如何得到version code
可以看到1389行的实现com.android.internal.R.styleable.AndroidManifest_versionCode
原来version code是R文件中的一个常量
String[] outError) throws XmlPullParserException, IOException {
1356 final boolean trustedOverlay = (flags & PARSE_TRUSTED_OVERLAY) != 0;
1357
1358 AttributeSet attrs = parser;
1359
1360 mParseInstrumentationArgs = null;
1361 mParseActivityArgs = null;
1362 mParseServiceArgs = null;
1363 mParseProviderArgs = null;
1364
1365 final String pkgName;
1366 final String splitName;
1367 try {
1368 Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs, flags);
1369 pkgName = packageSplit.first;
1370 splitName = packageSplit.second;
1371 } catch (PackageParserException e) {
1372 mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
1373 return null;
1374 }
1375
1376 int type;
1377
1378 if (!TextUtils.isEmpty(splitName)) {
1379 outError[0] = "Expected base APK, but found split " + splitName;
1380 mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
1381 return null;
1382 }
1383
1384 final Package pkg = new Package(pkgName);
1385 boolean foundApp = false;
1386
1387 TypedArray sa = res.obtainAttributes(attrs,
1388 com.android.internal.R.styleable.AndroidManifest);
1389 pkg.mVersionCode = pkg.applicationInfo.versionCode = sa.getInteger(
1390 com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
1391 pkg.baseRevisionCode = sa.getInteger(
1392 com.android.internal.R.styleable.AndroidManifest_revisionCode, 0);
1393 pkg.mVersionName = sa.getNonConfigurationString(
1394 com.android.internal.R.styleable.AndroidManifest_versionName, 0);
1395 if (pkg.mVersionName != null) {
1396 pkg.mVersionName = pkg.mVersionName.intern();
1397 }
}