如何从apk中得到version code
16lz
2021-01-25
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 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
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 }
}
更多相关文章
- QT 环境的 Android(安卓)配置和编译
- android bluetooth----bluetoothClass.Service
- Android(安卓)更改键盘Enter键文字
- Android(安卓)Audio代码分析15 - testPlaybackHeadPositionAfter
- android studio错误: 常量字符串过长
- Android(安卓)Audio代码分析20 - queryEffects函数
- 【Android(安卓)开发教程】保存到内部存储设备
- [Android] Smali基本语法
- android listView EditText获取焦点