起因
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