- 博客(181)
- 资源 (17)
- 问答 (1)
- 收藏
- 关注
原创 鸿蒙端H5容器化建设——JSB通信机制建设
本文概述了鸿蒙系统的架构以及开发模式,并且指出鸿蒙的适配工作任重而道远。其中,Native侧的迁移适配需要大量的时间和成本;而H5作为天然的跨端生态,尤其是在业务中本来就有很重的业务承载,那么H5容器化是首先要去适配的。ArkTS与H5的JSB通信机制则是本文的重点描述内容,剩下的H5容器所需的Native能力,则需要一点一点去补齐。
2023-12-18 15:12:46
2601
6
原创 如何训练专属的OCR文字识别模型
随着文档数字化的发展,光学字符识别 (OCR) 变得越来越流行,OCR 在处理基于图像的文档中发挥着至关重要的作用。基于电商APP移动端的业务场景,是否也能利用OCR来为用户提供更加便利的购物体验呢。
2023-11-20 20:28:53
8422
1
原创 Android开发——APP ANR治理
ANR(Application Not Response)指应用程序无响应,通常出现在主线程被阻塞时,并伴随ANR弹窗出现。ANR的治理难点是不像Crash一样有崩溃日志,定位问题比较困难,但是ANR带来的用户体验是极差的,是必须要解决的问题。
2023-01-04 10:04:24
7474
1
原创 移动端开发——APP端上H5容器化建设
在现阶段APP中,H5页面承接了越来越多的业务,然而H5页面在用户体验和研发效能上均存在一些亟待解决的问题。为此,APP移动端团队通过H5容器化建设,系统性的总结出了一套解决方案。
2022-12-05 14:28:19
12118
原创 Android开发——如何解决三方库中的类名冲突问题
对三方库混淆是业内常见的一种做法, 但是如果在我们的Android工程中同时引入了两个三方库, 且都是默认的混淆规则, 导致包名+类名冲突了, 就需要一种通用的解决方案来处理这个冲突问题.
2022-06-06 17:43:42
10234
2
原创 Android开发——H5容器加载速度优化方案
1. 背景介绍在偏重活动运营的电商App中,受制于App版本审核,具备开发周期短、可灵活发布等特点的H5页面受到青睐,承载了很多重要业务。但App Webview存在令人烦恼的性能问题,特别突出的是加载速度慢,和Native页面相比用户体验较差。因此本文将从H5加载速度优化方面,总结了XCache、Prefetch、容器预热三种优化方案,以及上线后的提速效果分享。2. XCache离线缓存提速方案2.1 方案背景为了有效解决 Android H5的性能问题,除了使用Android WebView自身
2021-02-14 18:19:41
24923
5
原创 Android开发——如何优雅的将布局置于输入法之上
0. 前言在Android应用的开发中,有一些产品需求,需要我们获取到输入法的高度。遗憾的是,Android官方并没有提供这样的API。最近在做的直播项目就有类似的需求,先看一下淘宝的直播页面,当用户点击下方的布局时,弹出输入法的同时,将一个新的EditText置于输入法的正上方,这就需要我们准确的获取到输入法的高度,同时兼顾虚拟按键栏的高度。同时也看到,在输入法出现时,后面的界面的布局没有受到任何的影响,这显然是android:windowSoftInputMode="adjustNothing"的
2020-06-08 19:26:36
26124
8
原创 Android开发——View Binding的使用与解析
1. 前言如何干掉模版代码是很多第三方框架的设计初衷,在Android开发中,findViewById()是必不可少的存在,这样的冗余代码在很久以前充斥在Android工程中,因此也出现了很多精简写法,代表方案罗列如下:1.1 Butter Knife/Kotter KnifeButter Knife框架是17年前后很火的存在。但是在Kotlin中直接使用ButterKnife的注解方式的话...
2020-04-24 19:39:16
23546
5
原创 Android开发——AS插件批量解决XML中的String/Color/Dimen硬编码
1. 问题抛出1.1 开发方面对于日常开发中,每写一个"#333",都要手动的在当前xml与colors.xml中来回切换,查看是否已经定义过,如果定义过则拿过来复用,如果没有就要新定义一个叫"#333"的资源名,然后再使用。同样的情况存在于dimen以及string,这无疑是重复冗余的操作。1.2 维护方面试想一下,你接手了一个老项目,发现color、string和dimen信息全部以硬...
2020-01-16 16:24:52
23676
3
原创 Android开发——Crash捕获SDK是如何捕获Application中onCreate的崩溃信息的
1. 前言众所周知,很多第三方SDK是在Application中的onCreate()中去初始化的,形如:@Overridepublic void onCreate() { super.onCreate(); //... ThirdPartySDK.init(this);}那么为什么一些crash捕获SDK是如何更靠前的进行初始化,从而捕获Applicat......
2019-10-25 16:50:12
12536
2
原创 Android开发——Android7.0的适配注意点小结
首先大致说一下Android7.0特性改动的地方:(1)应用间共享文件限制;(2)对部分广播的后台限制、网络数据节省开关等;(3)多窗口的支持;(4)通知栏支持直接回复消息等。针对Android7.0的适配总结如下:1. 应用间共享文件限制1.1 问题描述在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向应用外公开 f......
2018-09-05 11:08:26
20211
1
原创 Android开发——架构组件LiveData源码解析
近期的业务代码中使用到了LiveData,研究了一下发现很好用,因此总结整理出了此篇学习笔记。希望各位多批评指正。1. LiveData概述简单地来说,LiveData就是一个持有数据的类。LiveData中的数据可以被观察者订阅,当数据被修改时通知观察者。观察者包括Fragment、Activity以及Service等。 LiveData能够感知观察者的生命周期。只有在观察者处...
2018-08-31 15:11:02
20843
转载 Android开发——WebView轻量缓存优化
0. 前言产品被用户投诉 APP 流量消耗厉害:[2017-08-08 07:34:40] 严选 APP 流量消耗太大啦,每次启动都更新,下面流量很大。建议优化流量的消耗,可以对加载画质进行选择。想比淘宝 APP,消耗流量可是大多了。[2017-06-01 21:43:36] 怎么没用有流量节约模式,一会用了我 200M。[2017-06-12 08:32:25] 严选 app 太费流量了。于是乎
2017-11-28 12:56:20
3689
3
原创 Android开发——ListView的复用机制源码解析
0.前言前段时间找工作,看了很多人的面经,不得不说找个工作很麻烦。尤其是Android,岗位的数量比不上前端后Java后台也就算了,问的东西又多又杂,这里就不多列举了,其中有一个印象比较深的问题是关于ListView复用机制的。复用机制谁都会用,但是却不一定能真正讲清楚。因此才有了此文。1. ListView的继承关系和Adapter的由来ListView直接继承自的AbsListVi...
2017-10-24 18:28:16
1981
原创 Android开发——插件化技术中的关键技术浅析
0. 前言在Android开发中,插件化就是让我们的应用可以把一些功能和逻辑单独抽出来放在插件apk中,然后主apk做到按需调用,这样的好处是一来可以减少主apk的体积,二来可以做到热插拔,在不发布新版本的情况下实现更新某些模块,更加动态化。网上有很多插件化的解决方案和框架,但是它们都必须解决几个基础问题:插件类的加载,插件资源的加载和插件Activity的管理。1. 插件类的加载public...
2017-09-08 21:05:51
1856
3
原创 Android开发——增量更新实战中遇到的问题
0. 前言之前一篇Android开发——增量更新实战总结介绍了增量更新的具体实现步骤,但是其中有一些坑还是需要注意一下的,这里对遇到的一些坑做一个总结,希望以后遇到这些坑的同学少走弯路。1. Windows下的编译错误 在上一篇的3.2我们导入源码的过程中,其中为了防止Windows下的编译错误,放入了empty.c空文件,具体错误当时忘记截图了,反正如果你用的Windows平台做,直接...
2017-08-29 18:09:58
1594
原创 Android开发——增量更新实战总结
0. 前言增量更新的原理还是比较简单的,但是真的实现起来遇到的坑简直让人吐血,我是在windows下实现的,各种各样的坑,各种各样的错误,折腾了整整两天多才完成了,因此记录下来。先介绍下什么是增量更新和为什么我们需要增量更新,当我们发布新版本的时候,一些用户升级并不是很积极,反正我个人是不太喜欢更新手机上的APP,不知道大家是什么样的习惯...
2017-08-29 18:09:31
1759
转载 Android开发——微信Android架构历史
微信Android诞生之初,用的是常见的分层结构设计。这种架构简单、清晰并一直沿袭至今。这是微信架构的v1.x时代。图1-架构演进到了微信架构的v2.x时代,随着业务的快速发展,消息通知不及时和Android 2.3版本之前webview内存泄露问题开始突显。由于代码、内存、apk大小都在增长,对系统资源的占用越来越多,导致微信进程容易被系统回收。因此微信开始转向多进程架构,独立的通信进程保持长连
2017-08-13 20:31:54
3141
3
原创 Android开发——如何理解晦涩的Binder机制
0. 前言Android中Binder机制的重要性不言而喻,从IPC角度来看, Binder是一种跨进程通信方式,Binder也可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder;从Android framework角度来说,Binder是Service Manager连接各种Manager和相应ManagerService的桥梁;从Android应用层来说,Binde......
2017-08-10 09:45:17
1440
2
原创 设计模式——装饰模式详解
装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。...
2017-08-07 14:53:01
10663
4
原创 Android开发——Protocol Buffer效率之高的原理介绍
0.前言最近的项目里有用到Protocol Buffer,Protocol Buffer是Google公司开发的一种数据描述语言,类似于XML,是一种结构化数据的数据存储格式,可用于数据传输量较大的即时网络通信IM等场景。之所以使用它,是因为PB将信息序列化为二进制的格式,体积缩小了3倍,序列化速度比Json快了20-100倍,也必然会减少网络传输所需的时间。这么强大的的PB,当然要深入理解一下它...
2017-07-30 14:22:43
2399
4
转载 Android开发——贝塞尔曲线解析
相信很多同学都知道“贝塞尔曲线”这个词,我们在很多地方都能经常看到。利用“贝塞尔曲线”可以做出很多好看的UI效果,本篇博客就让我们一起学习“贝塞尔曲线”。贝塞尔曲线的原理贝塞尔曲线是用一系列点来控制曲线状态的,这些点简单分为两类:类型作用数据点确定曲线的起始和结束位置控制点确定曲线的弯曲程度一阶贝塞尔曲线 一阶曲线是没有控制点的,仅有两个数据点(A 和 B)
2017-07-26 16:13:36
2294
原创 Android开发——简述RxJava框架的实现原理
0.前言看此篇之前最好知道RxJava的使用,关于框架的使用推荐这篇文章,由于RxJava内部实现有点复杂,既然用拆轮子的方式来分析源码比较难啃,不如换种方式,以造轮子的方式,将源码中与性能、兼容性、扩展性有关的代码剔除,留下核心代码带大家揭秘RxJava的实现原理(本文不涉及框架的使用介绍)。1.观察者Subsribler在RxJava里面是一...
2017-07-20 17:30:53
2241
5
原创 Android开发——使用ActivityLifecycleCallbacks监控App是否处于后台
0.前言项目中经常会遇到判断App是否工作在后台的情景,除了判断runningTasks这种方法,其实有一种更加优雅的方法,就是使用ActivityLifecycleCallbacks。1.ActivityLifecycleCallbacksActivityLifecycleCallbacks其实是一个接口,如下所示:看方法名字就很清晰的知道,它定义了App内所有的Activity从创建到销毁的回调方法...
2017-07-12 21:12:08
3804
转载 Android开发——今日头条APK瘦身之路
随着版本迭代,功能增加安装包体积也会慢慢增大。今日头条576版本APK达到了25M,通过一系列的优化,到目前的607版本为12M。本文主要是介绍头条APK瘦身中用到的一些方法。APK分析既然是要优化APK的大小,那首先就得看下APK文件的构成。Android Studio在2.2版本添加 APK Analyzer功能,可以直接打开apk文件,如下图所示 APK文件主要有如下几部分组成:
2017-07-07 20:02:24
2060
原创 Java技术——ReentrantLock的Condition的作用以及使用
0. 前言 之前知道ReentrantLock类有一个newCondition(),用于获取Lock上的一个条件,还可以多次newCondition()获得多个条件,Condition可用于线程间通信。是对比ReentrantLock和Synchronized关键字的区别时学习到的。但是有次面试被问到有没有用到过ReentrantLock的Condition,瞬间懵逼了。所以搜集了些资...
2017-06-30 22:21:46
10140
3
原创 Android开发——Android系统启动以及App启动过程
0.前言从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的?1.系统上电当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被置为初始状态,CPU复位之后,程序指针会指向启动地址,从该地址读取并直接运行启动程序的可执行代码,或者将可执行代码与数据载入CPU内置的RAM中再运行。这一段代码,放在PC中,叫做BIOS,而在Andro...
2017-06-19 16:26:11
5015
1
原创 设计模式——适配器模式详解
适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不兼容而无法一起工作的两个类能一起工作。适配器模式的使用场景:(1)系统需要使用现有的类,而此类的接口不符合需要。(2)需要一个统一的输出接口,而输入类型不可预知(如Android中的Adapter)。(3)创建一个可以复用的类(如Android中的Adapter),使得该类可以与其他不相关的类或不可预见的类...
2017-06-18 21:54:28
3054
原创 Android开发——Protocol Buffer的使用(比XML、Json快很多)
0.前言最近的项目里有用到Protocol Buffer,Protocol Buffer是Google公司开发的一种数据描述语言,类似于XML,是一种结构化数据的数据存储格式,可用于数据传输量较大的即时网络通信IM等场景。之所以使用它,说明它是有不可替代的优势,这里借用CarSon的一张图来说明:Protocol Buffer主要的优势在于三点:(1)体积小速度快。像XML这种报文是基于文本格式的...
2017-06-11 18:06:38
2682
1
原创 Android开发——View的生命周期总结
0.前言今天看到一个概念是View的生命周期,有点懵逼,听说过Activity的生命周期,Fragment的生命周期,对View的生命周期好像没什么概念啊。难道layout、draw这些也算是生命周期的方法吗?因此查阅、整理了一些资料,有了此文。1.View生命周期相关方法View的生命周期从构造方法开始依次执行以下几个方法,该View的可见性为默认值时:(0)Constructors()Vie...
2017-06-03 22:44:58
12866
2
原创 Android开发——监控造成UI卡顿的原因
0. 前言Android只有主线程才能更新UI。如果界面1秒钟刷新少于60次,即FPS小于60,用户就会产生卡顿感觉。Android使用消息机制进行UI更新的,如果在主线程handler的dispatchMessage方法进行了耗时操作,就会发生UI卡顿。本文原创,转载请注明出处:1. dispatchMessage方法在哪dispatchMessage()是在Looper.loop()里调...
2017-05-29 21:13:40
7777
8
转载 Android开发——关于RxJava的知识总结
0. 前言RxJava在主页上的介绍://a library for composing asynchronous and event-based programs using observable sequences for the Java VM.//一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。大家都知道异步代码经常会既难写也难被读懂。这时候RxJava的优势就来了,随着程序逻辑变得越来越复杂,它依然能够保持简洁。初学RxJava只要把握两点,观察者模式和异步。
2017-05-23 20:05:08
1100
1
原创 Android开发——收集应用Crash信息到服务器
0. 前言无论是多么完美的应用,总会有Crash的时候,那么收集应用的Crash信息到服务器对开发人员修补BUG来说尤为重要。本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/533119311. 实现原理我们可以自定义我们的CrashHandler类实现接口Thread.UncaughtExceptionHandler...
2017-05-14 22:18:33
1267
原创 Android开发——Material Design系列之TextInputLayout
0. 前言 TextInputLayout 继承于 LinearLayout,专门用来包裹 EditText或EditText的子类,当用户进行输入动作的时候我们设置的android:hint 属性值会作为提示以动画的形式运动到输入框左上角,错误信息也显示在输入框的下方。有些输入验证是在后台做得,产生错误后再反馈给前台,这样非常耗时而且用户体验差。TextInputLayout则完美的解决了这个...
2017-05-07 13:10:27
1987
1
原创 设计模式——责任链模式详解
责任链模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到某个对象处理了这个请求。 责任链模式的使用场景:多个对象可处理同一个请求,但是到底谁处理要动态决定。但是还是要向多个对象中的一个提交请求。...
2017-05-04 13:06:34
1921
转载 Android开发——带你彻底理解 Window 和 WindowManager
0. 前言 有时候我们需要在桌面上显示一个类似悬浮窗的东西需要用Window来实现,Window是一个抽象类,表示一个窗口,它的具体实现类是PhoneWindow,实现位于WindowManagerService中,它的职责就是管理系统中的所有窗口。窗口在 Android 中就是绘制的画布Surface,当一块Surface显示在屏幕上时,就是用户所看到的窗口了。WindowManagerSer
2017-04-25 21:58:40
2474
原创 数据结构——搜索树树、B-树、B+树
二叉搜索树满足以下几个特性(1)所有非叶子结点至多拥有两个儿子(Left和Right)(2)所有结点存储一个关键字(3)非叶子节点的左/右子树上的任意节点值都小/大于该节点上的值二叉搜索树的搜索从根节点开始,如果查询的关键字与结点的值相等则命中;否则比较要查询的关键字和该节点结点值的大小,根据大小进入左/右节点继续搜索;如果左节点或者右节点为空,则找不到相应的关键字。...
2017-04-22 20:29:21
1789
3
原创 Java技术——CopyOnWriteArrayList源码解析
0. 前言 CopyOnWriteArrayList是一个线程安全,读操作时无锁,但是写操作有锁的ArrayList。是读写分离思想的体现。实现原理是当某个线程要修改List中的元素时,会把列表中的元素Copy一份,然后在新数组中对元素进行修改,最后把新元素赋值给原来的List的。这样就可以实现读操作不需要加锁。JDK1.5开始Java并发包提供了CopyOnWriteArrayList和Cop
2017-04-16 21:20:00
1721
2
原创 Android开发——本地验证码的简易实现
0. 前言 验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码。验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,有人说其实可以在服务器端对该终端进行登录间隔检测,如果间隔太短可以展示拒绝的姿态。但是还是本地验证码作用更加实在,可以减轻服务器端的压力。这篇将使用自定义View来实现一个如下效果的简易本地验证码。算是对自定义View知识的复习吧。...
2017-04-13 11:49:12
4014
12
原创 Java技术——Java中的参数传值方式
0. 前言 昨天10号晚上迎来了今日头条视频面试三连击(Android开发实习生),每场都50都分钟,而且问的问题有些确实有点难(头条的工程师水平确实有点高,面BAT的时候都没这么大压力),不过今日头条是我见过招聘效率最高的公司,第一场面试结束后面试官会让你不要离开视频间,等待HR通知,一般HR在10分钟你就会打电话告知你一面过了,马上开始第二场面试。就这样进行了三轮视频面试,结果差强人意,三面
2017-04-11 18:35:31
15096
12
Java实现文件的Zip压缩解压缩(可以加解密)
2016-10-18
APK权限修改器(免Root)
2016-10-18
东南大学校庆论文
2016-09-27
求APK权限修改器(免Root)的源码
2016-10-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人