天天看點

Apktool rebuild失敗:No resource found that matches the given name

Trouble現象

1.使用apktool d指令将已有apk進行反編譯→正常;

2.使用apktool b指令将反編譯後的檔案重新編回apk→異常:

I: Using Apktool 2.2.2
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building resources...
W: /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/res/values-v23/styles.xml:3: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/DialogWindowTitle'.
W: 
W: /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/res/values-v23/styles.xml:4: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/AlertDialog'.
W: 
Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [/var/folders/kz/sl5jjbvj7mb4qx9r7xlnx728bz6cp6/T/brut_util_Jar_6643593175078773050.tmp, p, --forced-package-id, 127, --min-sdk-version, 15, --target-sdk-version, 24, --version-code, 15, --version-name, 0.1.4, --no-version-vectors, -F, /var/folders/kz/sl5jjbvj7mb4qx9r7xlnx728bz6cp6/T/APKTOOL2395147760136189345.tmp, -0, arsc, -0, acb, -0, txt, -0, assets/bin/Data/PlayerConnectionConfigFile, -0, arsc, -I, /Users/shijie.wei/Library/apktool/framework/1.apk, -S, /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/res, -M, /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/AndroidManifest.xml]
	at brut.androlib.Androlib.buildResourcesFull(Androlib.java:477)
	at brut.androlib.Androlib.buildResources(Androlib.java:411)
	at brut.androlib.Androlib.build(Androlib.java:310)
	at brut.androlib.Androlib.build(Androlib.java:263)
	at brut.apktool.Main.cmdBuild(Main.java:227)
	at brut.apktool.Main.main(Main.java:84)
Caused by: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [/var/folders/kz/sl5jjbvj7mb4qx9r7xlnx728bz6cp6/T/brut_util_Jar_6643593175078773050.tmp, p, --forced-package-id, 127, --min-sdk-version, 15, --target-sdk-version, 24, --version-code, 15, --version-name, 0.1.4, --no-version-vectors, -F, /var/folders/kz/sl5jjbvj7mb4qx9r7xlnx728bz6cp6/T/APKTOOL2395147760136189345.tmp, -0, arsc, -0, acb, -0, txt, -0, assets/bin/Data/PlayerConnectionConfigFile, -0, arsc, -I, /Users/shijie.wei/Library/apktool/framework/1.apk, -S, /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/res, -M, /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/AndroidManifest.xml]
	at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:440)
	at brut.androlib.Androlib.buildResourcesFull(Androlib.java:463)
	... 5 more
Caused by: brut.common.BrutException: could not exec (exit code = 1): [/var/folders/kz/sl5jjbvj7mb4qx9r7xlnx728bz6cp6/T/brut_util_Jar_6643593175078773050.tmp, p, --forced-package-id, 127, --min-sdk-version, 15, --target-sdk-version, 24, --version-code, 15, --version-name, 0.1.4, --no-version-vectors, -F, /var/folders/kz/sl5jjbvj7mb4qx9r7xlnx728bz6cp6/T/APKTOOL2395147760136189345.tmp, -0, arsc, -0, acb, -0, txt, -0, assets/bin/Data/PlayerConnectionConfigFile, -0, arsc, -I, /Users/shijie.wei/Library/apktool/framework/1.apk, -S, /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/res, -M, /Users/shijie.wei/Downloads/base_858_33000016_0.1.4_15/AndroidManifest.xml]
	at brut.util.OS.exec(OS.java:95)
	at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:434)
	... 6 more
           

問題來了,【error: Error retrieving parent for item: No resource found that matches the given name '@android:style/DialogWindowTitle'.】

問題分析

我使用的apk并沒有做加密處理,是以按理說使用apktool進行反編譯和回編譯不應該失敗。那這個錯誤就應該有其原因和對應的解決方法。

一般情況下,此時更新最新的apktool.jar就可以解決問題,但有時單純更新apktool也不行。無論如何,引起錯誤的原因究竟是什麼?其實問題不在apktool,而是framework太舊了!如果你隻是更新了apktool.jar,而沒有更新framework,這時候很有可能還會遇到最初的問題。

更新apktool的正确方法

在更新了apktool.jar後,需要手動更新framework,方法很簡單,删除 ~/Library/apktool/framework/1.apk 即可,這是MacOS下的預設路徑,如果你不知道自己的framework路徑,就去運作一遍apktool d指令,指令行中會顯示使用的framework路徑:

apktool d:
I: Using Apktool 2.2.0 on base_858_33000016_0.1.4_15.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/jackie/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
           

當你下次運作apktool時,會自動安裝對應的framework,這樣一來就算完全更新了apktool。

framework

這是使用apktool不可或缺的,一般來說系統會自動安裝,然而有些手機廠商(比如htc,三星)會定制自己的framework并在自己的某些系統應用中使用這些檔案,當你需要反編譯這些檔案時就會遇到找不到資源的錯誤,此時需要手動安裝這些裝置自帶的framework,一般都是以framework-res.apk的之類的名字存在于裝置的system/framework檔案加下,拷貝到電腦中進行安裝即可。

關于更多apktool和framework的資訊,可以檢視官方文檔:Apktool

還有一篇博文也提到了部分知識:Apktool使用心得