一句话总结:使用参数“ -keepdirectories 资源路径 ”的方式来进行修复。

注:资源路径 是个路径,中间必须以"/" 连接,而不是".",例如com/pack/pathA/pathB/Res。另外路径支持通配符 " * "。

注2:如果需要加载的资源是class,注意在混淆功能的keep相关参数中加入该资源,因为不加入的话该class也会被混淆,混淆后名称被改变自然加载不到

注3:请保证原始代码正常可用后再测试,如果原始代码本身就加载不到那混淆后更加载不到,我就在测试中修改代码时被坑了。建议生成混淆前/混淆后两个版本进行对比测试

. 我个人建议在写资源路径的时候以“**存放资源文件的目录**”的方式来进行修复,例如路径为com.pack.pathA.pathB.Res,那参数就写成 “ -keepdirectories **pathB** ”。这样写着更简单,可以前后通配到路径。
. 根据gitlab和其他搜索到的资料来看,proguard在处理文件的时候会将“目录移除”(?没懂,大概是会移除打包时候保存的目录信息之类的玩意,不是说把目录本身直接删除)。导致运行时候找不到该路径(信息都没有了就找不到了),该问题尤其出现在依赖路径进行资源加载的getResource()等方法中。因此需要使用-keepdirectories参数来指定相关资源路径,保护其不被删除。
. 额外补充一句,该参数也始用于类似getResource的参数为路径,需要进行路径下的资源文件遍历加载的情况。网上有的资料提到该处的解决方法是直接将资源文件名补全(即参数path补充为path/Res)。实际上根据代码的不同有时候会造成些问题(例如我测试时候人家代码逻辑就是处理目录的,写个资源名进去各种失败)。此处的官方解决办法就是-keepdirectories。

=================================================================
新的更新:测试发现proguard混淆后createObject方法也是会失败的,需要采用类似的方法处理。
我的方法是:检测该方法中传入的地址,将该地址放置在-keep,allowshrinking参数后即可解决

邪门歪道:我自己研究出的邪门歪道,因为我发现在java中,凡是以字符串传参形式访问的资源,在默认配置下都大概率出问题,因此需要从根源上解决问题,所以我的办法就是,在源码中全局搜索“"com.”(一个双引号+com.)开头的字符串,这样基本能定位到90%的字符串资源访问请求(自己写的路径拼接就没办法,得手工找),把找到的所有请求全部放进-keep,allowshrinking参数和-keepdirectories参数后就ok了