前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

aapt2构建的apk反编译之后使用aapt编译资源解决方法

qiguaw 2024-11-01 13:04:25 资源文章 20 ℃ 0 评论

一、通常情况下aapt2构建的apk使用apktool反编译之后,需要再次使用appt2编译和连接资源生成R.java.

所以python打包工具我专门写了个函数:

def get_build_tool_version(apk_path):
    # 判断apk是aapt构建还是aapt2构建,是aapt构建的返回1,是aapt2构建的返回2
    with zipfile.ZipFile(apk_path, 'r') as apk_file:
        manifest_contents = apk_file.read('AndroidManifest.xml').decode('utf-8')
        match = re.search(r'android:versionName="\d+(?:\.\d+)*"\s+android:name="android\.support\.version"', manifest_contents)
        if match:
            version_string = str(match.group())
            if 'aapt2' in version_string:
                return 2
            elif 'aapt' in version_string:
                return 1
    # Default to aapt
    return 1


然后使用上面这个函数判断一个apk是何构建方式,选择不同方式【aapt、aapt2】构建资源出包。

如果aapt出不了aab包只能出apk包, 走v2签名 和对齐文件

如果是aapt2根据出包格式出对应的包,如果是aab只能V1签名,如果是apk是v2签名

二、那么回到主题:aapt2构建的apk反编译之后使用aapt可不可以正常编译出R.java呢

我做了一些尝试

aapt p -f -m -J F:\decode_apk_dir\gen -S F:\decode_apk_dir\res -I D:\pythonLeanHis\king\StangTools\base\android.jar -M F:\decode_apk_dir\AndroidManifest.xml

生成不了R.java.出现如下错误

res\drawable\$avd_hide_password__0.xml: Invalid file name: must contain only [a-z0-9_.]

res\drawable\$avd_hide_password__1.xml: Invalid file name: must contain only [a-z0-9_.]

res\drawable\$avd_hide_password__2.xml: Invalid file name: must contain only [a-z0-9_.]

res\drawable\$avd_show_password__0.xml: Invalid file name: must contain only [a-z0-9_.]

res\drawable\$avd_show_password__1.xml: Invalid file name: must contain only [a-z0-9_.]

res\drawable\$avd_show_password__2.xml: Invalid file name: must contain only [a-z0-9_.]

res\drawable\$ic_launcher_foreground__0.xml: Invalid file name: must contain only [a-z0-9_.]

然后把$ic_launcher_foreground__0.xml等相关的文件删除,把F:\decode_apk_dir\res\values的public.xml下面相关的资源都删除,再次执行

aapt p -f -m -J F:\decode_apk_dir\gen -S F:\decode_apk_dir\res -I D:\pythonLeanHis\king\StangTools\base\android.jar -M F:\decode_apk_dir\AndroidManifest.xml


还是各种错误,后来检查一下想起来会不会是aapt.exe版本太低的原因我aapt.exe是D:\sdk\build-tools\33.0.0里面复制过来的,apktool.jar版本是2.7.0.我把apktool.jar解压,然后把解压之后prebuilt里面复制对应平台的aapt.exe。复制到工具目录即可。再次运行指令这次一切正常了,不报错可以正常生成R.java了



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表