(中文版本请参看这里)
DataReporter is a cross-platform infrastructure component developed by luojisiwei dedao ebook Team. It is proved to be effective by tens of millions of dedao users.
- Cross platform, easy to deploy if you are developing multi-platform or multi-business application.
 - Suitable for Real-time reporting of data.
 - Anti-data loss.
 - Orderly reporting of data.
 - Mobile platform friendly, low power.
 
Start with sample usage here.
- Join to the build.gradle where in the project root directory repositories { mavenCentral() }
 - Join to the build.gradle where in the project directory implementation 'io.github.luojilab:datareporter:1.5.2'
 - Access according to the call mode of the demo
 
Preparation Condition:
- AndroidStudio3.1 And above
 - android-ndk-r14b And above
 
step:
- Use AndroidStuido open build/android in the source path
 - open File menu on AndroidStudio and build Structure menu
 - config the NDK path on the Android NDK location
 - run the datareporter release compile task
 - the Generated datareporter-release.aar use for your build
 
/**
 * Create a Reporter instance, the instance is native, saved in the returned int value
 * @param uuid      Business unique id, defined by the user as a unique id
 * @param cachePath Cache path, must be globally unique, different paths for different services
 * @param encryptKey Cache Encrypt Key
 * @param reportImp Reporting implementation interface
 * @return
 */
public static native long makeReporter(String uuid, String cachePath, String encryptKey, IReport reportImp);
/**
 * Set the number of data to be reported in a single time, and call it before start
 *
 * @param nativeReporter return by makeReporter
 * @param count          Number of data reported at one time
 */
public static native void setReportCount(long nativeReporter, int count);
/**
 * Set the maximum size limit of the cache file single file, the default value is 10k
 *
 * @param nativeReporter return by makeReporter
 * @param fileMaxSize    Cache file maximum size
 */
public static native void setFileMaxSize(long nativeReporter, int fileMaxSize);
/**
 * Set the cache file validity period
 *
 * @param nativeReporter return by makeReporter
 * @param expiredTime    Data validity period
 */
public static native void setExpiredTime(long nativeReporter, long expiredTime);
 /**
 * Set the reporting interval
 *
 * @param nativeReporter return by makeReporter
 * @param reportingInterval   Reporting interval
 */
public static native void setReportingInterval(long nativeReporter, long reportingInterval);
/**
 * Start reporting thread After setting the relevant parameters, execute it once.
 *
 * @param nativeReporter return by makeReporter
 */
public static native void start(long nativeReporter);
/**
 * Wake up the report, call when the network status is good or other wake up scene call
 *
 * @param nativeReporter return by makeReporter
 */
public static native void reaWaken(long nativeReporter);
/**
 * Data reporting call interface
 *
 * @param nativeReporter return by makeReporter
 * @param data           Data to be reported
 */
public static native void push(long nativeReporter, byte[] data);
/**
 * Call this method after the report is successful
 *
 * @param nativeReporter return by makeReporter
 * @param key            The value returned by the escalation implementation interface
 */
public static native void uploadSucess(long nativeReporter, long key);
/**
 * Call this method after the report fails
 *
 * @param nativeReporter return by makeReporter
 * @param key            The value returned by the escalation implementation interface
 */
public static native void uploadFailed(long nativeReporter, long key);
/**
 * Release the report instance, other methods can not be called after release
 *
 * @param nativeReporter return by makeReporter
 */
public static native void releaseReporter(long nativeReporter);
Note: After calling this method, you can not call any of the above methods. Because the instance has been released
-keep class com.iget.datareporter.**{*;}
- Copy the static library file corresponding to the architecture under release\iOS to the application build.
 - Refer to the following call mode to access
 
Preparation Condition:
- xcode last version
 - cmake last version
 
step:
- Use the terminal to enter the build\iOS directory in the build.
 - Compile the real machine library and execute the static library file generated after the build_os_arch.sh execution. libdata-reporter.a in the build folder.
 - Compile the emulator library to execute the build_x86_64.sh static library file generated after execution in the build folder libdata-reporter.a
 - Generate debug build execution generate_project.sh will generate debug xcode build after execution, build file in build folder
 
/**
 *  Create a Reporter instance
 *  @param uuid      Business unique id, defined by the user as a unique id
 *  @param cachePath Cache path, must be globally unique, different paths for different services
 *  @param encryptKey Cache Encrypt Key
 *  @param reportImp Reporting implementation interface
 *  @return
 */
(void *)MakeReporter:(NSString *)uuid cachePath:(NSString *)cachePath encryptKey:(NSString *)encryptKey uploadBlock:(void(^)(int64_t key, NSArray *dataArray))uploadBlock;
/**
 *  Set the number of data to be reported in a single time, and call it before start
 *  @param nativeReporter The value returned by makeReporter
 *  @param count          Number of data reported at one time
 */	
(void)SetReportCount:(void *)nativeReporter count:(NSInteger)count;
/**
 *Set the maximum size limit of the cache file single file, the default value is 10k
 *  @param nativeReporter The value returned by makeReporter
 *  @param fileMaxSize    Cache file maximum size
 */				 
(void)SetFileMaxSize:(void *)nativeReporter fileMaxSize:(NSUInteger)fileMaxSize;
/**
 *  Set the cache effective time in seconds
 *  @param nativeReporter The value returned by makeReporter
 *  @param expiredTime    Validity period is the unit
 */
(void)SetExpiredTime:(void *)nativeReporter expiredTime:(int64_t)expiredTime;
/**
 *  Set the reporting interval
 *  @param nativeReporter The value returned by makeReporter
 *  @param reportingInterval    Report interval, in seconds
 */
(void)SetReportingInterval:(void *)nativeReporter reportingInterval:(int64_t)reportingInterval;
/**
 *  Start reporting thread After setting the relevant parameters, execute it once.
 *
 *  @param nativeReporter The value returned by makeReporter
 */
(void)Start:(void *)nativeReporter;
/**
 *  Wake up the report, call when the network status is good or other wake up scene call
 *
 *  @param nativeReporter The value returned by makeReporter
 */		   
(void)ReaWaken:(void *)nativeReporter;
/**
 *  Data reporting call interface
 *
 *  @param nativeReporter The value returned by makeReporter
 *  @param data           Data to be reported
 */
(void)Push:(void *)nativeReporter byteArray:(NSData *)byteArray;
/**
 *  Call this method after the report is successful
 *
 *  @param nativeReporter The value returned by makeReporter
 *  @param key            The value returned by the escalation implementation interface
 */
(void)UploadSucess:(void *)nativeReporter key:(NSInteger)key;
/**
 *  Call this method after the report fails
 *
 *  @param nativeReporter The value returned by makeReporter
 *  @param key            The value returned by the escalation implementation interface
 */
(void)UploadFailed:(void *)nativeReporter key:(NSInteger)key;
/**
 *  Release the report instance, other methods can not be called after release
 *
 *  @param nativeReporter The value returned by makeReporter
 */
(void)ReleaseReporter:(void *)nativeReporter;
Note: After calling this method, you can no longer call any of the above methods. Because the instance has been released
DataReporter 是基于mmap的数据实时上报组件 主要用于数据的高性能实时上报,网络情况不好时,数据会缓存到本地。网络状态转好,马上上报。保证数据顺序上报。防数据丢失,即使应用发生崩溃,缓存数据不会丢失。
- 跨平台,DataReporter是跨平台实现,适用于Android和iOS。
 - 准实时上报,网络状态好,直接上报,网络状态不好在网络转好后上报,同时上报顺序不乱序。
 - 不丢数据,采用mmap实现缓冲区。即使发生应用crash或者进程被杀,数据不会丢失,下次启动会再次上报。
 - 低功耗,采用c++实现,整个上报共用一个线程,多实例多业务场景共用同一线程,当数据全部上报完成后,线程休眠。
 - 高效率,可配置一次上报数据条数。增加上报效率。有效利用网络。减少链接次数。同时采用native方式实现,性能方面更优秀。
 
数据通过调用接口进入DataReporter,先缓存到数据缓冲区,缓冲区实现是mmap,即使发生crash数据不丢失。然后启动线程进行上报。上报开始调用上报接口。成功后调用者通知上报完成,开始进行下一批数据上报。当上层调用过快,缓冲区数据达到指定阈值,数据开始下沉写入文件。写文件缓冲区同样采用mmap实现,防止数据丢失。上报优先级是先取文件数据,然后再取内存数据。保证数据顺序与调用顺序相同。
demo 的使用请参考这里。
- 在项目跟目录build.gradle中加入 repositories { mavenCentral() }
 - 在项目build.gradle中加入 implementation 'io.github.luojilab:datareporter:1.5.2'
 - 按照demo的调用方式接入
 
准备条件:
- AndroidStudio3.1及以上版本
 - android-ndk-r14b及以上版本
 
步骤:
- AndroidStuido打开源码路径project/android AndroidStuido项目文件
 - 打开AndroidStudio中File菜单,Project Structure菜单
 - 在Android NDK location中配置NDK位置
 - 在AndroidStuido中的Gradle菜单中找到位于Android菜单下的datareporter,在Tasks中找到build,选择assembleRelease进行编译。
 - 生成datareporter-release.aar 导入到项目中进行使用
 
/**
 * 创建Reporter实例,实例是native的,保存在返回的int值中
 *
 * @param uuid      业务唯一id,由使用者定义一个唯一id
 * @param cachePath 缓存路径,必须全局唯一,不同业务不同路径
 * @param encryptKey 缓存加密key
 * @param reportImp 上报实现接口
 * @return
 */
public static native long makeReporter(String uuid, String cachePath, String encryptKey, IReport reportImp);
/**
 * 设置单次上报的数据条数,在start之前调用
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param count          一次上报的数据条数
 */
public static native void setReportCount(long nativeReporter, int count);
/**
 * 设置缓存文件单文件最大大小限制,默认值为10k
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param fileMaxSize    缓存文件最大大小
 */
public static native void setFileMaxSize(long nativeReporter, int fileMaxSize);
/**
 * 设置缓存文件有效期
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param expiredTime    数据有效期
 */
public static native void setExpiredTime(long nativeReporter, long expiredTime);
 /**
 * 设置上报间隔
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param reportingInterval   上报间隔
 */
public static native void setReportingInterval(long nativeReporter, long reportingInterval);
/**
 * 开始上报线程 设置完相关参数之后,执行一次。
 *
 * @param nativeReporter 由makeReporter返回的值
 */
public static native void start(long nativeReporter);
/**
 * 唤醒上报,在网络状态转好时调用或者其他想唤醒场景调用
 *
 * @param nativeReporter 由makeReporter返回的值
 */
public static native void reaWaken(long nativeReporter);
/**
 * 数据上报调用接口
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param data           需要上报的数据
 */
public static native void push(long nativeReporter, byte[] data);
/**
 * 上报成功后调用该方法
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param key            由上报实现接口返回的值
 */
public static native void uploadSucess(long nativeReporter, long key);
/**
 * 上报失败后调用该方法
 *
 * @param nativeReporter 由makeReporter返回的值
 * @param key            由上报实现接口返回的值
 */
public static native void uploadFailed(long nativeReporter, long key);
/**
 * 释放上报实例,释放后其他方法都不可以调用
 *
 * @param nativeReporter 由makeReporter返回的值
 */
public static native void releaseReporter(long nativeReporter);
-keep class com.iget.datareporter.**{*;}
- 拷贝release\iOS下对应架构的静态库文件导入到应用项目
 - 参照下面的调用方式接入
 
准备条件:
- xcode最新版本
 - cmake最新版本
 
步骤:
- 使用终端进入项目中project\iOS目录
 - 编译真机版本库执行 build_os_arch.sh 执行后生成的静态库文件在build文件夹下libdata-reporter.a
 - 编译模拟器版本库执行 build_x86_64.sh 执行后生成的静态库文件在build文件夹下libdata-reporter.a
 - 生成调试工程执行 generate_project.sh 执行后会生成调试的xcode工程,工程文件在build文件夹下
 
/**
 *  创建Reporter实例
 *
 *  @param uuid      业务唯一id,由使用者定义一个唯一id
 *  @param cachePath 缓存路径,必须全局唯一,不同业务不同路径
 *  @param encryptKey 缓存加密key
 *  @param reportImp 上报实现接口
 *  @return
 */
(void *)MakeReporter:(NSString *)uuid cachePath:(NSString *)cachePath encryptKey:(NSString *)encryptKey uploadBlock:(void(^)(int64_t key, NSArray *dataArray))uploadBlock;	
/**
 *  设置单次上报的数据条数,在start之前调用
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param count          一次上报的数据条数
 */	
 (void)SetReportCount:(void *)nativeReporter count:(NSInteger)count;
/**
 *  设置缓存文件单文件最大大小限制,默认值为10k
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param fileMaxSize    缓存文件最大大小
 */				 
 (void)SetFileMaxSize:(void *)nativeReporter fileMaxSize:(NSUInteger)fileMaxSize;
/**
 *  设置缓存有效时间,秒为单位
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param expiredTime    有效期 秒为单位
 */
 (void)SetExpiredTime:(void *)nativeReporter expiredTime:(int64_t)expiredTime;
/**
 *  设置上报间隔
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param reportingInterval    上报间隔,秒为单位
 */
 (void)SetReportingInterval:(void *)nativeReporter reportingInterval:(int64_t)reportingInterval;
/**
 *  开始上报线程 设置完相关参数之后,执行一次。
 *
 *  @param nativeReporter 由makeReporter返回的值
 */
(void)Start:(void *)nativeReporter;
/**
 *  唤醒上报,在网络状态转好时调用或者其他想唤醒场景调用
 *
 *  @param nativeReporter 由makeReporter返回的值
 */		   
(void)ReaWaken:(void *)nativeReporter;
/**
 *  数据上报调用接口
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param data           需要上报的数据
 */
(void)Push:(void *)nativeReporter byteArray:(NSData *)byteArray;
/**
 *  上报成功后调用该方法
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param key            由上报实现接口返回的值
 */
(void)UploadSucess:(void *)nativeReporter key:(NSInteger)key;
/**
 *  上报失败后调用该方法
 *
 *  @param nativeReporter 由makeReporter返回的值
 *  @param key            由上报实现接口返回的值
 */
(void)UploadFailed:(void *)nativeReporter key:(NSInteger)key;
/**
 *  释放上报实例,释放后其他方法都不可以调用
 *
 *  @param nativeReporter 由makeReporter返回的值
 */
(void)ReleaseReporter:(void *)nativeReporter;
还有其他问题?
- 参看 DataReporter/sample;
 - 阅读 源码;
 - 阅读 wiki;
 - 联系我们。得到客户端技术组 QQ:21314601
 
感谢腾讯团队开源的MMKV项目。本项目借鉴了部分源码。 感谢开源。
DataReporter 使用的 MIT 协议,详细请参考 LICENSE。