Invalid policyvers specified: 26解决方案

来源:互联网 发布:淘宝一件代发教程 编辑:程序博客网 时间:2024/05/18 00:32

     最近由于项目需要编译Android5.0源码(以前编译4.x代码也出现过类似问题),按照source.android.com的指示下载编译过程挺顺利的。但编译到一个小时左右的时候老是出现Invalid policyvers specified: 26,这个错误跟Android系统的安全访问策略有关系。以前重装系统就能搞定,现在重装系统好多次,都搞不定。网上很多同学碰到这个问题,都解决不了,感觉好苦恼。在经过几天的努力之后,最终在这个周末把这个问题解决了。为了使其它碰到类似问题的同学不再苦恼,不再浪费宝贵的时间,现将解决方案陈述如下:

1.定位错误:

     在编译出现错误的时候我们要做的第一件事情就是定位编译出错源码位置。但是有时候错误位置提示不明显,如此多的源码,到哪里去找到出错的位置呢。于是使用

grep -r "Invalid policyvers specified" ./ 

     在源码目录进行内容查找,找了一晚上终于在external//checkpolicy//checkpolicy.c文件中找到。打开该文件,在main函数的switch 语句的case ‘c’代码块中找到了错误提示行。接着发现是先调用了strtol函数,然后错误了,这样就定位到错误位置了。

2.排查原因:

     上网查了一下strtol函数的作用,描述如下:

   参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如’0x’前置字符则会使用16进制做转换、遇到’0’前置字符而不是’0x’的时候会使用8进制做转换。        一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;若参数endptr为NULL,则会不返回非法字符串。          如果字符串中的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的最大(或最小)整数,并设置errno为ERANGE,例如strtol("0XDEADbeef~~", NULL, 16)返回0x7fffffff并设置errno为ERANGE

      既然是在调用strtol之后检测错误码时发现错误码被置位,那就说明编译出错的原因就是因为strtol的转换导致的。我们输入变量optarg的值,发现其输出是26xxx(xxx表示乱码),应该是转换发生了溢出。

     但是将n直接赋值为26之后还是不能编译通过,说明不是strtol的问题,通过打印错误码发现errono = 17,即File exists,暂时还不清楚什么情况下会出现这个错误,但能确定的是在进入switch之前就出现了问题。

3.解决方案:

      在找到上面的原因之后,我代码修改如下:

在long int n = strtol(optarg, NULL, 10);后面再加上errno = 0;
(其实在main函数一开始加入errno = 0;也可以的。)

    重新编译源码,顺利通过,模拟器运行正常,上网也ok。

4.存在的疑问:

   为什么会出现File exists这个错误呢?为什么忽略这个问题程序还是能正常运行呢?具体原因还不确定,后续还需要深究。

0 0
原创粉丝点击