近几天一直在捣鼓Eclipse下面直接调试NDK ,以前都是从命令行中直接调试,现在听说现在Google已经发布了新的支持Eclipse直接调试的SDK ,心中甚为欣喜,本以为可以很快解决问题,没想到折腾了许久。
1. Android ADT的BUG
ADT 的Eclipse插件从r20 开始就已经支持通过CDT 直接调试NDK ,但是有一个问题,他只支持CDT 8.01以下的版本,原因在于CDT 升级到8.1的时候,修改了文件索引器部分的逻辑,也就是我们按F3可以来回跳转到制定文件的那个东东,导致Android的ADT不能与CDT进行很好 的配合,于是编译的时候报告一堆的文件找不到。实际上直接编译是没有问题的,问题不是编译器的问题。
关于这个问题的基本描述在 http://tools.android.com/recent 这个链接上面 ,因为经常会被墙,索性截图,如下
这个页面中比较详细的描述了怎么使用NDK ,但是请注意从下面的这个 BUG 33788 这个就是讨论了不能在最新的Eclipse 4.2 和CDT8.1上不能正确使用的原因。了解详情的,可以看看这个链接里面的详细讨论。
不过比较欣慰的是,在 ADT 21 Preview 2 中修复了这个问题。但是目前这个版本还没有发布,因此我们要配置ADT到Preview通道。具体的配置信息 链接 http://tools.android.com/preview-channel 同样配置一下截图
配置完成之后,最好重建一下工程,基本上提示错误的情况发生的不会太频繁,但是似乎仍旧会发生。也就是这个补丁还不怎么稳定。
一旦还是发生找不到JNI之类的问题,一般可以通过如下图操作来暂时处理掉
2. run-as: Package '<PACKAGE_NAME>' has corrupt installation
根据提示信息,貌似软件包没有正确安装造成的,反复安装调试了很多次,结果照旧,于是怀疑是不是某些其他原因。
好在Android是开源的,那么就比较好处理了,从 4.01的源代码中提取出 run-as部分的源代码,然后调整编译,在可能出问题的地方增加输出,看看到底是什么原因造成的,结果还真找到了。分离出来的源代码以及在此下载 run-as.zip
出问题的代码位置如下
1 2 |
/* must not be readable or writable by others */ if ((st.st_mode & (S_IROTH|S_IWOTH)) != 0) |
这句话,意思是 目录的权限中,others用户是不能有读写权限的,这个目录就是 /data
源 代码的编译是在run-as目录下面执行NDK-Build即可生成的可执行文件run-as在 obj/local/armeabi 目录下面。通过 adb push run-as /system/bin/run-as-log 命令把这个文件放到手机,如果提示没有权限或者只读,请参考这个 小米 2 adb remount failed解决办法
注意 千万不要动系统自带的run-as 否则系统重启之后,往往起不来。
然后执行
1 |
adb shell run-as-log com.aa.bb |
来看看他的输出
1 |
"path ="/data" must not be readable or writable by others st.st_mode = 71ff ,S_IROTH= 4 S_IWOTH =2" |
也就是 run-as 要求 /data目录是不能有others用户的读写权限的。否则就会失败。根本就不是安装错误。
解决方法
1 2 3 |
adb shell su #使用root权限(手机已root) ls -l /data |
权限信息如下:
4、修改权限
1 2 |
chmod 771 /data chown system.system /data |
5、再次执行
1 |
ls -l /data |
注意,似乎手机重启之后,设置又会还原掉,因此到时候还是需要重新设置。
简 单描述一下图中的 chmod函数的参数,注意 这个 drwxrwxrwx root root .其中 r = read 定义为 0x004 ,w = write 定义为 0x002 ,x = execute 定义为 0x001 , 那么 rwx 都拥有的话 ,就是 r | w|x = 7
rwxrwxrwx 分为三组用户 依次为,文件拥有者的权限,文件拥有者所在用户组的权限,其他用户的权限
因此 chmod 771 就表示 文件拥有者的权限 有 r|w|x的全部权限,而其他用户只有执行权限。