package com.taobao.android.tpatch.manifest; import org.apache.commons.lang3.StringUtils; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /*** * 然后再去解析values的id 再根据id获取字符串和图片 * * @author keyongyu * */ @XmlRootElement(name= "manifest") @XmlAccessorType(XmlAccessType.FIELD) public class Manifest { @XmlAttribute(name = "package") public String packageName; @XmlAttribute(name = "versionCode", namespace = "http://schemas.android.com/apk/res/android") public int versionCode; @XmlAttribute(name = "versionName", namespace = "http://schemas.android.com/apk/res/android") public String versionName; @XmlElement(name ="uses-sdk") public UsesSdk usesSdk; @XmlElements({@XmlElement(name="permission", type=Permission.class)}) public List<Permission> permissions; @XmlElements({@XmlElement(name="users-permission", type=UsePermission.class)}) public List<UsePermission> usePermissions; @XmlElement(name ="application") private Application application; public Application getApplication(){ if(application == null){ application=new Application(); } return application; } @Override public String toString() { return "Manifest [\n packageName=" + packageName + ", versionCode=" + versionCode + ", versionName=" + versionName + ",\n usesSdk=" + usesSdk + "\n permissions=\n\t" + permissions + "\n usePermissions=\n\t" + usePermissions + "\n application=" + application + "\n]"; } public static class UsesSdk { @XmlAttribute(name = "minSdkVersion", namespace = "http://schemas.android.com/apk/res/android") public int minSdkVersion; @XmlAttribute(name = "maxSdkVersion", namespace = "http://schemas.android.com/apk/res/android") public int maxSdkVersion; @XmlAttribute(name = "targetSdkVersion", namespace = "http://schemas.android.com/apk/res/android") public int targetSdkVersion; @Override public String toString() { return "[minSdkVersion=" + minSdkVersion + ", maxSdkVersion=" + maxSdkVersion + ", targetSdkVersion=" + targetSdkVersion + "]"; } } private static class NameBase { @XmlAttribute(name = "name", namespace = "http://schemas.android.com/apk/res/android") public String name; @Override public String toString() { return "\n\t" + name; } } public static class UsePermission extends NameBase { } public static class Permission extends NameBase { @XmlAttribute(name = "protectionLevel", namespace = "http://schemas.android.com/apk/res/android") public String protectionLevel; @Override public String toString() { return "name=" + name + ",protectionLevel=" + protectionLevel; } } public static class MetaData { @XmlAttribute(name = "name", namespace = "http://schemas.android.com/apk/res/android") public String name; @XmlAttribute(name = "value", namespace = "http://schemas.android.com/apk/res/android") public String value; public MetaData(){ } public MetaData(String name, String value) { super(); this.name = name; this.value = value; } @Override public String toString() { return "\n\t\t" + name + "=" + value; } public String getValue(){ return value; } } public static class AndroidBase { @XmlAttribute(name = "theme", namespace = "http://schemas.android.com/apk/res/android") public String theme; @XmlAttribute(name = "label", namespace = "http://schemas.android.com/apk/res/android") public String label; @XmlAttribute(name = "icon", namespace = "http://schemas.android.com/apk/res/android") public String icon; @XmlAttribute(name = "name", namespace = "http://schemas.android.com/apk/res/android") public String name; @XmlElements({@XmlElement(name="meta-data", type=MetaData.class)}) public List<MetaData> metadatas; public int getTheme() { return getInteger(theme); } public int getIcon() { return getInteger(icon); } public int getLabel() { return getInteger(label); } private int getInteger(String str) { if (str == null || str.trim().length() == 0) { return 0; } return Integer.parseInt(str.replace("@", "")); } public MetaData getMetaData(String name){ if(metadatas!=null){ for(MetaData data:metadatas){ if(StringUtils.equals(data.name, name)){ return data; } } } return new MetaData(name, null); } public List<MetaData> getMetaDatas(){ return metadatas; } } public static class Application extends AndroidBase { @XmlAttribute(name = "hardwareAccelerated", namespace = "http://schemas.android.com/apk/res/android") public boolean hardwareAccelerated; @XmlAttribute(name = "allowBackup", namespace = "http://schemas.android.com/apk/res/android") public boolean allowBackup; @XmlElements({@XmlElement(name="activity", type=Activity.class)}) public List<Activity> activitys; @XmlElements({@XmlElement(name="provider", type=Provider.class)}) public List<Provider> providers; @XmlElements({@XmlElement(name="receiver", type=Receiver.class)}) public List<Receiver> receivers; @XmlElements({@XmlElement(name="service", type=Service.class)}) public List<Service> services; @Override public String toString() { return "[name=" + name + ",\n\tallowBackup=" + allowBackup + ",hardwareAccelerated=" + hardwareAccelerated + ",\n\t" + "theme=" + theme + ",label=" + label + ",icon=" + icon + ",\n\tmetadata=" + metadatas + "\n\tactivitys=" + activitys + "\n\tproviders=" + providers + "\n\treceivers=" + receivers + "\n\tservices=" + services + "\n\t]"; } } public static class IntentFilter { @XmlElements({@XmlElement(name="action", type=NameBase.class)}) public List<NameBase> actions; @XmlElements({@XmlElement(name="category", type=NameBase.class)}) public List<NameBase> categorys; @XmlAttribute(name = "priority", namespace = "http://schemas.android.com/apk/res/android") public long priority; @XmlElements({@XmlElement(name="data", type=IntentData.class)}) public List<IntentData> datas; private String getDatas() { if (datas == null) { return null; } int count = datas.size(); int i = 0; StringBuffer stringBuffer = new StringBuffer("[\n\t\t\t"); for (IntentData data : datas) { i++; stringBuffer.append(data); if (i != count) { stringBuffer.append(",\n\t\t\t"); } } stringBuffer.append("]"); return stringBuffer.toString(); } @Override public String toString() { return "\n\t\tIntentFilter [priority=" + priority + ",\n\t\tactions=" + actions + ",\n\t\tcategorys=" + categorys + ",\n\t\tdatas=" + getDatas() + "\n\t\t]"; } } public static class IntentData { @XmlAttribute(name = "scheme", namespace = "http://schemas.android.com/apk/res/android") public String scheme; @XmlAttribute(name = "host", namespace = "http://schemas.android.com/apk/res/android") public String host; @XmlAttribute(name = "path", namespace = "http://schemas.android.com/apk/res/android") public String path; @Override public String toString() { return "data[scheme=" + scheme + ",host=" + host + ",path=" + path + "]"; } } public static class ContextBase extends AndroidBase { @XmlAttribute(name = "exported", namespace = "http://schemas.android.com/apk/res/android") public boolean exported = false; @XmlAttribute(name = "enabled", namespace = "http://schemas.android.com/apk/res/android") public boolean enabled = true; @XmlAttribute(name = "permission", namespace = "http://schemas.android.com/apk/res/android") public String permission; @XmlElements({@XmlElement(name="intent-filter", type=IntentFilter.class)}) public List<IntentFilter> intentFilters; } public static class Service extends ContextBase { @Override public String toString() { return "\n\tService[name=" + name + ",enabled=" + enabled + ",exported=" + exported + ",\n\tpermission=" + permission + ",\n\t" + "theme=" + theme + ",label=" + label + ",icon=" + icon + ",\n\tmetadata=" + metadatas + "\n\t]"; } } public static class Receiver extends ContextBase { @Override public String toString() { return "\n\tReceiver[name=" + name + ",enabled=" + enabled + ",exported=" + exported + ",\n\tpermission=" + permission + ",\n\t" + "theme=" + theme + ",label=" + label + ",icon=" + icon + ",\n\tmetadata=" + metadatas + "\n\t]"; } } public static class Provider extends ContextBase { @Override public String toString() { return "\n\tProvider[name=" + name + ",enabled=" + enabled + ",exported=" + exported + ",\n\tpermission=" + permission + ",\n\t" + "theme=" + theme + ",label=" + label + ",icon=" + icon + ",\n\tmetadata=" + metadatas + "\n\t]"; } } public static class Activity extends ContextBase { @XmlAttribute(name = "launchMode", namespace = "http://schemas.android.com/apk/res/android") public int launchMode; @XmlAttribute(name = "screenOrientation", namespace = "http://schemas.android.com/apk/res/android") public int screenOrientation; @XmlAttribute(name = "configChanges", namespace = "http://schemas.android.com/apk/res/android") public String configChanges; @Override public String toString() { return "\n\tActivity[name=" + name + ",enabled=" + enabled + ",exported=" + exported + ",\n\tpermission=" + ",launchMode=" + launchMode + ",permission=" + permission + ",enabled=" + enabled + ",exported=" + exported + ",configChanges=" + configChanges + ",screenOrientation=" + screenOrientation + ",\n\t" + "theme=" + theme + ",label=" + label + ",icon=" + icon + ",\n\tmetadata=" + metadatas + ",\n\tintentFilters=" + intentFilters + "\n\t]"; } } }