跨平台SDK研发小结
最近做一个跨平台的SDK, SDK的主要功能就是网络首发,文件读写,数据正确性校验。可以理解为某网盘的功能。因为要支持android, ios, windows, mac,linux 平台,并且我一个人做,简单起见,使用了第3方库:zlib、openSSL、libCurl、boost.
回顾一下前段时间,我在开发中遇到的坑点。
1. 字符编码问题。比如要下载的文件有特殊字符,如中文、韩文等。服务的返回的数据为UTF8格式。那么本地用什么格式才能写到磁盘,同时还能通知到APP层?
要求APP 层,服务端与SDK 交互,统一使用UTF8编码。IOS, android平台,UTF8 的编码字符,可直接用std::string计算,可直接使用fopen; windows 平台UTF8 编码的字符串可以用std::string 计算,但处理文件IO操作时,要用_wfopen, 文件名称需要转为w_char*. 本质原因:
规范: char类型均为UTF8编码, wchat_t类型编码与os相关(win UTF16, mac&linux UTF32)
windows内核UTF16, mac&linux内核UTF8
程序内部均用char, 涉及到系统操作时根据需要转换为wchar, 不涉及native string
2. zlib, android 端需要编译,ios 端 -lz即可。
3. openSSL,libCurl支持HTTPS.
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
CURLOPT_SSL_VERIFYHOST
0 :不检查证书
1 :检查证书不检查域名
2 :既检查证书又检查域名
4. 开源库编译。
BOOST
IOS boost 编译
https://github.com/faithfracture/Apple-Boost-BuildScript
android boost 编译
使用mk文件
curl/openSSL/zlib
android curl openssl zlib 编译,参考https://github.com/shishuo365/libcurl-android.git
ios 参考https://github.com/jasonacox/Build-OpenSSL-cURL
5. android 端回调函数封装。
JavaVM *g_jvm = nullptr;
jobject g_obj = 0;
void createThread(JNIEnv *env, jobject instance) {
// 把instant设置为全局引用
g_obj = env->NewGlobalRef(instance);
pthread_t _pthread;
// 避免线程方法还没有执行,该方法就先执行完毕,把instance释放掉了
pthread_join(_pthread, 0);
env->DeleteGlobalRef(g_obj);
}
6. 与其他第3方库冲突
程序请求https 请求时候,崩溃在tcp 连接成功后。在IOS 初步分析时,判断是openSSL库加解密冲突导致。在app工程中
添加all_load配置后,再次编译明显出现大量duplicate symbol字样,明确定位和https相关,和其他SDK厂商,沟通,统一openSSL版本解决。