0.虽然使用手游为例,但适用于任何原生C++ NDK编译方式。
1. 先说说项目背景, cocos2dx的手游,开发一般在windows vs下开发调试,IOS下使用xcode也能很方便的调试,但android就没那么幸运了,一般调试就靠log来分析问题,总觉得效率低下。调试原生的android程序adb ,cygwin gdb-ndk,ecplise下android native app也搞过,但觉得不太方便,而且能否调试成功还得靠RP,真是调试不易,且行且珍惜。就想能不能在vs下调试android程序而且配置还得相对简单。
2. 在网上g了一把发现有个神器叫visualGDB,看看了可以用来调试linux和android程序,于是就想试试这个是否靠谱。
需要的工具
1.Vs2010或者2012
2.visualGDB 这工具是收费的,附件给了个破解版
3.一个被Root过,而且有要有/data和/data/data目录权限,也就是adb需要能以root登录。否则在启动调试会发现gdbserver文件无法copy到/data目录下而不能调试
4. android NDk
5. android sdk
6. ant
7. java-jdk
3. 安装配置visualGDB
1.安装后在vs的菜单上多了一项目android- àset sdk/ndk location打开下面界面设置自己的
Sdk ndk ant jdk相关路径
2 新建一个visualGDB的工程 Start Visual Studio. Select File->New project->VisualGDB->Android App Wizard.
可以看到在安装了visualGDB后在新建工程里多了一项,我们需要新建一个这样的项目
3 导入我们的项目,选择最后一个import existing from Ecplise or ant
4.选择android工程,这里是AndroidManifest.xml所在的目录
在创建工程的时候目标选择android-18
在AndroidManifest.xml里增加android:debuggable="true"来生成带调试信息的so
现在就可以开始编译了打包了(需保证android.mk文件 ant的build.xml都没有问题,至少已经能在ecplise下编译构建能通过)。
4.编译完成后,会自动使用ant打包成apk,如果在bin目录下看到生成的apk就表示成功了,下面开始调试
菜单->android->debug android app,会出现下面界面,其实该工具也是使用的adb来完成调试的。
我们项目在调试的时候会在这个界面时间比较长,一般在200s左右,提示来看可能是工程过大,文件过多导致。
PS:前几天在本机ecplise编译的时候在link的时候报个很奇怪的错误
在link的时候报了一个CreateProcess No such file or dir的错误,当时不知道什么原因,至少g了一把,就看到一个人问同样的问题,说可能是文件数过多导致。
我们文件个数796个,就怀疑在link的时候参数太长了导致。
当时就像把通用的做成一个独立的so,或者.a。但这样也只决解了当前的问题,万一以后在多起来还是一样,就想android.mk里有没有选择提供支持
找个下面这个选项,果然就ok了。
成功启动调试
Creash也能直接看到堆栈,很方便
5.遇到的几个坑
1. 设备不识别,在输入adb.exe devices 设备显示的是?号。
如果显示的是
? devices
这样表示usb打开有问题,驱动成功安卓,这样启动调试会提示“路径中具有非法字符”的错误
adb devices问号 设备不识别原因很多,我是在机器设置里选择usb连接方式选择“媒体设置(MTP)”连接就好了。
2.在创建工程的时候sdk\platforms 选择android-18,否则在调试的时候可能报一个armeabi-7v错误
3.在ant构建报一个异常,这是由于AndroidManifest.xml和project.properties里的
target=android-
[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
6. VisualGDB调试启动过程
Adb –s 设备id command
当已经有多个设备连接到主机时,可以使用-s参数进行选择.
获得设备信息
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe devices
List of devices attached
00664BACF43F device
查看当前进程
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 500 368 ffffffff 00000000 S /init
root 2 0 0 0 ffffffff 00000000 S kthreadd
root 3 2 0 0 ffffffff 00000000 S ksoftirqd/0
………..N多个
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell id
uid=2000(shell)gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1009(mount),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003
(inet),3006(net_bw_stats)
安装apk,-r表示重新安装
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F install -r "E:\lc_fb_test\cocos2d-x-2.1.4\samples\Cpp\HelloCpp
\proj.android\bin\HelloWorld-debug.apk"
pkg: /data/local/tmp/HelloWorld-debug.apk
Success
3741 KB/s (1406256 bytes in 0.367s)
启动一个app 路径由pwd返回
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell run-as org.cocos2dx.hellocpp /system/bin/sh -c pwd
/data/data/org.cocos2dx.hellocpp
获取cpu架构信息
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell getprop ro.product.cpu.abi
armeabi-v7a
运行一个包名为org.cocos2dx.hellocpp 活动activity HelloCpp
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell am start -n org.cocos2dx.hellocpp/.HelloCpp
Starting: Intent { cmp=org.cocos2dx.hellocpp/.HelloCpp }
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell ls /data/data/org.cocos2dx.hellocpp/lib/gdbserver
/data/data/org.cocos2dx.hellocpp/lib/gdbserver
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F shell ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 500 368 ffffffff 00000000 S /init
root 2 0 0 0 ffffffff 00000000 S kthreadd
root 3 2 0 0 ffffffff 00000000 S ksoftirqd/0
转发端口
E:\lccifter_FB\lucifter\adt-bundle-windows-x86-20130917\sdk\platform-tools\adb.exe -s 00664BACF43F forward tcp:5039 tcp:5039