本文主要是讲述资源混淆组件的用法以及性能,资源混淆组件不涉及编译过程,只需输入一个apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的apk(若在配置文件中输入签名信息,可自动重签名并对齐,得到可直接发布的apk)以及对应资源ID的mapping文件。同时可在配置文件中指定白名单,压缩文件(支持*,?通配符),支持自动签名,保持旧mapping,7z重打包,对齐等功能。本工具支持Linux、Window跨平台使用,但测试表示若使用7z压缩,Linux下的压缩率更高。
1.怎么使用混淆工具
我们先看看它的help描述,最简单的使用方式是:java-jarandresguard.jarinput.apk,此时会读取运行路径中的config.xml文件,并将结果输出到运行路径中的input(输入apk的名称)中。当然你也可以自己定义:
-config,指定具体config文件的路径;
-out,指定具体的输出路径;混淆的mapping会在输出文件夹中以resource_mapping_input(输入apk的名称).txt命名。
-signature,指定签名信息,若在命令行设置会覆盖config.xml中的签名信息,顺序为签名文件路径、storepass、keypass、storealias。
-mapping,指定旧的mapping文件,保证同一资源文件在不同版本混淆后的名称保持一致。若在命令行设置会覆盖config.xml中的信息。
-7zip,指定7zip的路径,若已添加到环境变量不需要设置。应是全路径例如linux:/shwenzhang/tool/7za,Window需要加上.exe结尾。
linux:sudoapt-getinstallp7zip-full
mac:sudobrewinstallp7zip
-zipalign,指定zipalign的路径,若已添加到环境变量不需要设置。应是全路径例如linux:/shwenzhang/sdk/tools/zipalign,Window需要加上.exe结尾。
-repackage,如果想要出渠道包等需求,我们可能希望利用7zip直接重打包安装包。
2.简单用法
java-jarandresguard.jarinput.apk若想指定配置文件或输出目录:
java-jarandresguard.jarinput.apk-configyourconfig.xml-outoutput_directory若想指定签名信息或mapping信息:
java-jarandresguard.jarinput.apk-configyourconfig.xml-outoutput_directory-signaturesignature_file_pathstorepass_valuekeypass_valuestorealias_value-mappingmapping_file_path若想指定7zip或zipalign的路径(若已设置环境变量,这两项不需要单独设置):
java-jarandresguard.jarinput.apk-7zip/shwenzhang/tool/7za-zipalign/shwenzhang/sdk/tools/zipalign若想用7zip重打包安装包,同时也可指定output路径,指定7zip或zipalign的路径(此模式其他参数都不支持):
配置文件中主要有五大项,即property,whitelist,keepmapping,compress,sign。
1.Property项
Property主要设置一些通用属性:
--sevenzip,是否使用7z重新压缩签名后的apk包(这步一定要放在签名后,不然签名时会破坏效果),需要我们安装7z命令行,同时加入环境变量中,同时要求输入签名信息(不然不会使用)。
Linux:可直接sudoapt-getinstallp7zip-full。
注意:效果很好,推荐使用,并且在Linux(Mac的高富帅也可)上。
--metaname,由于重打包时需要删除签名信息,考虑到这个文件名可能会被改变,所以使用者可手动输入签名信息对应的文件名。默认为META_INF。
--keeproot,是否将res/drawable混淆成r/s
2.Whitelist项
Whitelist主要是用来设置白名单,由于我们代码中某些资源会通过getIdentifier(需要全局搜索所有用法并添加到白名单)或动态加载等方式,我们并不希望混淆这部分的资源ID:
--isactive,是否打开白名单功能;
--path,是白名单的项,格式为package_name.R.type.specname,由于一个resources.arsc中可能会有多个包,所以这里要求写全包名。同时支持,?通配符,例如:com.tencent.mm.R.drawable.emoji_、com.tencent.mm.R.drawable.emoji_?;
注意:1.不能写成com.tencent.mm.R.drawable.emoji.png,即带文件后缀名;2.通配符代表.+,即a,不能匹配到a;
3.Keepmapping项
Keepmapping主要用来指定旧的mapping文件,为了保持一致性,我们支持输入旧的mapping文件,可保证同一资源文件在不同版本混淆后的名称保持一致。另一方面由于我们需要支持增量下载方式,如果每次改动都导致所有文件名都会更改,这会导致增量文件增大,但测试证明影响并不大(后面有测试数据)。
--isactive,是否打开keepmapping模式;
--path,是旧mapping文件的位置,linux用/,window用\;
4.Compress项
Compress主要用来指定文件重打包时是否压缩指定文件,默认我们重打包时是保持输入apk每个文件的压缩方式(即Stored或者Deflate)。一般来说,1、在2.3版本以下源文件大于1M不能压缩;2、流媒体不能压缩。对于.png、.jpg是可以压缩的,只是AssetManger读取时候的方式不同。
--isactive,是否打开compress模式;
--path,是需要被压缩文件的相对路径(相对于apk最顶层的位置),这里明确一定要使用‘/’作为分隔符,同时支持通配符,?,例如.png(压缩所有.png文件),res/drawable/emjio_.png,resouces.arsc(压缩resources.arsc)
注意若想得到最大混淆:
5.Sign项
--isactive,是否打开签名功能;
--path,是签名文件的位置,linux用/,window用\;
--storepass,是storepass的数值;
--keypass,是keypass的数值;
--alias,是alias的数值;
注意:若出于保密不想写在config.xml,可用-signature命令行设置模式。config.xml中的签名信息会被命令行覆盖。
1.基本的耗时与效果
2.compres参数(下文有详细描述,是否压缩某些资源)对安装包大小的影响
若指定compess参数.png、.gif以及*.jpg,resources.arsc对安装包大小影响如下:
但是resources.arsc如果原文件大于1M,压缩后是不能在系统2.3以下运行的。
3.操作系统对7z的影响
所以最后出包请使用Linux(Mac亦可),具体原因应该与文件系统有关。
4.keepmapping方式(下文有详细描述,是否保持旧的mapping)对增量包大小的影响
事实上,它们的差分是不需要371kb,因为有比较大的文件格式,共同标记部分。
分别用安装包b、c对安装包a生成增量文件d,e。比较增量文件d、e的大小,分别如下:
所以增量文件的大小并不是我们采用keepmapping方式的主要考虑因素,保持混淆的一致性,便于查找问题或是更加重要的考虑。