ARouter之混淆大坑

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

今天遇到一个问题

fragment中使用autowired进行注入,发现在混淆之后出现问题,无法成功注入了。

ARouter是如何找到对应的注入文件进行注入的?

@Route(path = "/arouter/service/autowired")
public class AutowiredServiceImpl implements AutowiredService {
    private LruCache classCache;
    private List blackList;

    @Override
    public void init(Context context) {
        classCache = new LruCache<>(66);
        blackList = new ArrayList<>();
    }

    @Override
    public void autowire(Object instance) {
        String className = instance.getClass().getName();
        try {
            if (!blackList.contains(className)) {
                ISyringe autowiredHelper = classCache.get(className);
                if (null == autowiredHelper) {  // No cache.
                    autowiredHelper = (ISyringe) Class.forName(instance.getClass().getName() + SUFFIX_AUTOWIRED).getConstructor().newInstance();
                }
                autowiredHelper.inject(instance);
                classCache.put(className, autowiredHelper);
            }
        } catch (Exception ex) {
            blackList.add(className);    // This instance need not autowired.
        }
    }
}

    通过如上代码实现的,我们发现,首先他获取被注入对象的类名,然后通过类名+$$Arouter$$Autowired进行拼接,获得注入类。然后进行构造注入。

    但是如果这个被注入的类在混淆的时候进行了混淆呢?但是你知道的,实际生成的注入类是不会被混淆的,因为它继承与ISyring类,该类在官方文档中明确指定不能被混淆。

    此时注入当然会失败了,因为根本找不到对应的类,所以我们需要保留被注入的类的类名:

    -keepnames class .......(随你自己喽)

转载于:https://my.oschina.net/zzxzzg/blog/1526332

你可能感兴趣的:(ARouter之混淆大坑)