流程图

Apktool M smali转成java apk转化_android

第一步 解析apk:

使用cmd命令执行apktool对apk进行反编译操作获取对应的所有文件

cmd = java -jar {apktool路径} d {apk路径} -s -o {decode_apk_dir反编译存放资源文件内容的路径}

第二步 获取apk信息:

        在解压后的文件中 通过apktool.yml 获取对应的apk信息

        应用SDK信息 sdkInfo: minSdkVersion、targetSdkVersion

        应用版本信息 versionInfo: versionCode、versionName

        应用资源不压缩信息 doNotCompress

        应用包名 通过清单文件AndroidManifest.xml 获取package

第三步 获取资源id:

        构建public.txt 即应用资源id配置

将解析后的 res/values/public.xml 文件里的所有资源id按照下方格式组建成的资源文本配置

[packname包名]:[type资源类型]/[name 资源名称]=[id 资源赋予的唯一id值]

第四步 构建资源模块:

        由于googleplay政策要求 所有aab里的base主模块大小不能超过 150M 并提供了可以采用资源模块的方式进行资源分配。

        资源模块组成部分:

                     assets 资源目录  manifest清单配置目录  assets.pb 资源模块的组员信息文件

        

Apktool M smali转成java apk转化_python_02

        创建module目录

                 配置对应的清单文件 将其中的$applicationId和$padName 修改成对应的包名和资源模块名

                

Apktool M smali转成java apk转化_python_03

         通过正则判断将拷贝assets里的资源文件过大的文件到资源模块目录的assets

第五步 构建主模块base压缩包:

        1.采用aapt2将对应的资源构建成compiled_resources.zip 资源压缩文件

     

cmd = {aapt2 路径} complie -- legacy --dir {res_dir 解析后的资源目录} -o {complied_resources 输出路径}

        2.通过aapt2和android.jar 来将compiled_resources.zip和 AndroidManifest.xml 生成中间产物 base.apk

       

cmd= {aapt2 路径} link --proto-format -o {out_apk_path base.apk路径} -I {android android.jar路径} -- min-sdk-version {对应的apk信息min_sdk_version} --target-sdk-version {对应的apk信息target_sdk_version }  --version-code {对应的apk信息version_code}  --version-name  {对应的apk信息version_name} --manifest {对应的apk信息AndroidManifest.xml}  --auto-add-overlay

        3.通过zip命令解压base.apk 获取对应的资源目录

Apktool M smali转成java apk转化_xml_04

         4.并将对应需要的资源拷贝过去

                        拷贝base.apk解压后的AndroidManifest.xml 移动到manifest文件夹

                        拷贝最初解析后的apk目录里assets、lib、其他文件 unknow、kotlin、META-INF、dex、其他文件或文件夹 (注意事项:META-INF文件 注意先删除apk签名信息  其他文件或文件夹统一放在root文件夹中)

                        最终构建aab文件目录

Apktool M smali转成java apk转化_java_05

             5.通过zip命令 将最终aab文件目录压缩成base.zip文件

第六步 整理资源模块:   

        1.通过aapt2、android.jar 和AndroidManifest.xml 直接生成 资源模块包

cmd = {aapt2路径} link --proto-format -o {out_apk_path资源包路径} -I {android路径} -- manifest{资源模块里的AndroidManifest.xml} --auto-add-overlay

        2.通过zip命令解压资源包 获取对应的资源 

                AndroidManifest.xml 和 resources.pb

        3.创建最终压缩模块的资源文件夹

                拷贝解压资源部获得的AndroidManifest.xml到manifest文件夹

                构建asset.pd文件(待研究)

                        获取assets里的所有文件夹的路径地址

                        组成 {'path':'assets/子文件目录','targeting',{}} 数组

                        写入到asset.pd里

第七步 构建BundleConfig.db 应用资源压缩配置

                根据第二步获取的doNotCompress不压缩资源列表进行重新配置处理

第八步 构建aab   

       通过bundletool.jar工具执行命令行构建aab

cmd = "java -jar {bundletool.jar包资源路径} build-bundle --modules={主模块资源路径} --output={aab_path文件输出路径}  --config={bundle_config_json_path 第七步生成的资源压缩配置文件路径}"

第九步 将资源模块压缩进生成的aab中

                通过zip命令执行

第十步 最后对aab进行签名操作

                根据自己的签名信息配置 通过命令执行签名信息操作

cmd = '"%sjarsigner" -digestalg SHA1 -sigalg %s -keystore "%s" -storepass "%s" -keypass "%s" "%s" "%s" ' % (java环境路径,(签名类型),签名文件路径, password, aliaspwd, apkfile, alias)