Mars Android 接入指南
Mars Android 接入指南
gradle 接入使用的日志加密算法是不加密的,长连接短连接加解包也是默认的,如需自定义请参考本地编译。注意 gradle接入因为考虑依赖包体积的大小,只提供了 armeabi 和 x86_64 两种 CPU 架构的 so, 如果你使用的其他 so 有其他架构的,务必不要使用 gradle 依赖,参考本地编译 编出你需要的 so,否则会报 Couldn’t find “xxxx.so”
的错误
目前 gradle 接入支持两种方式:mars-core 和 mars-wrapper。只是做个 sample 的话建议可以使用 mars-wrapper, 但是如果在实际 App 中使用 mars,建议使用 mars-core 或本地编译
在 app 的 gradle 文件 app/build.gradle,添加 Mars 的库依赖:
dependencies {
compile 'com.tencent.mars:mars-core:1.2.2'
}
或者
dependencies {
compile 'com.tencent.mars:mars-wrapper:1.2.0'
}
接着就可以使用了
本地编译
环境
安装 cmake 以及 python2.7, 以及下载 ndk-r16b,并配置环境变量 NDK_ROOT 指向 ndk 路径。
如果是 Windows 系统还需要安装 cygwin,并务必要安装其中的 make, gcc gdb。 然后把 cygwin 的 bin 目录配置到环境变量中的 PATH 中
编译
所有的编译脚本都在mars/mars 目录, 运行编译脚本之前也必须cd到此目录,在当前目录下运行,默认是编译 armeabi 的,如果需要其他 CPU 架构,把编译脚本中的archs = set(['armeabi'])
稍作修改即可。
python build_android.py
执行命令后,会让选择:
Enter menu:
1. Clean && build mars.
2. Build incrementally mars.
3. Clean && build xlog.
4. Exit
如需要自定义日志加密算法或者长短连协议加解包,请选择static libs
选项,即 2 和 3。选项 1 和 2 输出结果全部在 mars_android_sdk 目录中,3 和 4 输出结果全部在 mars_xlog_sdk 目录中。
用选项 1 做范例。mars_android_sdk 中编译后的输出文件详细介绍如下:
文件名 | 描述 |
---|---|
mars_libs/ | 编译生成的 mars 的各个子项目的静态库。 |
libs/ | 最终编译生成的 mars 的动态库,也是发布用的库。 |
obj/ | 和 libs/ 里动态库相对应的符号信息,如果发布用了 libs/ 下面的库,此目录应永久备份。以防查问题时后续 ndk-stack 或者 addr2line 使用。 |
src/ | 使用 mars 所需要的 Java 文件。 |
log_crypt.cc.rewriteme | 最新版本已不再需要 |
log_crypt.h | 最新版本已不再需要 |
jni/longlink_packer.cc.rewriteme | 长连接协议可扩展部分,使用前请先改名为 longlink_packer.cc,如若想自定义长连接包头以及加解包,重写该文件。 |
jni/longlink_packer.h | 编译 longlink_packer.cc 需要使用的头文件,请勿修改。 |
jni/shortlink_packer.cc.rewriteme | 短连接协议可扩展部分,使用前请先改名为 shortlink_packer.cc,如若想自定义短连接包头(HTTP Head),重写该文件。 |
jni/shortlink_packer.h | 编译 shortlink_packer.cc 需要使用的头文件,请勿修改。 |
进入 mars_android_sdk 目录,自定义日志加密算法或者长短连协议加解包后执行ndk-build -B -j
编译出来最终 libs。
把 mars_android_sdk/src 目录下的 Java 文件以及 libs/ 复制到你的项目中:
在 AndroidManifest.xml 中增加网络访问权限以及读取运营商信息( STN 使用)和文件读写权限( xlog 使用)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
使用
xlog
注意如果只想使用 xlog 不想使用 mars 的其他组件可以选择: 在 app 的 gradle 文件 app/build.gradle,添加 xlog 的库依赖:
dependencies {
compile 'com.tencent.mars:mars-xlog:1.0.7'
}
不管是 mars-core 还是 mars-wrapper 或者是进行的本地编译,使用 xlog 的方式都是一样的。
推荐在 程序启动时加载 xlog:
System.loadLibrary("c++_shared");
System.loadLibrary("marsxlog");
在程序启动加载 xlog 后紧接着初始化 xlog:
final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
final String logPath = SDCARD + "/marssample/log"; // this is necessary, or may cash for SIGBUS
final String cachePath = this.getFilesDir() + "/xlog" //init xlog
if (BuildConfig.DEBUG) {
Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", 0, PUB_KEY);
Xlog.setConsoleLogOpen(true); } else {
Xlog.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", 0, PUB_KEY);
Xlog.setConsoleLogOpen(false);
} Log.setLogImp(new Xlog());
在 程序退出时反初始化:
Log.appenderClose();
需要注意:
- 如果你的程序使用了多进程,不要把多个进程的日志输出到同一个文件中,保证每个进程独享一个日志文件。
- 保存 log 的目录请使用单独的目录,不要存放任何其他文件防止被 xlog 自动清理功能误删。
- debug 版本下建议把控制台日志打开,日志级别设为 Verbose 或者 Debug, release 版本建议把控制台日志关闭,日志级别使用 Info.
- cachePath这个参数必传,而且要data下的私有文件目录,例如 /data/data/packagename/files/xlog, mmap文件会放在这个目录,如果传空串,可能会发生 SIGBUS 的crash。
STN
建议在程序启动时或者使用网络之前初始化 STN。
mars-core 和本地编译的方式对 STN 的初始化以及释放如下:
// set callback
AppLogic.setCallBack(stub);
StnLogic.setCallBack(stub);
SdtLogic.setCallBack(stub); // Initialize the Mars PlatformComm
Mars.init(getApplicationContext(), new Handler(Looper.getMainLooper())); // Initialize the Mars
StnLogic.setLonglinkSvrAddr(profile.longLinkHost(), profile.longLinkPorts());
StnLogic.setShortlinkSvrAddr(profile.shortLinkPort());
StnLogic.setClientVersion(profile.productID());
Mars.onCreate(true); BaseEvent.onForeground(true);
StnLogic.makesureLongLinkConnected();
初始化顺序不一定要严格遵守上述代码的顺序,但在初始化时首先要调用 setCallBack 接口(callback 文件的编写可以参考 demo ),再调用 Mars.init,最后再调用 onForeground 和 makesureLongLinkConnect,中间顺序可以随意更改。注意:STN 默认是后台,所以初始化 STN 后需要主动调用一次BaseEvent.onForeground(true)
在程序退出时或需要释放 stn 时调用:
Mars.onDestroy();
在网络切换时调用:
BaseEvent.onNetworkChange()
mars-wrapper 中 MarsServiceNative 的 onDestroy 函数中已经会自动释放 Mars,所以使用 mars-wrapper 后只需要初始化 Mars 就行了,初始化方式如下:
MarsServiceProxy.init(this, getMainLooper(),null);
不管是 mars-core 还是 mars-wrapper,使用 STN 前并没有主动调用System.loadLibrary
,这是因为在 Mars.java 中已经做了这个工作。在网络切换时mars-wrapper也没有主动调用BaseEvent.onNetworkChange()
,因为这个在 mars-wrapper 中已经帮忙完成。但不管哪种接入方式在下面几个事件发生后需要主动调用。
前后台切换时需要主动调用:
BaseEvent.onForeground(boolean);
当账号信息更改时需要调用:
StnLogic.reset();
更详细的的接口说明请参考 Mars Android 接口详细说明
Mars Android 接入指南的更多相关文章
- 【接入指南】一个Demo带你玩转华为帐号服务
在<接入指南:一文带你了解华为帐号服务>中已经给大家介绍了华为帐号服务有哪些优势,如一键授权登录华为全场景共享.共享华为帐号所有用户资源.帐号安全可靠.接入方便快捷等,以及为什么能帮助开发 ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- uexGaodeMap插件Android接入指引
uexGaodeMap插件Android接入指引 高德地图插件是基于高德地图API封装的AppCan平台的插件模块.开发者集成及使用此插件,需要到高德开放平台为应用申请相应的APIKey,并将APIK ...
- Android开发者指南-方位传感器-Position Sensor
Android开发者指南-方位传感器-Position Sensor 转载自:http://blog.sina.com.cn/s/blog_48d4913001010zsu.html Position ...
- 《Android学习指南》目录
源:<Android学习指南>目录 Android学习指南的内容分类: 分类 描述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不要先看Android的课程,这 ...
- Android开发指南--0 总览
无意间发现一个网站,主打IOS方面的教程,然而作为一个Android开发者,我就找了下网站里有没有Android的教程,还真有,这里就翻译一下. 翻译目标教程:https://www.raywende ...
- 微信公众号开发C#系列-2、微信公众平台接入指南
概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...
- Android API 指南
原文链接:http://android.eoe.cn/topic/android_sdk Android API 指南 - Android API Guides 应用的组成部分 - Applicati ...
- 《Android学习指南》文件夹
转自:http://android.yaohuiji.com/about Android学习指南的内容分类: 分类 描写叙述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不 ...
随机推荐
- 【技术博客】MySQL和Django常用操作
MySQL和Django是搭建网站常用的配置之一,在此记录一下在Windows系统搭建网站时MySQL以及Django常用的操作. MySQL MySQL的SQL语句不区分大小写,推荐将保留字大写,数 ...
- Java Thread dump 日志分析
jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on conditio ...
- Unity制作出《超级马里奥》的2D和3D混合效果
现在来做点别的东西.Nintendo Switch上刚推出的<超级马里奥>中,有一些关卡混合了2D和3D的画面,这种效果十分让人印象深刻.如何在Unity中实现这个效果呢? 正常情况下,摄 ...
- jdk8 stream实现sql单表select a,b,sum(),avg(),max() from group by a,b order by a,b limit M offset N及其性能
之所以要测该场景,是因为merge多数据源结果的时候,有时候只是单个子查询结果了,而此时采用sql数据库处理并不一定能够合理(网络延迟太大). 测试数据10万行,结果1000行 limit 20 of ...
- TX-LCN5.0.2分布式事务框架源码分析-关键线索罗列-txc部分
1.注解TxcTransaction2.在其注解接口附近查找aop配置:TransactionAspect3.runTransaction是在执行事务业务代码时的包装逻辑4.transactionSe ...
- AndroidStudio 3.5格式化xml文件出现自动改变xml元素位置问题
问题描述格式化xml时,出现自动改变了xml元素位置问题.左侧是原始的,右侧是格式化后的. 坑娘啊,这样界面就完全变了啊. 解决方案在设置里,Appearance& Behavior > ...
- Java学习-057-Jsoup爬虫获取中国所有的三级行政区划数据(二),并生成数据库 SQL 脚本插入语句
多不废话,直接上马,小主您稳着... package com.fanfengping.zeus.uitl; import com.alibaba.fastjson.JSONObject; import ...
- bootcss 之 .table-hover 类 鼠标悬停
通过添加 .table-hover 类可以让 <tbody> 中的每一行对鼠标悬停状态作出响应. <table class="table table-hover" ...
- cheerio 服务器端的jquery
cheerio https://cheerio.js.org/ Fast, flexible, and lean implementation of core jQuery designed spec ...
- PHP7 引入的“??” 和“?:”的区别
<?php $array = [ 'a' => 1, 'b' => 2, 'c' => [], ]; $a = $array['c'] ?? 0; $b = $array['c ...