Android NDK 在小米2 中的调试

近几天一直在捣鼓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 这个链接上面 ,因为经常会被墙,索性截图,如下

image

这个页面中比较详细的描述了怎么使用NDK ,但是请注意从下面的这个 BUG 33788 这个就是讨论了不能在最新的Eclipse 4.2 和CDT8.1上不能正确使用的原因。了解详情的,可以看看这个链接里面的详细讨论。

不过比较欣慰的是,在 ADT 21 Preview 2 中修复了这个问题。但是目前这个版本还没有发布,因此我们要配置ADT到Preview通道。具体的配置信息 链接 http://tools.android.com/preview-channel 同样配置一下截图

image

配置完成之后,最好重建一下工程,基本上提示错误的情况发生的不会太频繁,但是似乎仍旧会发生。也就是这个补丁还不怎么稳定。

一旦还是发生找不到JNI之类的问题,一般可以通过如下图操作来暂时处理掉

image

2. run-as: Package '<PACKAGE_NAME>' has corrupt installation

根据提示信息,貌似软件包没有正确安装造成的,反复安装调试了很多次,结果照旧,于是怀疑是不是某些其他原因。

好在Android是开源的,那么就比较好处理了,从 4.01的源代码中提取出 run-as部分的源代码,然后调整编译,在可能出问题的地方增加输出,看看到底是什么原因造成的,结果还真找到了。分离出来的源代码以及在此下载 run-as.zip

出问题的代码位置如下

/* 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 否则系统重启之后,往往起不来。

然后执行

adb shell run-as-log com.aa.bb

来看看他的输出

"path ="/data" must not be readable or writable by others st.st_mode = 71ff ,S_IROTH= 4 S_IWOTH =2"

也就是 run-as 要求 /data目录是不能有others用户的读写权限的。否则就会失败。根本就不是安装错误。

解决方法

adb shell
su #使用root权限(手机已root)
ls -l /data

权限信息如下:

4、修改权限

chmod 771 /data
chown system.system /data

5、再次执行

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的全部权限,而其他用户只有执行权限。

发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注