- 博客(172)
- 资源 (49)
- 收藏
- 关注
原创 Android跨进程渲染
以下是服务端的代码示例,服务端收到客户端传递过来的 displayId,hostToken,width 和 height 之后,创建 SurfaceControlViewHost,然后创建一个 view 给到 SurfaceControlViewHost ,接着将 surfacePackage 传递给客户端。在一些 3d 的应用场景,当多个应用需要显示时,就可以使用跨进程渲染,这样做的好处就是,客户端进程比较轻量,无需每个客户端都引入 3d 引擎,减少包大小,减少内存占用。
2024-01-04 11:37:35 663
原创 使用docker创建自己的Android编译容器
每次拿到新机器或者系统重装,最麻烦的就是各种环境配置,最近学习了一下docker的知识,用dockerfile创建一个Android编译容器,这样就不用每次都吭哧吭哧的配置各种环境,至少编译可以方便点,开发环境还是得手动配的。需要注意的是,RUN和COPY指令都会增加容器的层级,所以我们尽可能的将可以合并的指令通过 && 连接起来,以此来减少容器的层级,减少容器的大小。再clone一个工程,尝试编译,发现能够编译成功。我们用这个镜像创建一个容器,并进入到这个容器中。发现已经有java的环境变量了。
2023-12-22 10:29:01 1186
原创 机器学习入门笔记
其中,sklearn集成了常见的一些机器学习的算法,可以让我们直接调用,https://www.scikitlearn.com.cn/。anaconda可以帮助我们创造虚拟的python环境,并在环境当中安装各种所需要的包,而且每个虚拟环境都是互相独立的,非常方便。其中data就是影响房价的因素,如当地的犯罪率,房屋年龄,房屋间数,和就业中心的距离等等,target就是房价。我们需要将原始的数据集拆分成训练集和测试集,这里是三七分,当然拆分的比例我们可以自定义。最近学习了一些关于机器学习的内容,做个笔记。
2023-12-10 12:59:28 220
原创 MVI的模板代码分享
从 mvc 到 mvp,mvvm 再到 mvi,目的是让代码结构更清晰,更容易维护。我们在进行一些逻辑运算之后,会获取到各种数据,然后将这些数据封装成 uistate。将 view 的一些操作封装各种 Intent。例如,以下是登录界面的各种意图。例如,登录界面的各种状态。
2023-04-20 16:41:02 442
原创 kotlin的一些标准函数
kotlin的标准函数有 run,let,with 等等,平时用的时候没有太在意他们之间的差异,现在来总结对比一下。返回自己,和 apply 标准函数一样返回自己,只不过 apply 提供的是 this 上下文。平时比较常用到的有 map,reduce,filter,flatMap 等。最后一行代码作为返回值,功能和 with 一样,只不过调用方式有差异。输出:[Apple, Tree, Hello, World]输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]包括 let,also。
2023-04-13 16:39:45 512
原创 第三方登录踩坑记录
最近做了注册登录的功能,其中涉及到第三方登录,就是通过 QQ 或微信或 FaceBook 等的账号进行登录。这种通过第三方的账号进行登录的逻辑都差不多,就是通过第三方的 sdk 拿到对应的 token,然后再用 token 向自己的业务后台进行注册,后台可以通过 token 获取到第三方平台的用户信息。
2023-03-26 15:47:34 154
原创 多语言解决方案
多语言是一个比较麻烦的事情,特别是当 App 比较大的时候,还会涉及到多个部门的开发以及翻译人员,这中间可能会存在比较大的沟通成本,而且还可能会阻塞开发的进度。以下是我们在具体开发过程当中使用的一个方案,通过管理端+流水线自动同步的方式来解决。
2023-02-23 11:30:31 1088
原创 效率提升的好物分享
作为一个程序员,平时的工作已经非常的繁忙,加班更是家常便饭,如何提升效率,将有限的精力放在更重要的事情上,让自己少加班,是需要我们持续关注和思考的。以下是博主在平时工作当中总结出,能够帮助我们提升工作效率的好物,希望能够帮助大家早点下班。
2022-08-20 13:41:50 2329
原创 sdk开发经验总结
文章目录1. 降低接入成本1.1 接入简单1.2 文档和 demo1.3 api接口设计1. 接口保持精简,不要提供过多的接口2. 每个接口均应当提供详细的接口说明3. 接口参数不应过多4. 接口方法过多,应当提供默认实现5. 接口尽可能和系统或者业内标准保持一致1.4 向后兼容2.稳定性2.1 plan B2.2 监控2.3 错误指引3.其他3.1 易扩展3.2 关注性能3.3 鉴权3.4 合规3.5 sdk接入标准化4. 总结博主之前做过一些 sdk 的开发,也对接过一些 sdk ,有一些 sdk 设
2022-04-26 23:32:43 9106 1
原创 使用协成将异步转同步
最近学习了一下kotlin的协成,发现使用协成能够帮助我们将异步代码转换成同步代码,能够极大的提高代码的可读性。1.普通的异步写法如下所示,为我们常见的一些异步代码,通常情况下,我们会传递一个callback到方法里面,等到异步代码执行完毕之后回调回来。public fun realRequest(response: Callback) { Thread(Runnable { println("start request:" + address) Thread.
2022-03-31 19:16:23 6291
原创 kotlin的属性代理
今天学习了一下kotlin的属性代理,觉的挺有趣的,借助属性代理我们可以实现一些有意思的功能。基本语法class Student{ var name: String by Delegate()}class Delegate{ operator fun <T> getValue(thisRef: Any?, property: KProperty<*>): T{ ... } operator fun <T> setV
2022-03-01 23:24:37 2765
原创 应对隐私检测的各种姿势
文章目录背景隐私检测的流程流程 1.0流程 2.0流程 3.0应对隐私检测的各种姿势1. 提前获取数据和获取频率2. 权限问题3. sdk问题反编译终极大招总结背景去年11月,我们团队就已经宣布解散,但是由于隐私监管的问题,我们还得维护最后一个版本,满足隐私监管的要求。我们团队的隐私问题主要是由我来负责,回想起这一年,真是被各种隐私问题折腾得死去活来,所幸最后一个版本终于上线了,现针对隐私问题总结一下各种应对的方法。隐私检测的流程流程 1.0在刚开始被要求隐私检测的时候,我们的流程是这样
2022-01-28 11:51:34 4081
原创 Lambda 表达式是否会造成内存泄漏
背景匿名内部类 VS Lambda 表达式匿名内部类Lambda 表达式结论背景匿名内部类会持有外部类的引用,因此有造成内存泄漏的风险;那么Lambda 表达式是否会造成内存泄漏呢?匿名内部类 VS Lambda 表达式我们新建一个类TestInner,其中test方法里面包含一个Lambda表达式,test1方法里面包含一个匿名内部类public class TestInner { public void test(){ new Thread(()->{ .
2022-01-17 10:15:31 5607
原创 徒手撸一个gradle插件
1.准备工作1.1创建一个Android module1.2准备maven环境2.实现插件2.1实现插件类2.2编辑properties文件2.3发布插件3.应用插件3.1引入插件3.2应用插件1.准备工作使用java开发gradle插件,基于gradle7.0版本开发,所以一些gradle的API针对低版本已经发生了变化。1.1创建一个Android module创建Android模块GradlePlugin,删除掉res和androidTest这两个目录,在main目录下创建resource.
2022-01-08 13:08:52 1431
原创 反编译更改jar包代码
背景实现步骤1.新建工程,将jar包引入,打包成apk2.使用apktool,将apk转换成smali文件3.找到对应的位置,修改smali代码4.将修改完成的工程,使用apktool将smali打包成dex5.将dex转换成为jar包6.从jar包当中找到对应的class文件,解压,并存放在对应的目录当中7.使用zip -u命令更新原来的jar包背景在某些特殊的场景,我们需要将jar包反编译然后修改里面的源码来实现我们自己的功能。博主前段时间就遇到了这样的问题。由于隐私监控越来越严格,博主所在的部.
2022-01-08 12:34:49 2606
原创 JNI绑定实践
目录背景静态注册1.引入so文件和native方法2.编译生成jni头文件3.实现jni方法4.实现CMakeLists.txt动态注册1.定义对应交互的java方法2.引入c++代码和CMakeLists.txt文件3.编辑c++文件4.实现CMakeLists.txt背景博主之前做的日志组件的结构是java和c++相结合实现。将日志的加密,压缩,文件写入等对性能比较敏感的模块放在c++层实现,而将日志的格式化,日志脱敏等功能放在java层实现。这就会涉及到java和c++的交互,即jni。jni注
2022-01-08 11:35:11 505
原创 活动发布插件化实践
背景开心鼠是一个以内容为主的App,新活动的发布非常频繁。1.活动发布的成本高活动跟版发布,则用户需要频繁的更新App才能够体验最新的活动。App上架,会受到应用市场的制约。2.使用热更新的方式发布活动,风险大热更新的影响范围为整个App。3.App包越来越大随着活动越来越多,如果所有的活动均打包到App里面,那么App的体积会越来越大。根据Cocos的官方文档,从2.4.5版本,Cocos开始支持AssetBundle,能够让我们将某个模块独立出来,以插件的方式加载。所以我们想到,将所
2021-11-25 12:03:40 360
原创 简化Cocos和Native交互利器
背景我们在使用 Cocos 和 Native 进行交互的时候,发现体验并不是特别的友好。如下所示,为我们项目当中的一段代码(代码已脱敏),当检测到发生了 js 异常,我们需要通知 Native 端去做一些处理。jsException: function (scence, msg, stack) { if (cc.sys.isNative && cc.sys.os === cc.sys.OS_ANDROID) { jsb.reflection.callStatic
2021-11-15 11:25:54 933
原创 Cocos热更新的非官方解决方案
背景Cocos 官方提供了一套热更新的解决方案,但我们认为这套方案在以下方面不能完全适合我们的需求:必须要在 Cocos 引擎启动之后才能够开始热更新流程,而我们有些业务场景需要支持在 Cocos 引擎未启动的时候就能够开始热更新流程;文件下载效率低,官方提供的方案是在客户端本地对比本地的文件 manifest 和服务端的文件 manifest,找出其中的差异,然后再将差异的文件下载下来,并逐个校验,效率较低;没有回退兜底策略,若本地进行热更新之后出现异常导致用户无法使用,无法回退到上一个版本;
2021-11-15 11:05:02 766
原创 安全高效可视化的日志解决方案
背景一条工单引发的日志需求我们的业务收到了一个信息泄漏的工单,漏洞是明文打印日志。我们当时使用的是某网络库自带的日志系统(以下简称 A 系统),会直接将明文写入到了日志文件当中,这样就有信息泄漏的风险。我们搜集了当前使用 A 系统的痛点:明文打印,造成隐私泄漏;关键日志丢失;无法方便的打印当前的堆栈,线程等信息;不支持各种格式化输出。为了解决这个问题,我们设计并实现了 TinyLog。TinyLog 能支持日志的加密和压缩,减少日志文件大小并确保隐私不会泄漏;能够支持各种格式化输出,
2021-11-15 10:44:08 643
原创 一个轻量级的任务执行组件
之前做启动优化的时候,把各种任务单独拎出来,做成一个组建,然后根据任务的优先级以及依赖顺序去执行.源码见:https://github.com/huangbei1990/HDemo整个模块主要分成以下四个部分.1.tasktask设置了四个优先级,具体如下所示,不同优先级的task会有不同的执行逻辑.public enum Priority { Immediately,//放入缓存线程池执行 Normal,//放入线程池执行 Idle,//cpu空闲时执行 Main
2020-12-09 17:26:11 175
原创 mock简单使用
最近楼主在做一个sdk,和后台进行协同开发,依赖于后台实现的接口,在开发之前先和后台约定好了接口,然后在开发的过程中可以先mock这个接口,这样就不会阻塞开发的流程.等后台开发好了之后,再一起联调就可以了.1.引入implementation 'org.mockito:mockito-core:1.10.19'implementation 'com.crittercism.dexmaker:dexmaker:1.4'implementation "com.crittercism.dexmaker:d
2020-12-04 10:47:18 659
原创 Android项目模块化最优配置
随着Android项目越来越大,每个项目都会分成各个小模块方便管理,而每个模块都有各自的编译配置,因此统一配置是需要考虑的一个问题.以下是我比较喜欢的一种配置方式.随着Android项目越来越大,每个项目都会分成各个小模块方便管理,而每个模块都有各自的编译配置,因此统一配置是需要考虑的一个问题.以下是我比较喜欢的一种配置方式.1.在根目录新建config.gradle文件.内容如下,其中ext是gradle提供的一个ExtensionAware类型的属性,本质是一个map.ext.config =
2020-11-08 21:15:26 235
原创 树莓派搭建私人nas
最开始玩树莓派也是想能够搭建一个私人nas,能够做数据备份,其中各种折腾,我用的是一块旧的硬盘加nextcloud实现的私人nas,现在记录以下搭建的整个过程。1.安装nextcloudNginx首先需要安装Nginx ,Nginx是web服务器,我们安装的nextcloud会挂载到Nginx上面,这样就可以通过网络访问了。安装参考:https://www.cnblogs.com/xiangzhuo/p/9473812.html安装完成之后启动Nginx服务。Docker接着需要安装docke
2020-10-18 11:32:02 14238 1
原创 树莓派上使用百度网盘
想在树莓派上安装下载百度网盘里面的内容,尝试过以下方法安装官方提供的Linux安装包,实际测试,在树莓派上装不上;使用bypy工具地址:https://github.com/houtianze/bypy,也有图形界面,但是不知道是百度限制了还是怎么会是,按照提供的文档,文件下载不下来;使用baidupcs-go工具地址:https://github.com/felixonmars/BaiduPCS-Go,直接下载release包,运行就能用,但是不带图形界面,使用起来有点费劲。好在有大牛依据ba
2020-10-17 18:34:59 10425 5
原创 树莓派离线下载
最近朋友买了一个私人网盘,可以用于资料的备份,也可以挂机下载,感觉还挺有趣的,自己也想折腾一下,利用树莓派搭载一个私人网盘,用于离线下载,折腾了半天终于弄好了,现在记录一下。1.安装和配置Aria2离线下载我们使用Aria2来实现,Aria2非常轻量级,且支持各种链接和种子下载,以及多线程下载。安装sudo apt-get install aria2配置我是在/home/pi/.config/aria2目录下存放的配置文件mkdir /home/pi/.config/aria2cd /ho
2020-10-11 19:10:57 1177 1
原创 java的io操作
最近在做一个日志组件,考虑到性能和日志的完整性,使用了MMAP,即内存映射的方式写日志,顺便总结一下Java里面的IO操作.1.IOIO是阻塞性的,效率不高,但是很容易理解可以想像成是一个水管,水管里面有空位才能往里写,否则就要等待, 水管里面有水才能读,否则也只能等待.不管IO怎么包装,其操作都是针对字节的.private static void testIO()throws Exception{ File file = new File("test.txt"); //写
2020-10-08 20:33:19 107
原创 Activity的显示
1.Activity的显示Activity的显示原理如下图所示在Activity启动的时候会创建一个PhoneWindow,而这个PhoneWindow会包含一个DecorView,DecorView就是Activity的rootview,其中包含一个bar和contentView,我们自己写的布局会放到contentView当中。对于每个DecorView都有一个对应的ViewRootIm...
2020-03-16 11:44:22 383
原创 Activity的启动流程
1.Activity的启动流程当我们点击桌面的图标时,其实就是启动对应应用的入口Activity。启动Activity主要有两个流程,一个是对应的应用进程存在,一个是对应的进程不存在,以下的流程是对应的进程不存在的流程。如上图所示,当启动一个activity时,会将请求发送至AMS,AMS会判断目标进程是否存在,若不存在,则先发消息给zygote进程,然后从zygote进程当中fork出目标...
2020-03-14 20:11:53 2262
原创 binder调用流程分析
binder是一个非常好的跨进程通信工具,Android对其进行了各种封装,虽然我们用起来简单,但是理解起来却比较困难。1.自己设计一个跨进程通信机制在理解binder之前呢,首先我们想一下,如果我们自己设计一个跨进程通信的机制,那我们会怎么设计呢?如果是我的话,我可能会按照下图设计。图中左边是客户端,右边是服务端,客户端想要调用服务端的call函数,首先我们需要先将函数名称以及参数值进...
2020-03-12 12:19:49 813
原创 只有主线程才能更新view吗?
1.子线程更新产生异常做过Android开发的同学都知道只有在主线程才能够更新view,如果在子线程更新view,则会抛出异常。我们来看下这个异常到底是哪里抛出来的。如下代码所示,新建了一个线程去更新viewnew Thread(() -> { jumpBtn.setText("测试");}).start();这时抛出的异常如下 android.view.View...
2020-02-26 16:09:54 430
Android虚拟ble设备源码
2017-07-11
threadfactory线程池
2017-06-25
vc++编程资料.chm
2010-04-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人