找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3949|回复: 0

【Android】解决修改arsc同名文件导致apktool反编译失败

[复制链接]
发表于 2015-12-27 15:12:47 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
有些软件,会修改apk的resources.arsc文件,做成同名资源,导致apktool出现崩溃:
Exception in thread "main" brut.androlib.AndrolibException: Multiple res specs: drawable/
  at brut.androlib.res.data.ResTypeSpec.addResSpec(ResTypeSpec.java:78)
  at brut.androlib.res.decoder.ARSCDecoder.readEntry(ARSCDecoder.java:248)
  at brut.androlib.res.decoder.ARSCDecoder.readTableType(ARSCDecoder.java:212)
  at brut.androlib.res.decoder.ARSCDecoder.readTableTypeSpec(ARSCDecoder.java:154)
  at brut.androlib.res.decoder.ARSCDecoder.readTablePackage(ARSCDecoder.java:116)
  at brut.androlib.res.decoder.ARSCDecoder.readTableHeader(ARSCDecoder.java:78)
  at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:47)
  at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:544)
  at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:63)
  at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:55)
  at brut.androlib.Androlib.getResTable(Androlib.java:66)
  at brut.androlib.ApkDecoder.setTargetSdkVersion(ApkDecoder.java:198)
  at brut.androlib.ApkDecoder.decode(ApkDecoder.java:96)
  at brut.apktool.Main.cmdDecode(Main.java:165)
  at brut.apktool.Main.main(Main.java:81)

为了解决这个问题,就要修改apktool,编译过程如上一篇帖子所述http://www.0xaa55.com/thread-1659-1-1.html
发生异常后,程序断在:

  1.     public void addResSpec(ResResSpec spec) throws AndrolibException {
  2.         if (mResSpecs.put(spec.getName(), spec) != true) {
  3.             throw new AndrolibException(String.format(
  4.                     "Multiple res specs: %s/%s", getName(), spec.getName()));
  5.         }
  6.     }
  7. //ResType.java
  8. package brut.androlib.res.data;

  9. import brut.androlib.AndrolibException;
  10. import brut.androlib.err.UndefinedResObject;
  11. import java.util.*;

  12. /**
  13. * @author Ryszard Wiśniewski <[email]brut.alll@gmail.com[/email]>
  14. */
  15. public final class ResType {
  16.     private final String mName;
  17.     private final Map<String, ResResSpec> mResSpecs = new LinkedHashMap<String, ResResSpec>();

  18.     private final ResTable mResTable;
  19.     private final ResPackage mPackage;

  20.     public ResType(String name, ResTable resTable, ResPackage package_) {
  21.         this.mName = name;
  22.         this.mResTable = resTable;
  23.         this.mPackage = package_;
  24.     }

  25.     public String getName() {
  26.         return mName;
  27.     }

  28.     public boolean isString() {
  29.         return mName.equalsIgnoreCase("string");
  30.     }

  31.     public Set<ResResSpec> listResSpecs() {
  32.         return new LinkedHashSet<ResResSpec>(mResSpecs.values());
  33.     }

  34.     public ResResSpec getResSpec(String name) throws AndrolibException {
  35.         ResResSpec spec = mResSpecs.get(name);
  36.         if (spec == null) {
  37.             throw new UndefinedResObject(String.format("resource spec: %s/%s",
  38.                     getName(), name));
  39.         }
  40.         return spec;
  41.     }

  42.     public void addResSpec(ResResSpec spec) throws AndrolibException {
  43.         if (mResSpecs.put(spec.getName(), spec) != null) {
  44.             throw new AndrolibException(String.format(
  45.                     "Multiple res specs: %s/%s", getName(), spec.getName()));
  46.         }
  47.     }

  48.     @Override
  49.     public String toString() {
  50.         return mName;
  51.     }
复制代码

可以发现mResSpecs是map结构的,键值一一对应,所以对方如果在arsc中放了2个同名资源的话,apktool不会继续处理
那么比较好的方法是将mResSpecs做成multimap结构,因此改动如下:

  1. package brut.androlib.res.data;

  2. import com.google.common.collect.HashMultimap;

  3. import brut.androlib.AndrolibException;
  4. import brut.androlib.err.UndefinedResObject;
  5. import java.util.*;

  6. /**
  7. * @author Ryszard Wiśniewski <[email]brut.alll@gmail.com[/email]>
  8. */
  9. public final class ResType {
  10.     private final String mName;
  11.     //private final Map<String, ResResSpec> mResSpecs = new LinkedHashMap<String, ResResSpec>();
  12.     private static HashMultimap<String,ResResSpec> mResSpecs = null;
  13.     private final ResTable mResTable;
  14.     private final ResPackage mPackage;

  15.     public ResType(String name, ResTable resTable, ResPackage package_) {
  16.         this.mName = name;
  17.         this.mResTable = resTable;
  18.         this.mPackage = package_;
  19.         mResSpecs = HashMultimap.create();
  20.     }

  21.     public String getName() {
  22.         return mName;
  23.     }

  24.     public boolean isString() {
  25.         return mName.equalsIgnoreCase("string");
  26.     }

  27.     public Set<ResResSpec> listResSpecs() {
  28.         return new LinkedHashSet<ResResSpec>(mResSpecs.values());
  29.     }

  30.     public ResResSpec getResSpec(String name) throws AndrolibException {
  31.         //ResResSpec spec = mResSpecs.get(name);
  32.         Set<ResResSpec> spec = mResSpecs.get(name);
  33.         if (spec.size() == 0) {
  34.             throw new UndefinedResObject(String.format("resource spec: %s/%s",
  35.                     getName(), name));
  36.         }
  37.         //return spec;
  38.         return spec.iterator().next();
  39.     }

  40.     public void addResSpec(ResResSpec spec) throws AndrolibException {
  41.         //if (mResSpecs.put(spec.getName(), spec) != null) {
  42.         if (mResSpecs.put(spec.getName(), spec) != true) {
  43.             throw new AndrolibException(String.format(
  44.                     "Multiple res specs: %s/%s", getName(), spec.getName()));
  45.         }
  46.     }

  47.     @Override
  48.     public String toString() {
  49.         return mName;
  50.     }
  51. }
复制代码


在android studio中调试成功解密出文件
之后替换 安卓改之理 中的apktool,完美恢复!
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 20:51 , Processed in 0.037707 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表