最重要的2个文件是:
frameworks/base/include/androidfw/ResourceTypes.h
frameworks/base/libs/androidfw/ResourceTypes.cpp - status_t ResXMLTree::setTo(...)
如果尝试直接从 xml 字符串创建 view / drawable 对象,需要用到未公开类 XmlBlock,核心代码如下:
class Foo
{
private static Constructor<?> sXmlBlockCtor;
private static Method sXmlBlocknewParser;
static {
final String XML_BLOCK_CLS_NAME = "android.content.res.XmlBlock";
Class<?> cls;
try {
cls = Class.forName(XML_BLOCK_CLS_NAME);
sXmlBlockCtor = cls.getDeclaredConstructor(byte[].class);
sXmlBlockCtor.setAccessible(true);
sXmlBlocknewParser = cls.getMethod("newParser");
sXmlBlocknewParser.setAccessible(true);
} catch (Exception e) {
}
}
public static Drawable create(Context ctx, byte[] data) {
if (sXmlBlocknewParser != null) {
try {
Object xmlBlock = sXmlBlockCtor.newInstance(data);
if (xmlBlock != null) {
XmlPullParser parser = (XmlPullParser) sXmlBlocknewParser.invoke(xmlBlock);
return Drawable.createFromXml(ctx.getResources(), parser);
}
} catch (Throwable ex) {
ex.printStackTrace();
}
}
return null;
}
}