使用Android Studio 3.0+调试任意环境生成的APK中的Java和Native C/C++代码(APK调试debug)

自从Google抛弃Eclipse ADT转投IntelliJ IDEA搞出Android Studio后,Android的开发调试环境可以说是日臻完善,先是Android Studio 2.x加入了调试原生C/C++代码的功能,一解Android NDK开发调试不方便之困(想当年可是拜ndk开发调试所赐才熟练掌握了gdb命令行的各种操作…),现在的3.x又加入了直接调试任意apk中Java和native .so的功能:

测试了下,虽然过程中遇到了个小问题,不过最终还是成功了,基本能和AS开发的带C++ Support项目原生调试体验一致。下面记录下这个”小问题“的解决方法:
先说明下这个小问题是用AS调试任意apk中的.so时找不到调试符号,且无法定位到源码并命中断点的问题,也就是说是有源码调试!无源码调试理论上应该也可以,但不在本次研究范围之内。
阅读全文:»

一个小问题,Unity游戏打包Android运行时锁屏游戏退出的修正

记个小问题,今天在看一个Unity的游戏demo时,发现打出的安卓包在运行时,一旦屏幕锁屏(并没有开wakelock屏幕常量),游戏便会自动退出,看了下logcat,也没有什么异常崩溃的记录,只有一个WIN DEATH,开始以为是onPause之类进后台做了什么操作导致的进程结束,最后发现其实是自定义的Android Manifest中configChanges里响应了不必要的项目,导致的退出:
原始:

<activity android:name="net.k_res.gotyedemo.MainActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|uiMode|touchscreen">

去掉无用项修改为:

<activity android:name="net.k_res.gotyedemo.MainActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden">

锁屏正常,游戏不再退出

找回Visual Studio 2017的Advanced Save Options…

在用旧版VS时,File菜单中有一项叫做高级保存选项的功能,可以选择源码文件的文本编码格式,升级到2017后(全新安装全部默认设置),发现这个选项没了(Community社区版)!其实只是默认不显示了,通过自定义菜单项功能还是可以找回来的:

依次Tools->Customize…->Commands->Menu Bar: File->Add Command->File->Advanced Save Options…然后托到你习惯的位置即可!感觉这个选项应该是比较常用的,不知为何默认不显示了。

Flash Builder 4.7在2017年的win10下开发调试的可用打开方式

首先在1703的win10下装好flash builder 4.7,然后新建个as项目,然后调试运行,发现默认的chrome 版本 61.0.3163.100(正式版本) (64 位)打开生成的html页面后根本没有加载flash控件,eclipse的调试部分也完全没有反应,又尝试了非调试运行,结果也是一样加载不了flash。于是更改设置中的浏览器为IE,再试,结果弹出的IE11倒是显示了flash控件,但提示“影片未加载”,显示一片黑!
随后修改运行配置,改为直接执行swf文件,也就是用standalone player的方式运行,结果一切正常!随即想到以前研究fb早期版本时,貌似需要将浏览起的flash插件替换为debug版本,于是17年这个新时代的各种浏览器对flash的恶意就显现出来了…
阅读全文:»

Android Studio通过CMake编译原生代码运行时符号(函数)丢失的问题

由于新版Android Studio的native调试功能实在是太好用了,所以试了下把旧版Cococs2d-x项目(大概是2.x版本吧)重建Android Studio项目。花了很长时间添加各种source,static library,prebuilt library以后,终于项目可以在Android Studio的cmake编译工具下成功编译链接并生成.so了,迫不及待的一运行,发现直接闪退,检查后发现是”Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnResume”这个cocos2d-x的jni函数没有找到!
初步检查了下,发现cmake编译出的cocos2d静态库.a中存在这个函数符号,但是最终生成的.so中确实是没有这个函数(使用ndk toolchain里面的nm),于是想到应该是链接时认为这个符号没有代码调用,被stripe掉了。
后来又仔细看了下Android.mk,发现玄机貌似在于

LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static

对cocos2dx的静态库使用了WHOLE的链接方式,于是开始查找同样功能在cmake中的实现方式,最后查的结果如下:
阅读全文:»

quick-cocos2d-x-2.2.6的CCHTTPRequest在Android 5.0+系统上的崩溃问题

虽然是比较旧版本的quick了,但也许会有人需要此版本的项目重新编译运行在新版本Android系统上,或是有遇到类似问题可以供参考,所以此篇文章记录解决这个问题的方法。
报错的现象是在使用“network.createHTTPRequest”进行http访问的时候(也就是lua调用的CCHTTPRequest类),出现native crash,大致异常信息是“use of deleted local reference XXXX”,看下logcat中的调用栈信息可以发现是在CCHTTPRequest::setRequestMethodJava调用时导致的。
关于这个问题我以前曾经写过相关的文章:

[译]Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化 – http://blog.k-res.net/archives/1525.html
Android NDK中多线程JNI的local reference释放问题 – http://blog.k-res.net/archives/1794.html

基本问题就是高版本安卓系统的JNI部分有一些关于Local Reference的改动,导致曾经没问题的JNI逻辑在新版本系统上crash,先放出修改吧,修改
lib\cocos2d-x\external\extra\platform\android\CCHTTPRequestAndroid.cpp这个文件中Android平台下对于CCHTTPRequest的实现,找到getClassID_,修改为如下所示:
阅读全文:»

关于PS4手柄(DS4)通过蓝牙连接的小问题(Win7,Win10 1703)

前几天修理了一个左模拟摇杆癫痫了的PS4手柄,换掉3D摇杆后问题解决,然后测试手柄时发现了这个神器:DS4Windows http://ds4windows.com/,用usb线连接手柄后可以检测手柄的大部分功能,比如光条(能改颜色哦)、重力感应、加速度等,还可以将PS4手柄模拟成Xbox 360的手柄,完美支持所有可用360手柄的PC游戏。另外,本人非常喜欢这次的DS4手柄改进,第一次拿在手里时就有一种说不出的舒适感(之后就再用PS2、PS3的就感觉有些不爽了,哈哈),再加上这个神器软件的存在,比当年PS3手柄的那个ScpServer要方便的多了!
后来发现神器作者的主页上还提到了可以支持蓝牙,正好手里有个N年前买的一个Broadcom 2046芯片的usb小蓝牙适配器,拿出来试试看无线效果如何,结果,问题来了:用PS+Share键开启DS4的强制配对后,蓝牙设备中可以看到Wireless Controller,连接后就是让确认了一下设备,也没让输什么0000的默认配对码,然后一瞬间手柄的光条从配对状态的短促快闪变成了已连接状态的常亮,然后Win端开始给设备安装驱动,再之后手柄光条灭掉,驱动装好后也没有连接上的无线手柄设备了,单按PS键后,Win端提示有设备请求连接,确认后就又断开了。
阅读全文:»

VS2017安装程序提示”未能加载产品定义”的解决方法

不说废话了,博主遇到这个问题的解决方法是删除”X:\Users\\AppData\Local\Microsoft\VisualStudio\Packages”,然后重新运行安装程序即可。

回避由于Unity3D编辑器播放时编译脚本重加载程序集导致报错卡死等问题

Unity3D有一个叫做”live recompile”的功能,即在编辑器处于播放状态时修改脚本代码或替换托管dll等操作时,当场触发重新编译生成项目脚本assembly,并会进行重新加载操作,然而,这个功能很多时候并不能保证重加载后的代码逻辑依然能正常运行,轻则报错,重则卡死。经过博主测试发现,Unity在重加载assembly后,会清空类实例部分成员变量的值(如在Awake中new出的数组对象等),且不负责还原。最终,为了避免由于此导致的问题,采取了一种回避的手段:通过Editor脚本方式检测是否在播放状态时触发了脚本编译,是的话立即停止播放,代码如下:
阅读全文:»

Unity3D游戏实现微信分享截图功能

Unity3D本身内置了一个截屏并保存为图片的功能:

public static void CaptureScreenshot(string filename, int superSize = 0);

然而,在配合微信做截屏分享的时候,发现这个简单的静态函数并不能顺利实现功能逻辑,关键原因在于这个函数的实现是异步的,也就是说,你想要的截图并不会在这个函数调用后立即生成!尤其是在移动平台上,这个函数的延迟可能更大,而且更悲剧的是:这个函数并没有让调用方知道截图生成ok了的机制,比如回调等,所以,在参考了网上的资料后,还是自己实现了一个截图保存的方法: 阅读全文:»