今天遇到一个问题
fragment中使用autowired进行注入,发现在混淆之后出现问题,无法成功注入了。
ARouter是如何找到对应的注入文件进行注入的?
@Route(path = "/arouter/service/autowired")
public class AutowiredServiceImpl implements AutowiredService {
private LruCache<String, ISyringe> classCache;
private List<String> 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 .......(随你自己喽)