笔者最近遇到了一个混淆问题:把我们项目的aar混淆后提供给第三方应用使用,出现混淆后的文件,如com.a.a.a.a,与他们项目引入的其他包名字冲突了。其实这个冲突不不是我们项目和他们项目引起的包里面定义了相同的文件,而且混淆后恰好相同。
问题出现的原因是不同的aar包在不同的环境下打包,是混淆后的文件是存在一定概率出现相同的文件的。笔者尝试了,直接重新打包,还是会出现相同的文件,不能解决问题。该问题的解决方法是,通过修改混淆规则,控制混淆后的文件命名规则,从根本上避免与其他包可能出现同名的问题。具体步骤是需要在混淆规则文件中做如下设置:
- -obfuscationdictionary filename .txt:其中filename.txt是指定的用来生成混淆后的名字的文件。默认情况下,混淆后的名字一般为a、b、c、d以及它们的组合。通过使用-obfuscationdictionary配置的字典文件,可以使用项目指定的字符,如特殊的英文单词、非英文字符等等作为混淆后的类名、成员变量名、方法名。字典文件中的空格,标点符号,重复的词,还有以'#'开头的行都会被忽略。需要注意的是添加了字典并不会显著提高混淆的效果,添加字典有两个作用:一是避免与其他包混淆后重名;二是更不利与阅读;
- -classobfuscationdictionary filename .txt:指定一个混淆类名的字典,字典的格式与-obfuscationdictionary相同;
- -packageobfuscationdictionary filename .txt:filename 指定一个混淆包名的字典,字典格式与-obfuscationdictionary相同。
下面是一个字典的示例,仅供参考:
# 使用java中的关键字作字典:避免混淆后与其他包重名,而且混淆之后的代码更加不利于阅读
#
# This obfuscation dictionary contains reserved Java keywords. They can't
# be used in Java source files, but they can be used in compiled class files.
# Note that this hardly improves the obfuscation. Decent decompilers can
# automatically replace reserved keywords, and the effect can fairly simply be
# undone by obfuscating again with simpler names.
# Usage:
# java -jar proguard.jar ..... -obfuscationdictionary filename.txt
#
do
if
for
int
new
try
byte
case
char
else
goto
long
this
void
break
catch
class
const
final
float
short
super
throw
while
double
import
native
public
return
static
switch
throws
boolean
default
extends
finally
package
private
abstract
continue
strictfp
volatile
interface
protected
transient
implements
instanceof
synchronized
常规混淆方式普通英文单词字典混淆对逆向的干扰程序并不是很大,如果需要对逆向进行较大的干扰的话,可以设置比较变态的字典,可以参考这个链接