BennuCTech

其他

Android进程间大数据通信:LocalSocket

前言说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。那么我们如何在进程间传输大数据呢?Android中给我们提供了另外一个机制:LocalSocket它会在本地创建一个socket通道来进行数据传输。那么它怎么使用?首先我们需要两个应用:客户端和服务端服务端初始化override
2023年4月24日
其他

细说Android的事件分发机制

前言Android的事件分发机制也是老生常谈了,本文从细节入手解读一下整个机制中的几个重要部分。Android中touch事件一定是从ACTION_DOWN开始,所以ACTION_DOWN的处理至关重要,我们先来看看ACTION_DOWN这个事件相关的细节。dispatchTouchEvent说到Android事件分发,一定绕不开dispatchTouchEvent函数,View和ViewGroup的该函数有很大的不同。我们来看看ViewGroup的dispatchTouchEvent函数,它的部分源码如下:@Overridepublic
2022年6月23日
其他

说一说Flutter组件的生命周期、State管理及局部重绘

生命周期flutter的生命周期其实有两种:StatefulWidget和StatelessWidget。这两个是flutter的两个基本组件,名称已经很好表明了这两个组件的功能:有状态和无状态。(1)StatelessWidgetStatelessWidget是无状态组件,它的生命周期非常简单,只有一个build,如下:class
2022年6月21日
其他

Android 12 新功能:SplashScreen优化启动体验

12上,显示在启动界面中间的图片会有一个圆形遮罩,所以在设计图片或动画的时候一定要注意,比如上面我的例子,动画其实就没有显示完整。对此官方给了详细的设计指导,如下:应用图标
2022年1月20日
其他

你都知道么?Android中21种drawable标签大全

前言我们在drawable目录下可以创建很多自定义的资源,其中用的最多的应该就是selector和shape。目前在Android中有21种drawable标签,了解和利用这些标签对我们的开发有很大的帮助。这个文章我们对这21种标签做一个介绍,让大家有一个印象。本文中有些资料取自网上,当时记录在笔记中,但是由于时间久远,忘记出处了。shape这个大家非常熟悉,简单列举一下属性和子标签,至于子标签的属性和具体使用就不细说了,网上有的是自身属性android:dither
2021年12月20日
其他

一文搞懂RSA算法原理及简单实现

前言RSA算法是最重要的算法之一,它是一种非对称加密,是目前最有影响力的加密方式之一。这篇文章我们通过实现一种简单的RSA加密来探究它的原理。计算公钥和私钥RSA中的公钥和私钥需要结合在一起工作。公钥用来对数据块加密,之后
2021年12月17日
其他

Android事件分发溯源详解

前言前两天华仔给我出了一道难题,我们俩研究了小半天,借着这个契机正好回顾了一下Android事件分发的相关知识点,于是有了这篇文章。Android事件分发机制大家都非常熟悉,大部分文章对这个过程的描述都是开始于Activity,但是事件是怎么传到Activity的?这里就涉及到几个重要的部分:Window,WMS,ViewRoot和DecorView。如果要理解事件分发的源头,就需要搞明白他们之间的关系,所以我们先来看看它们到底有什么关系?WindowWindow是我们比较熟悉的,那么它是如何创建的?我们来看Activity的attach函数:@UnsupportedAppUsagefinal
2021年12月3日
其他

实现一个通用的中英文排序工具

前言利用Collator类可以轻松实现排序,但是我们可能有各种model都需要进行排序,这样就会有一个问题,如果单独为每个model写一段排序代码,代码重复量很大。所以我打算写一个通用的工具,使用泛型+注解+反射的方式来解决。注解首先创建注解类@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD,
2021年11月23日
其他

Android中的资源复用小技巧

前言做了很多项目,发现每个项目里都有大量的相似图标,比如每个颜色一种、每个角度一种(左箭头、右箭头)等等,虽然这些图标很小占用不了太多资源。但是当我们需要change的时候就得一个个去替换,其实在android里有很多小技巧可以让这些资源进行复用,减少体积的同时也可以使项目结构更加清晰。这里总结的一些比较常用的复用,包扩:自适应、变色、旋转、阴影、组合、透明度、剪裁、留白等svg矢量图android5.0之后android就开始支持svg矢量图了,是drawable的vector标签。使用矢量图的好处是不用在为不同的分辨率提供不同的切图了,而且能保证显示清晰度。在android
2021年11月22日
其他

Android事件分发机制之ACTION_DOWN

前言Android的事件分发机制也是老生常谈了,这篇文章并不是笼统的介绍这个机制,而是针对ACTION_DOWN这个事件探讨相关的细节。dispatchTouchEvent说到Android事件分发,一定绕不开dispatchTouchEvent函数,View和ViewGroup的该函数有很大的不同。我们来看看ViewGroup的dispatchTouchEvent函数,它的部分源码如下:@Overridepublic
2021年11月19日
其他

说一说Android事件分发中的requestDisallowInterceptTouchEvent

前言我们知道在事件分发过程中是存在一个拦截机制的onInterceptTouchEvent复制代码当它返回true则不向下分发事件,否则向下分发。但是在这个过程中,还有一个参与者:requestDisallowInterceptTouchEvent,这个函数直接影响事件的拦截。我们今天就来说一说这个这个函数是如何影响事件分发的。源码分析我们先看看这个函数的源码@Overridepublic
2021年11月18日
其他

解决Webview加载不完全导致部分js无效

问题出现有两种情况:一种情况是打开activity时webview开始加载页面,但是发现加载了一部分后就停止了,余下的一直不再加载。但是当关闭这个activity时发现webview又继续加载了。第二种情况是webview正常加载,但是进行操作时发现有些操作没有反应。比如接入支付宝国际sdk,未装支付宝app而使用h5页面时出现点击无反应的情况。问题解析进过反复测试发现,是因为有两个含有webview的activity:activityA和activityB。在activityA的onPause和onResume中分别有mWebView.pauseTimers()和mWebView.resumeTimers(),但是activityB中没有。先打开activityA加载web页面,然后打开activityB,因为activityB没有resumeTimers,他的部分js未成功加载,所以出现上面的现象。问题根源问题的根源就是WebView的pauseTimers()和resumeTimers()这两个方法。它们的源码及注释如下/**
2021年11月17日
其他

安装使用Frida在Android上进行hook

前言我们对Android应用进行hook最常用的就是Xposed,它相对来说更加完善,而且有强大的社区和丰富的插件。而Frida则于Xposed不同,它是一款轻量级的Hook框架,可用于多平台,相同的是它依然需要root环境。本文就以Android为例来详细说说如何安装并使用它。PC端首选要在电脑上安装Frida,官方的安装步骤是pip
2021年11月12日
自由知乎 自由微博
其他

RecyclerView局部刷新机制——payload

这篇文章其实之前就完成了,一直遗忘在角落里了,今天无意翻之前的笔记发现的,大部分内容应该还是有效的。之前在使用RecyclerView的遇到过一个问题,使用notifyItemChanged刷新数据的时候会出现重影或者闪烁的现象。这个问题很容易出现,当我们的列表中有进度显示(比如下载),这时候需要不停的更新进度,就需要使用notifyItemChanged使用notifyItemChanged可以只刷新那一个item,这样就避免了像ListView那样全部刷新但是如果使用notifyItemChanged(position),在滑动的时候刷新就会出现重影或者闪烁的问题。解决这个问题很简单,将notifyItemChanged(position)替换为notifyItemChanged(position,0)即可。测试问题确实解决了,但是为啥?这个参数有啥用?源码分析我们从源码入手来看看public
2021年10月29日
其他

Android逆向:resource.arsc文件解析(Config List)

resource.arsc是APK打包过程中生成一个重要的文件,主要存储了整个应用哦中的资源索引。但是这个文件是一个二进制文件,并不可读,所以本文就通过解析它的二进制内容来读懂这个文件。Resource.arsc结果我们先来看resource.arsc的整体结构,如图:这张图的原型是网上的一张神图,但是由于神图年代久远,结构表现的不够清晰,而且比较旧了,缺少了一些新的东西,所以我根据神图自己又重新整理了一张架构图,其中新的东西是指Dynamic
2021年10月28日
其他

Android逆向:二进制xml文件解析(Start Tag Chunk)

在Android中,xml文件经过编译后都是不可读的二进制文件。今天我们来解析一下这个二进制文件的内容,看看如何与我们的源码进行对应。XML文件结构在Android中,xml文件经过编译后都是不可读的二进制文件。它的结构如图:简单说一下大概的结构:Header
2021年10月27日
其他

Flutter如何与Native(Android)进行交互

上一篇文章Flutter混合开发:Android中如何启动Flutter中我们介绍了如何在Native(Android项目)中启动Flutter,展示Flutter页面。但是在开发过程中,很多时候并不是简单的展示一个页面即可,还会涉及到各种交互,比如传递一些消息。本篇文章就简单介绍一下Flutter与原生Native的三种交互方式:BasicMessageChannel、MethodChannel和EventChannel。BasicMessageChannel虽然说是三种交互方式,但是其实本质都是一种,这个我们后面会解释。先来看看BasicMessageChannel。它可以实现双方交互,发送一些简单消息,消息类型Object,但是并不是所有Object都可以,基础类型及基础类型的数组、list、map是可以的。这个可以参考BasicMessageChannel的源码:
2021年10月26日
其他

Flutter混合开发:Android中如何启动Flutter

flutter可以独立完成项目,但是在现有项目情况下最好的方式就是混合开发,逐步过渡。这样就会共存native和flutter代码,而其中最关键的就是native如何启动flutter页面,及flutter与native如何交互。本文以Android为例,展示如何在一个现有项目中引入flutter、启动flutter,如何加速启动以及如何传参。引入flutter在现有的Android项目中,新建一个flutter
2021年9月14日
其他

Flutter:Navigator2.0介绍及使用

═══════════════════════════════════════════════════════Navigator.onGenerateRoute
2021年8月6日
其他

Flutter 中的Error的捕获及处理

}}在App下的builder中,自定义一个error页面,然后赋值给ErrorWidget.builder即可。这样再出现错误的时候就可以展示一个友好的页面。无法捕获的错误假设一个
2021年8月5日
其他

Jetpack:使用 ActivityResult 处理 Activity 之间的数据通信

前言本文先介绍ActivityResult的基本使用,最后会通过源码来探讨背后的原理。在Android中,我们如果想在Activity之间双向传递数据,需要使用startActivityForResult启动,然后在onActivityResult中处理返回,另外申请权限也是类似的步骤。但是这样的处理方式会让我们的代码变得非常复杂,并且也无法保证在
2021年7月29日
其他

Android App Bundle:动态功能模块

),将该应用部署到连接的设备。如果您的应用项目包含一个或多个功能模块,您可以通过修改现有的运行/调试配置以选择需要在部署应用时包含的功能,具体操作步骤如下:从菜单栏中依次选择
2021年7月28日
其他

Android中使控件保持固定宽高比的几种方式

我们在android开发过程中可能会遇到一种情况,一个组件需要保持固定的宽高比,但是组件本身大小却不定。比如我们需要让一个组件宽度与屏幕宽度一致,这样就无法确定宽度。那么如何让控件保持固定宽高比?有几种方法供大家选择。自定义View自定义view,重写onMeasure或onLayout等相关方法,通过预定的比例计算宽高。下面是简单示意:@Override
2021年6月29日
其他

细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4

将自动使用此功能。如果不支持,系统会自动使用默认安装方法。https://developer.android.google.cn/about/versions/11/features运行以下
2021年6月24日
其他

Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)

生命周期flutter的生命周期其实有两种:StatefulWidget和StatelessWidget。这两个是flutter的两个基本组件,名称已经很好表明了这两个组件的功能:有状态和无状态。(1)StatelessWidgetStatelessWidget是无状态组件,它的生命周期非常简单,只有一个build,如下:class
2021年6月12日