当四大组件的配置属性android:process,代表需要开启一个新进程来运行。
1.以":"开头时,代表该进程是私有进程,只有该app可以访问,其他进程无权访问.
2.以非":"开头时,代表该进程是全局进程,其他app也可以访问,但是进程名中至少必须包含"."分隔符。
上述结论可以在PackageParser解析AndroidManifest.xml时可以找到答案.
[PackageParser.java]
看看PackageParser.java来解析AndroidManiefst.xml过程就明白进程名的命名要求
public class PackageParser {
...
private static String buildCompoundName(String pkg, CharSequence procSeq, String type, String[] outError) {
String proc = procSeq.toString();
char c = proc.charAt(0);
if (pkg != null && c == ':') {
if (proc.length() < 2) {
//进程名至少要有2个字符
return null;
}
String subName = proc.substring(1);
//此时并不要求强求 字符'.'作为分割符号
String nameError = validateName(subName, false, false);
if (nameError != null) {
return null;
}
return (pkg + proc).intern();
}
//此时必须字符'.'作为分割符号
String nameError = validateName(proc, true, false);
if (nameError != null && !"system".equals(proc)) {
return null;
}
return proc.intern();
}
private static String validateName(String name, boolean requireSeparator, boolean requireFilename) {
final int N = name.length();
boolean hasSep = false;
boolean front = true;
for (int i=0; i<N; i++) {
final char c = name.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
front = false;
continue;
}
if (!front) {
if ((c >= '0' && c <= '9') || c == '_') {
continue;
}
}
//字符'.'作为分割符号
if (c == '.') {
hasSep = true;
front = true;
continue;
}
return "bad character '" + c + "'";
}
if (requireFilename && !FileUtils.isValidExtFilename(name)) {
return "Invalid filename";
}
return hasSep || !requireSeparator
? null : "must have at least one '.' separator";
}
}
看完上面的源码.很显然对于android:process属性值不以”:“开头的进程名必须至少包含“.”字符。
网友评论