自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

知识应该共享,创造才应收费

尽我所能,尽我所知。

  • 博客(148)
  • 收藏
  • 关注

原创 生成式UI 动态化SDK的研发(一)--使用DSL定义生成式UI界面

DSL(Domain-Specific Language,领域特定语言)是一种专门针对特定问题领域设计的编程语言。通常用来表达特定领域的意图和规则,使编写、阅读和维护代码的过程更加高效和直观,让代码更接近自然语言,从而增强代码的可读性和维护性。我们可以有很多方式定义DSL,比如使用HTML,CSS,XML,JSON等来作为DSL的描述语言,目前在业内主要有使用的是CSS,JSON(阿里的GaiaX使用),京东,美团使用的XML。

2024-10-28 22:01:44 770 1

原创 生成式UI 动态化SDK的研发--开篇

本系列文章提供了另外一套方案,从0到1实现一个生成式UI 动态化SDK,作为大模型生成式UI的描述语言,即提供一套DSL,训练大模型能生成我们定义的DSL,然后下发到端侧容器渲染。

2024-10-24 23:20:00 923

原创 Android手机投屏方案实现方式对比

镜像模式,直接把手机上整个界面原封不动进行投射。这类投屏通常是对手机进行录屏,然后编码成视频流数据的方式给到接受端,接收端再解码播放,以此完成投屏功能。比如AirPlay的镜像模式、MiraCast、乐播投屏等;推送模式,播视频的场景比较常见。即A把一个视频链接传给B,B自己进行播放,后学A可以传输一些简单控制指令。比如DLNA协议等;基于特殊协议投射部分应用或部分功能,车载领域居多。比如苹果的CarPlay、华为HiCar、百度CarLife等。蔚来手机的投屏视频。

2024-09-28 17:00:26 1409

原创 Android Studio Gradle 莫名问题解决(元素类型 “breakBuildOnBinaryIncompatibleModifications“ 必须由匹配的结束标记)

本文主要介绍android studio在构建项目时出现的奇怪问题以及这类问题的分析和解决办法。

2024-07-25 15:05:04 377

原创 Ubantu安装电脑控制手机投屏软件screen copy

ubantu的命令安装手机投屏软件是旧版本的,可能会有一些问题,而且无法做到实时更新,比如scrcpy新版本发布了,使用上面的方法是无法更新到最新版本的,所以本文将介绍一种源码安装的方式。

2024-07-25 10:34:37 500

原创 Android Jetpack Compose 实现一个电视剧选集界面

我们经常能看到爱奇艺或者腾讯视频这类的视频APP在看电视剧的时候都会有一个选集的功能。如下图所示这个功能其实很简单,就是绘制一些方块,在上面绘制上数字,还有标签啥的。当用户点击对应的数字式时可以切换到对应的剧集。如果剧集太多,屏幕展示不完,就可以滑动屏幕查看更多的剧集,就这么一个很简单的UI小组件。我们使用Compose来实现下。本文主要介绍的是一个剧集选集的功能,这里只是介绍了实现的方式,比较粗糙,读者可以按照自己的需求修改,有更好的实现方案也可以在评论区交流。

2024-06-11 18:46:40 730

原创 Android gradle kts 8.0以上版本配置签名和修改APK输出名字

之前写过一篇文章是通过Kotlin的Dsl结合gradle编写的插件来管理项目依赖,我是从一个开源项目叫DanDanPlayAndroid项目上学到的,那时还没有使用toml文件来管理项目依赖的技术。不过虽然现在有了toml文件管理依赖的技术,但我觉得使用插件的方式也很好,读者自己选择吧。这里提这个插件的原因就是在插件中涉及到修改输出的APK名字和签名配置的问题,在最新的gradle kts 版本中,这些配置有点小变化,所以在此处记录下。

2024-06-05 20:42:41 2614 1

原创 过去的六年,教会了我很多事

然后就开始面试阿里,面了五面,都通过了,我以为百分百能进阿里了,我花名都想好了,然后提了离职。当我觉得自己无所不能的时候,紧接着就收到了报应,领取了人生中的第一次失恋体验卡,我那时觉得世界崩塌了,因为我拼命赚钱,努力变得更好,都是想让那个自己喜欢的人为我而感到骄傲,我甚至都忘了,那含辛茹苦养育我长大的父母。

2024-05-29 13:17:26 791 1

原创 基于Ubuntu的Bash脚本实现SystemUI的编译真机验证

当开发SystemUI的时候,开发完一个需求后需要到真机上验证,虽然SystemUI模块开发最后的产物也是APK,但是这个APK 却不能单独安装查看效果,因为SystemUI是系统级别的应用,需要放置到系统指定的目录下。然后再通过top命令找出SystemUI的进程,使用kill命令杀一次进程让其重启,这样我们的修改才能生效。这个过程比较的繁琐,如果每次修改都需要操作这么多的步骤,那么效率就很低了,所以本文介绍使用bash脚本的方式,将这一系列的操作通过bash脚本描述出来,我们下次修改完SystemUI代

2024-05-27 13:22:25 451

原创 使用Java 将字节数组转成16进制的形式

在很多场景下,需要进行分析字节数据,但是我们存起来的字节数据一般都是二进制的,这时候就需要我们将其转成16进制的方式方便分析。比如在做音视频的时候,需要看下我们传输的视频h264数据中是否有对应的I帧或者B帧等数据,做ASM插桩的时候,可以使用输出类结构的16进制辅助分析了解问题。测试投屏的时候尤其有用,比如说投屏到电视上后,发现没有画面,或者是画面很卡顿,这时候就需要对我们传输的视频数据做分析,所以我们将视频的数据转成16进制的形式,并且以一定的格式输出,可以很方便的帮助我们定位问题。

2024-05-26 19:14:38 1344

原创 设计模式之创建型模式---原型模式(ProtoType)

在有些系统中,往往会存在大量相同或者是相似的对象,比如一个围棋或者象棋程序中的旗子,这些旗子外形都差不多。使用原始创建对象的方法会很耗时,而原型设计模式会让对象的生成高效很多,本文将介绍原型设计模式

2024-05-22 13:39:57 1009

原创 Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

开发SystemUI时,使用内存为16G的主机,Ubuntu 20.04的系统编译SystemUI的源码,编译的过程中发现电脑卡顿,鼠标不能移动。必须重启电脑才可以使用,如果继续编译代码,还是会出现卡顿的问题,严重影响开发效率。最后通过设置交换分区解决了这个问题。本文介绍的就是如何发现及解决这个问题。

2024-05-11 21:08:33 1331

原创 使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

我们都知道Android的系统源码量非常之大,大致有frameworka层源码,硬件层(HAL)源码,内核层(Kernel)源码,之前了解到大佬看源码都是使用Source Insight,所以我也去学着使用Source Insight 看android的源码,但是作为一个六年的android应用开发来说,Android Studio的使用已经深入骨髓,再去联系使用Source Insight非常不适应。那能不能使用Android Studio去看源码呢?

2024-05-02 18:26:00 1667 1

原创 Android AOSP探索之Ubantu下Toolbox的安装

由于最近需要进军android的framework,所以需要工具的支持,所以在此记录下从同事那里学来的ubantu 系统下Toolbox的安装,分享给准备研习android的小伙伴们

2024-05-01 21:47:59 1051 4

原创 ASM字节码操作库---入门环境搭建

ASM可以对字节码数据做修改,然后生成一份新的字节码文件,而且ASM还可以在什么都没有的情况下,直接生成一个.class文件。本文的demo就是演示这个场景,除此之外,ASM还能做分析操作,分析操作是指它可以对一份字节码做分析统计的操作,但是不生成新的字节码文件,也就是说它只是单纯分析,不做任何修改。本文使用JAVA语言作为ASM的演示demo。

2024-04-27 11:19:33 914 2

原创 Flutter开发之--初识Flutter

Flutter 是由Google公司研发的一种跨端开发技术,在2018年正式推出。Flutter自带Skia图形绘制引擎,采用自绘制的方式,不管是在Android还是IOS上,Flutter都统一使用Skia引擎进行绘制,因此两端的渲染过程完全一致,能够实现像素级别的双端一致性。在执行效率方面,众所周知,不管是哪个跨端框架,执行效率通常都是低于原生的。但是Flutter的执行效率接近原生。

2024-04-22 17:40:13 1288 1

原创 设计模式之创建型模式---工厂模式

工厂模式从名字就能看出,这种模式是用于创建对象的,因为现实生活中,工厂就是用于生产产品的嘛。所以工厂模式的名字起得非常的贴近生活。工厂模式根据应用场景的不同,分为简单工厂,工厂方法,和抽象工厂三种。现实生活中的工厂有的可以生产几种产品,客户根据工厂提供的产品定制就行。比如生产A,B两种品牌的车。这种情况对应到工厂设计模式中就是简单工厂模式。用户只需要给工厂说我要A或者B品牌的车就行。

2024-04-19 11:57:18 957

原创 Android JetPack Compose+Room----实现搜索记录功能

搜索功能是很多APP都会重点维护的功能,因为搜索功能可以很好的帮助用户找到自己需要的内容,与此同时,为了增强用户体验,引入了搜索记录的功能,本文就是介绍一个基于Compose+Room搜索记录功的实现

2024-04-16 22:09:59 1400

原创 设计模式之创建型模式---建造者模式

建造者模式是一种广泛使用的设计模式,在三方开源库和各种SDK中经常见到。建造者设计模式在四人帮的经典著作《设计模式:可复用面向对象软件基础》中被提及,它的定义为,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式目前主要有两种,一种是经典的建造者模式,另外一种是变种的建造者模式。本文就是介绍建造者模式的两种形态的Java实现。

2024-04-09 21:15:54 1280

原创 Android自定义View 实现一个带音效和震动的SeekBar

SeekBar的出现是为了方便用户设置值,用户通过滑动然后就可以设置值,系统提供了一个SeekBar,但是不太美观用户体验也不好,所以本文介绍了设计一个带音效和震动效果的SeekBar,增强用户体验

2024-03-23 18:23:51 742 1

原创 使用Android Native Hook技术解决VLC播放器闪退的问题

在做公司的一个TOB的需求时,发现调起Unity提供的3D播放器播放网络在线视频时闪退了,然后就拉着相关部门的人一起分析问题,最后定位到是VLC里面用到的系统日志打印函数在部分的系统上会出问题,于是各部门的同事就开始想各种解决方案,当时主要是两个部门的同事提出了两种解决方案,一方面是系统部门的人提出直接在系统上改,因为ROM是我们自己的所以可以改系统的代码。禁用掉日志打印函数中引发闪退的部分,但是这样就会导致其他APP使用这个日志打印函数时就无法获取到日志了。但也不失为一个解决办法。

2024-03-04 20:35:33 1521 2

原创 Android AOSP源码研究之万事开头难----经验教训记录

做了四五年的android应用层开发后,想研究下底层源码的实现,所以想下载源码研究下,但是万事开头难,源码下载的过程非常坎坷,我使用的是双系统(ubantu 和windows),主机的固态只有1TB,而android的源码下载完一个版本也有几百个G。所以我想到了使用移动硬盘来保存下载的Android源码。也就是这个决定,让我折腾了两个多月。所以本文主要介绍整个下载源码编译到刷机的教训。

2024-02-08 00:47:52 1441

原创 Android Jetpack Compose 沉浸式状态栏的实现

说到沉浸式状态栏,很多小伙伴可能不太熟悉,其实让Android的状态栏的颜色和APP的主题颜色相同,给人感觉状态栏和APP就是一体的。沉浸式的状态栏让页面看起来更舒服,实现沉浸式状态栏也很简单,首先就是配置主题,然后设置状态栏的颜色,之前的博客中实现沉浸式状态栏是通过将状态栏的颜色设置成页面背景的颜色,这样状态栏就和背景融为一体了,但是这种办法在每个页面都需要设置一遍,非常废了,最好的 方式就是将状态栏设置成透明的颜色,然后将我们的页面"顶"到屏幕的顶部,而不是位于状态栏下面。

2024-02-05 13:18:26 3061 13

原创 Android Jetpack Compose之底部导航栏的实现

写过一段Android jetpack compose 界面的小伙伴应该都用过Compose的脚手架Scaffold,利用它我们可以很快的实现一个现代APP的主流界面架构,即一个带顶部导航栏和底部导航栏的界面架构,我们基于这个架构可以快速的搭建出我们想要的页面效果。而今天的文章就是要介绍如何实现一个有特点的底部导航栏。

2024-02-01 14:58:18 3520

原创 使用Android Compose实现网格列表滑到底部的提示信息展示

目前大多数的APP都会使用列表的方式来呈现内容,例如淘宝,京东,腾讯体育的评论区等都会使用列表布局。在Android传统的View中主要是使用RecyclerView控件来实现大量数据的展示。而在Compose中使用的是LazyColumn或者是LazyGrid组件。这些组件的使用都很简单,网上有很多的例子,不是本文的重点,本文的重点是介绍实现当我们需要展示的数据展示完了后,即列表滑动到最底部的时候,我们需要展示给用户一个提示信息:比如:”已经到底“。

2024-01-09 14:09:45 1502

原创 Git命令之本地分支与远程分支支关联/解除关联

在实际的工作生活中,往往需要将本地的分支和远程分支关联,这样我们就可以使用git pull命令来更新拉取最新的代码,但是有时候会出现运行命令后报错:Your configuration specifies to merge with the ref 'refs/heads/xxx'from the remote, but no such ref was fetched.

2023-12-14 17:20:29 1847

原创 Jetpack Startup 优雅完成库的初始化和方法接口简化

Startup允许库的开发者和App的开发者共享一个ContentProvider,用于完成各自的初始化逻辑,并且支持设置组件之间的初始化顺序。因此可以做到无需用户调用初始化方法就能获取到安卓上下文

2023-12-13 20:19:53 979

原创 C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离

在本文中,我们将会学习如何使用Cmake工具创建一个项目,然后介绍如何在项目中添加和使用库以及如何将我们的库设置成可以动态切换的。这里可动态切换的意思是,使用命令切换,便于调试项目

2023-10-29 12:01:22 793 1

原创 C/C++宏定义和宏函数

作为Android的开发者,熟悉jni和C++是必须的,最近看到jni的代码中有很多的宏相关的知识点,去学习了解了下整理了本文,本文会介绍宏的定义,包括宏替换和宏函数,以及一些特殊的宏和命令符号

2023-10-27 13:25:16 728

原创 Android Jetpack Compose之生命周期与副作用

借助于Kotlin的DSL语言特性,Compose可以很形象地描述UI的视图结构,视图结构对应的是一棵视图树的数据结构,这棵树在Compose中称为Composition,Composition会在Composable初次执行时被创建,当在Composable中访问State时,Compose记录其引用,当State变化时,Composition触发对应的Composable进行重组,更新视图树中的节点,然后达到刷新UI的目的。

2023-10-11 13:22:41 1073

原创 C++指针的使用

C/C++的指针使用非常的广泛,也是一大难点,本文将介绍指针的使用,因为害怕每次看了又忘记,所以记录下。因为现在AR的兴起,C++也越来越火,因为OpenGL渲染基本都是用的C++,所以值得好好学习。

2023-10-01 20:51:45 1407

原创 Android 使用Kotlin封装RecyclerView

在一个开源项目上看到了一个Android Kotlin版的RecyclerView封装,个人觉得非常方便,所以就将这个封装摘了出来,记录下,方便以后使用,这个开源的项目叫[DanDanPlayForAndroid](https://github.com/xyoye/DanDanPlayForAndroid)点击链接可以查看具体的开源项目代码。

2023-09-30 22:58:48 1679

原创 C/C++跨平台构建工具CMake-----在C++源码中读取CMakeLists.txt配置文件中的内容

本文介绍如何在C++代码中访问CMakeLists.txt文件中配置的值,比如我们的程序中想要区分debug环境和release环境的时候就可以在CMakeList中添加配置,就像Android 的gradle 插件生成的BuildCongfig类一样,我们可以方便的用这个类的DEBUG和RELEASE来区分开发环境和正式环境

2023-09-30 18:30:15 1529

原创 C/C++跨平台构建工具CMake入门

本文主要是介绍在windows上搭建CMake的构建环境并基于MinGW编译工具编译跑通一个C++程序,并且提供给读者学习CMake的方法。并鼓励读者那能够使用博客的方式将自己的理解记录下来,否则过一段时间就忘了,本文的最重要的目的也是防止自己忘掉。故记录一下。

2023-09-29 23:05:57 652

原创 Android Jetpack Compose之确定重组范围并优化重组

Composable函数在进行重组时会尽可能的跳过不必要的重组,只对需要变化的UI进行重组。那Compose是如何认定UI需要变化呢?或者换句话说Compose是如何确定重组的范围呢。如果重组随意的发生,那么对UI的性能会是一个很不稳定的状态,时而好,时而坏。而且如果编写的UI代码有问题,那么重组将会带来状态的混乱,导致UI显示出错。所以弄清楚Compose重组的范围确定才能更好的避免重组的坑,并且可以针对具体的范围做优化,所以本文将介绍如何确定Compose重组及性能的优化

2023-09-26 13:23:55 471

原创 Android Jetpack Compose之UI的重组和自动刷新

在传统的View中,若要改变UI,需要我们修改View的私有属性,比如要修改一个TextView的文字,我们需要通过它的setText(“xxx”)方法去修改。而Compose 则是通过重组来刷新UI。在之前的状态管理的文章中也提到过重组的概念。本章主要就是介绍Compose的重组和刷新相关的内容。

2023-09-20 13:14:17 508

原创 Kotlin使用infix关键字构建高可读性代码

相比于Java语言,kotlin集各家所长,可以使用更少的代码,实现更复杂的需求,还能保持高可读性,infix 函数就是Kotlin提供了一种高级语法糖特性。可以增加代码的可读性

2023-09-17 10:58:15 157

原创 Android Jetpack Compose 使用 ViewModel

所以,在复杂的业务逻辑下,我们可以将Stateful的状态提到ViewModel中管理,这样Stateful Composable也就变成了一个Stateless Composable,通过参数传入不同的ViewModel即可替换具体的业务逻辑,大大增加了可复用性和可测试性

2023-09-13 13:22:32 1915 2

原创 Android Jetpack Compose之状态持久化与恢复

我们都知道remember可以缓存创建状态,避免因为重组而丢失。使用remember缓存的状态虽然可以跨越重组,但是不能跨Activity或者跨进程。比如横竖屏切换等ConfigiurationChanged事件发生时,假设没有重写对应的onConfigurationChanged函数,Activity就会被销毁重建,导致remember保存的状态丢失。为了解决这个问题,Compose提供了rememberSavable解决这个问题

2023-09-11 13:41:54 735

原创 Android Jetpack Compose 用计数器demo理解Compose UI 更新的关键-------状态管理(State)

假如我们把Composable的执行看成是一个函数的运算的话,那么状态就是函数的参数,输出就是生成的布局。由于唯一的参数决定唯一的输出,所以只有当函数的参数发生了变化,生成的布局才会相应的跟着变化。

2023-09-06 15:00:09 1460 1

SystemUI编译验证脚本

使用此脚本,可以在编写完SystemUI的需求后,连接真机,将脚本放到AOSP源码的根目录下,运行脚本,可以支持快编和全编。运行完脚本后,编译后的结果会自动推到手机并重启相关的进程,只需要运行脚本,就能在机器上看到自己修改后的SystemUI需求

2024-05-27

opengl-glm.zip

GLM是OpenGL Mathematics数学库,,它是一个只有头文件的C++库,兼容Windows,MacOS和Linux,它可提供与图形概念相关的类和基本数学函数,例如矢量,矩阵和四元数,它还包含各种工具类,用于创建和使用常见的3D图形结构,例如透视矩阵和视角矩阵

2023-05-02

glew-2.2.0.zip

GLEW(OpenGL extension wrangler),即OpenGL扩展牛仔,OpenGL是围绕一组基本功能和扩展机制进行组织的,随着技术的发展,扩展机制可以用来支持新的功能,所以GLEW 就是用来干这个活的,这个库适应的人群是OpenGL的研究者,对OpenGL感兴趣的入门者都可以。主要也是和OpenGL一起搭配使用

2023-05-02

SOIL2-1.3.0.zip

OpenGL 纹理图像加载库,使用人群:OpenGl 开发者

2023-05-02

premake-5.0.0-beta2.zip

安装SOIL2的工具,使用于想要集成SOIL2库的开发人员

2023-05-02

glfw-3.3.8.bin.WIN64.zip

用于在Windows,MacOs,Linux以及其他操作系统上负责将帧缓冲区中的内容绘制到屏幕中的窗口中的API,适用于在Windows电脑上做OpenGL开发的人群,包括学生,程序员以及对OpenGL 感兴趣的小伙伴

2023-05-02

sqliteSpy工具windows版本

查看Android上的sqlite生成的数据库文件

2022-10-15

Kotlin Base64编解码类

Kotlin Base64编解码类,可以对AES/DES的加密密文作编码和解码,防止出现加解密出错的问题。 encrypt before size: 16 encrypt after size: 24 使用DES作加密解密时,咱们会发现加密后的密码变长了,这样会直接导致加解密失败,而且会有乱码的情况。这时就需要Base64编码和解码,然后就可以使用了。 Base64 Des 加密= v�W�� �ZDž��.���Ou��� Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher at java.base/com.sun.crypto.provider.CipherCore.prepareInputBuffer(CipherCore.java:1007) at java.base/com.sun.crypto.provider.CipherCor

2022-10-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除