Manifest中找不到versionCode?

2Tu發表於2019-03-01

起因

17年做的update(升級平臺)交由其它團隊維護後,發現解析Manifest後未找到versionCode、versionName資訊。
大家都講終極絕招,使用aapt來獲取,但是這樣耦合低,並且得在伺服器上維護Android環境,顯然不合理。所以要幹他
此文都是解決思路,心急直接看最後的結論

環境

  • Android Studio 3.0
  • Gradle 4.1
  • targetSdkVersion 26 minSdkVersion 8
  • apktool 2.3.1
  • AXMLPrinter2
  • APKParser

分析問題

apktool

第一想法,通過apktool反編譯檢視AndroidManifest中是否不存在version資訊。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tu.sample" platformBuildVersionCode="26" platformBuildVersionName="7.1.1">
複製程式碼

結果是不存在的,於是把懷疑指向是否google的鍋,Android Studio?Gradle?targetVersion?

Android Studio?

Android Studio 3.0 Canary 2: attribute `android:versionCode` not found
然後經過對比發現仍然不是這個問題,繼續搞

Gradle?targetVersion?

安裝在低版本的手機上仍然可以獲取,即使Google要改這個規則至少得相容舊版本。並且閱讀Android官方文件後也沒見有提及,所以這個原因也可以排除。見設定應用版本資訊
程式猿要開始懷疑人生了

Android Studio Analyze APK

無意間使用Analyze APK檢視了一下,資訊如下

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tu.sample"
    platformBuildVersionCode="26"
    platformBuildVersionName="7.1.1"
    android:versionCode="24400"
    android:versionName="2.4.4">
複製程式碼

艹尼瑪,居然是有的,因為官方解析,還是因為真的有?

Build目錄

檢視build/intermediates/manifests/full/debug和release下的AndroidManifest均與Analyze APK檢視的內容匹配。
開始懷疑自己

apktool?

再看apktool解析出來的內容,其中有一個檔案apktool.yml,簡要內容如下

!!brut.androlib.meta.MetaInfo
apkFileName: sample.apk
compressionType: false
doNotCompress:
- arsc
isFrameworkApk: false
packageInfo:
  forcedPackageId: `127`
  renameManifestPackage: null
sdkInfo:
  minSdkVersion: `8`
  targetSdkVersion: `26`
usesFramework:
  ids:
  - 1
  tag: null
version: 3.0.1
versionInfo:
  versionCode: `24400`
  versionName: 2.4.4
複製程式碼

居然也是有的,那麼是解析方式變了,還是Manifest中沒有?終極絕招讀原始碼,但是由於我只是抽空(好奇)支援一把,沒有時間耗(懶)。但總是舒了一口氣,不用再使用aapt這種方式來解決了。
回到我們自己的解析程式中來

AXMLPrinter2

update中採用AXMLPrinter2庫來解析。這個庫早已沒維護並衍生了很多其它版本,如APKParser
發現通過這個庫解析出來的Manifest是含有version資訊的,內容與Analyze APK一致。

結論

Manifest中仍然有版本資訊,規則不變。由於AXMLPrinter2解析庫問題導致。具體原因不分析,留給目前的團隊和有興趣的人解決。

參考

設定應用版本資訊
AXMLPrinter2
APKParser
Android Studio 3.0 Canary 2: attribute `android:versionCode` not found

轉載請標明出處:
http://2tu.github.io/2018/01/09/versionCode-not-exist-in-manifest/
本文出自Tu`s blog

相關文章