自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(171)
  • 资源 (8)
  • 问答 (3)
  • 收藏
  • 关注

原创 怎样解决 “ VMware Could Not Connect ‘Ethernet 0’ to Virtual Network ‘/dev/vmnet8’”

启动虚拟机时,右下角会弹出一个错误消息,并显示错误消息,并要求你阅读日志以获取详细信息。并且虚拟机系统(我这里是kali linux)上的以太网图标会显示一个x,其中只有“VPN Connections” 一个选项可用,总之你现在是无法连接到网络的。要解决此错误,您需要具有 sudo 权限才能修改相应的文件。打开并转到以下选项:,负责管理虚拟环境中的网络。单击虚拟网络编辑器后,它将提示你将自己身份验证为 sudo 用户。身份验证完成后,你将找到。在这里,可以添加、删除和管理虚拟网络设备。

2024-03-12 11:09:54 1051

原创 Android原生实现控件选择背景变色方案(API28及以上)

Android控件点击/选择后控件背景变色的实现方式有很多种,例如使用selector的xml文件实现。这里介绍一下另一种Android原生的点击/选择实现方案(API28及以上),也就是ColorStateListDrawable。ColorStateListDrawable是一个可根据不同状态显示不同颜色的Drawable。实现效果,选择前/选择后:这里我们利用继承LinearLayoutCompat的方式来实现:属性创建自定义属性: <attr name="carbon_

2023-10-09 16:58:49 544

原创 Android原生实现控件点击弹起效果方案(API28及以上)

之前在实现控件阴影时有提到过,阴影效果的实现采用的是Android原生的View的属性,拔高Z轴。Z轴会让View产生阴影的效果。拔高Z轴可以通过控制elevation和translationZ。我们之前是通过elevation来单纯的控制Z轴;而translateZ,除了控制Z轴,还可以用来控制动画效果,比如我们点击按钮时希望它有一个弹起的效果,就是借助这个属性来实现。

2023-10-09 15:46:31 281

原创 Android原生实现控件outline方案(API28及以上)

Android控件的Outline效果的实现方式有很多种,这里介绍一下另一种使用Canvas.drawPath()方法来绘制控件轮廓Path路径的实现方案(API28及以上)。

2023-10-09 14:23:36 622

原创 Android原生实现控件Ripple方案(API28及以上)

添加ripple相关的自定义属性...-- 两种类型的Ripple,background表示在控件背景上显示水波纹,borderless表示在控件背后显示水波纹 --></attr>

2023-10-09 11:04:01 424

原创 Android原生实现控件圆角方案(API28及以上)

Android控件的圆角效果的实现方式有很多种,这里介绍一下另一种Android原生的圆角实现方案(API28及以上)。我们利用ShapeAppearanceModel、MaterialShapeDrawable来实现一个圆角/切角的Button。实现效果如下图我们在的基础上实现为控件添加shape的功能.

2023-10-08 17:35:16 599

原创 Android原生实现控件阴影方案(API28及以上)

*** 阴影相关*//***/// 重点就是利用下面的属性:// 拔高Z轴可以通过控制elevation和translationZ。区别:// elevation:一般是写在 xml 文件中做静态配置,单纯的控制Z轴;// translateZ:除了控制Z轴,还可以用来控制动画效果,比如我们点击按钮时希望它有一个弹起的效果。// 由于我们只需要实现阴影效果,所以我们只关注elevation即可。// 表示光源的颜色。

2023-10-08 15:35:20 1011 1

原创 Android11 Wifi开启、扫描和连接

开启Wifi开关,Wifi开关是实现了监听,打开/关闭开关会回调至用于根据Switch控件的当前状态关闭或打开Wi-Fi。在方法的开始部分使用了一个变量,当该变量为true时直接跳出了方法。实际上,增加这个跳出条件的原因是因为Switch控件的状态变化可以有如下两种情况。直接单击Switch 控件。调用Switch.setChecked 方法。遗憾的是,上述两种情况都会触发方法的调用。不管是哪种方法使Switch控件的状态发生了变化,在中调用方法设置Wi-Fi状态都会再次触发方法的调用。当再次调用。

2023-09-15 18:44:02 1966

原创 APK安装过程解析

安装apk,本质上是通过系统的应用packageInstaller.apk来完成的。因此,我们需要查看的是packageInstaller的源码。

2023-09-14 15:06:32 552

原创 Android常用的工具“小插件”——Widget机制

Widget俗称“小插件”,是Android系统中一个很常用的工具。比如我们可以在Launcher中添加一个音乐播放器的Widget。在Launcher上可以添加插件,那么是不是说只有Launcher才具备这个功能呢?Android系统并没有具体规定谁才能充当“Widget容器”这个角色。它定义了一套完整的Widget添加/移除和显示机制,使得人人都能当“Widget提供者”,人人也都有资格做“Widget容器”。

2023-09-07 17:06:45 1715 1

原创 “系统的UI”——SystemUI

以StatusBar为例,来分析下Android系统具体是如何实现它们的。代码路径:frameworks/base/services/java/com/android/server。代码路径:frameworks/base/packages/SystemUI。通过我们知道是整个系统UI的“载体”,所以接下来将根据这一线索来把整个代码流程“串”起来。和其他很多系统服务一样,也是在中启动的。具体而言,会在适当的时机通知“系统已经就绪(),可以进一步运行第三方模块了”——这其中就包括将由启动的。

2023-09-07 14:23:44 794

原创 View体系简析

应用程序中的View框架如图所示。

2023-09-06 18:38:40 255

原创 GUI系统之“窗口管理员”——WMS

WindowManagerService(以下简称WMS)是做什么的?打个比方,就像一出由N个演员参与的话剧:SurfaceFlinger是摄像机,WMS是导演,ViewRoot则是演员个体。摄像机(SurfaceFlinger)的作用是单一而规范的——它负责客观地捕获当前的画面,然后真实地呈现给观众;导演(WMS)则会考虑到话剧的舞台效果和视觉美感,如他需要根据实际情况来安排各个演员的排序站位,谁在前谁在后,都会影响到演出的“画面效果”与“剧情编排”;

2023-09-04 17:33:50 170

原创 管理Activity和组件运行状态的系统进程--ActivityManagerService

AMS是Android提供的用于管理Activity和其他组件运行状态的系统进程,是编写apk用的最频繁的系统服务,由中启动,同时注册到。它和WMS都是“实名”的Binder Server。和WMS一样,AMS也是寄存于中的。它会在系统启动时,创建一个线程来循环处理客户的请求。值得一提的是,AMS会向登记多种如“activity” “meminfo” “cpuinfo”等——不过只有第一个“activity”才是AMS的“主业”,并由Activity实现;剩余服务的功能则是由其他类提供的。

2023-09-04 09:56:17 76

原创 FrameWork的概述与启动过程

Framework定义了客户端组件和服务端组件功能及接口。以下阐述中,“应用程序”一般是指“.apk”程序。框架中包含三个主要部分,分别为服务端、客户端和Linux驱动。

2023-09-01 18:22:55 387

原创 进程间通信-Binder

Binder是一种架构,这种架构提供了服务端接口、Binder驱动、客户端接口三个模块,如图所示。

2023-08-31 21:29:27 153

转载 Android 运行时资源替换----Runtime Resource Overlay实践

Android 10或以下版本在 Android 10 或更低版本中,系统是根据资源的名称进行资源替换,所以我们只需要在资源包中将需要替换的资源定义好即可。Android 11或以上版本在 Android 11 或更高版本中,Google推荐在『资源包』的res/xml 目录中创建一个文件,枚举出应覆盖的『目标应用』的资源值及其替换值。-- 更换颜色 --></overlay>注意,target标签中的color并没有带上@标记,他实际上仅仅是一个字符串而不是引用。

2023-06-01 18:07:27 2336 2

原创 基于Fragment的插件化

宿主App的Activity想要加载插件中的Fragment,一般需要在进入插件的Fragment时要使用插件的ClassLoader和Resource对象。这就要求我们替换ClassLoader和Resource。跳转FragmentLoaderActivity,并传递参数插件Apk的路径、插件Apk的Fragment1的完整路径。在Application的attachBaseContext进行初始化。在MainActivity的onCreate()里进行存放。

2023-05-30 17:45:02 992 3

原创 宿主启动插件中的BroadCastReceiver和ContentProvider

对于这里的静态广播插件化处理也同样不例外需要在宿主中预埋一个Receiver,只是该Receiver的作用不再是欺骗AMS,而单纯是在接收到对应Action的广播之后再转发给插件静态注册的广播接收器。对于静态注册在插件AndroidManifest.xml文件中的Receiver,宿主需要知道Receiver的className以及其对应注册的Action,这样在宿主中才能实现广播的中转;静态广播的注册信息保存在PMS中,动态广播的注册信息保存在AMS中。,填充的内容是所要访问的apk的包名。

2023-05-29 17:50:09 659

原创 宿主启动没有在AndroidManifest中声明的Activity/Service

我们需要做的是欺上瞒下的做法,也就是在AMS的startActivity方法中借助在宿主App的AndroidManifest.xml文件中声明的StubActivity,来临时替换掉真正要启动的插件Activity,然后在ActivityThread的Handler的事件中把StubActivity再换回插件Activity。在handleCreateService 方法中,可以通过CreateServiceData来获取要启动的Service的信息。问1:为什么不在unbind的时候欺骗AMS?

2023-05-26 18:13:40 1234 2

原创 Android 宿主启动插件中的Activity和Service

Activity则严重依赖资源文件,所以要想正确的显示插件中的Activity,必须解决加载插件中资源的问题。但是这样完成之后会发现,怎么明明代码中启动的是插件中的Activity,但显示的确是宿主中的Activity呢?把插件dex都合并到宿主的dex中,那么宿主App对应的ClassLoader就可以而加载插件中的任意类了。这样,插件Apk中生成的资源id就会以0x70开头,而我们的宿主Apk生成的资源id默认是0x7f开头。对象传递到插件中的Activity中去,并重写插件Activity的。

2023-05-25 14:15:50 782

原创 Android 动态加载资源

这里非常的关键,需要解释一下,首先AssetManager是资源管理器,专门负责加载资源的,它内部有个隐藏方法addAssetPath,是用于加载指定路径下的资源文件,也就是说你把apk/jar的路径传给它,它就能把资源数据读到AssetManager,然后就可以访问了。可以通过AssetManager对象去构造mResourcesImpl对象,之前也分析过资源访问是通过mResourcesImpl.getAssets().getXXX()方法来完成的,那现在就有办法解决加载外部apk资源的问题了。

2023-05-23 15:41:35 1365

原创 代理模式及对startActivity的Hook应用

简而言之,就是让代理类和目标类(被代理类)实现同一个接口,并让代理类持有一个目标类的对象,这样对代理类的访问,可以转移到目标类的访问中去。我们可以在不修改目标类的情况下,在代理类中实现一些功能的增强,从而间接的增强了目标类的功能。UML图如下:@Override// 完成一些事情@Override远程代理(AIDL)

2023-05-19 17:34:07 935

原创 Android 反射

首先我们有一个如下的测试类-接下来,我们通过反射来获取它的构造函数,以及公共/私有函数、属性等等。

2023-05-09 14:11:28 982

原创 Binder与 四大组件工作原理 Service、BroadCastReceiver、ContentProvider

你会发现,这段代码和前面介绍的handleLaunchActivity差不多,都是从PMS中取出包的信息packageInfo,这是一个LoadedApk对象,然后获取它的classloader,反射出来一个类的对象,在这里反射的是Service。对,Receiver的插件化解决方案,就是这个思路。你也许会问,都在一个进程,App内部直接使用Binder对象不就好了,其实吧,要考虑不在一个进程的场景,代码又不能写两份,两套逻辑,所以就都放在一起了,即使在同一个进程,也要绕着AMS走一圈。

2023-04-27 17:30:59 779

原创 Binder 与 四大组件工作原理 其一

ApplicationThread(APT)接收到来自AMS的消息后,调用AcctivityThread的sendMessage方法,向Launcher的主线程消息队列发送PAUSE_ACTIVITY消息,发送消息是通过一个名为H的Handler类完成的,AMS给Activity发送的所有消息,以及给其他三大组件发送的消息,都是经过H类,既然都经过这条路,我们就可以从这里做插件化技术。启动新进程,就是启动一个新的app,为这个进程创建ActivityThread对象,这就是我们熟悉的UI主线程。

2023-04-27 16:39:31 769

原创 修改framework层资源文件

【代码】修改framework层资源文件。

2023-04-20 15:31:28 898

原创 解决A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask

这种问题多半是版本不匹配造成的。gradle插件版本在根目录的。kotlin插件版本在根目录的。AS的kotlin版本在。

2023-03-31 14:58:36 6438

原创 Kotlin 结合 Room 报错 There are multiple good constructors and Room will pick the no-arg constructor.

我的Room版本当前是2.1.0;Kotlin版本当前是1.6.0;

2023-03-27 14:31:33 3021 2

原创 SQL 查漏补缺 CASE WHEN

不过,必须在 SELECT 子句和 GROUP BY 子句这两处写一样的 CASE 表达式,这有点儿麻烦。建表如下: StudentClub (std_id 学号, club_id 社团id , club_name 社团名, main_club_flag 主社团标志)注意,在发现为真的when子句时,case表达式的真假值判断就会中止,而剩余的when子句会被忽略。表中存储了学生和社团多对多的关系, 假如一个学生有多个社团, 则其中一个为主社团标志位Y , 其余社团或只假如一个社团的学生的标志为N。

2023-03-12 11:51:31 239

原创 SQL查漏补缺

有这么一道题,先看题目,表的内容如下显示GDP比非洲任何国家都要高的国家名称(一些国家的GDP值可能为NULL)。or发现第一种查询的问题在哪儿了吗?。这里有个知识点就是和的区别。

2023-03-11 14:01:29 1427

原创 SQL 查漏补缺

1.显示 GDP 至少为 1 万亿(1000000000000;即 12 个零)的国家/地区的名称和人均 GDP。将人均GDP舍入到最接近的 1000,即保留至千位【解析】round,第2个参数为正数时,表示保留几位小数;如果为负数时,表示取几位数字;select name, round(gdp/population,-3) from worldwhere gdp >= 1000000000000;2.查找1984年获奖者和主题,按主题和获胜者名称排序,并把化学奖和物理奖排到最后面显示。

2023-03-05 16:59:39 514

原创 adb常用指令合集

修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。category --指定 category,比如 android.intent.category.APP_CONTACTS。action --指定 action,比如 android.intent.action.VIEW。修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行。

2023-02-02 14:24:26 7923

原创 Material Design之CoordinatorLayout 与AppbarLayout与CollapsingToolbarLayout

该选项是enterAlways的附加选项,一般跟enterAlways一起使用,它的效果是:当ScrollView向下滚动时,子View会向下滚动,直到达到最小高度(到此为止是enterAlways的效果),然后当ScrollView滚动到顶部时,子View又会响应滚动事件,继续向下滚动,直到子View完全显示。它到底能帮我们做什么?我们要了解它,肯定是先看官方文档了。所以, AppBarLayout 其实更多的是作为一个中介,将兄弟节点的滚动事件传递给到其子View,让子View响应这些事件。

2022-11-20 16:45:31 1264

转载 Material Design 之Toolbar

如:很多 APP 里都有搜索功能,在Toolbar 上添加一个搜索框,如网易云音乐的搜索界面:

2022-11-20 15:40:08 379

原创 Binder连接池

如何使用AIDL在上面的一节中已经进行了介绍,这里在回顾一下大致流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法了。上述过程就是典型的AIDL的使用流程。现在考虑一种情况;公司的项目越来越庞大了,现在有10个不同的业务模块都需要使用AIDL来进行进程间通信,那我们该怎么处理呢?

2022-11-11 10:20:34 339

原创 IPC中的AIDL机制(二)

在了解了AIDL的流程及基本原理之后,我们还需要对AIDL有进一步的了解。在上一篇的例子的基础之上,我们考虑另一种情况:假设有一种需求:用户不想时不时地去查询图书列表了,太累了,于是,他去问图书馆,“当有新书时能不能把书的信息告诉我呢?”。大家应该明白了,这就是一种典型的观察者模式,每个感兴趣的用户都观察新书,当新书到的时候,图书馆就通知每一个对这本书感兴趣的用户,这种模式在实际开发中用得很多,下面我们就来模拟这种情形。

2022-11-10 20:52:41 909

原创 IPC中的AIDL机制

IPC是的缩写,含义是进程间通信或者跨进程通信,是指两个进程间进行数据交互的一个过程。IPC不是Andrord中所独有的,任何一个操作系统都需要有相应的IPC机制,比如Windows上可以通过剪贴板、管道和邮槽等来进行进程间通信,、Linux上可以通过命名管道,共享内容、信号量等来进行进程间通信。可以看到不同的操作系统系统有着不同的进程通信方式。对于Android来说,它是一种基于Linux内核的操作系统,他的进程间通信方式并不能完全继承自Linux,相反,它有自己的进程间通信方式。

2022-11-10 18:46:57 1013

转载 深入理解Android View 中的构造函数

在代码中创建View的时候用View(Context)当从XML inflate view的时候重写View(Context, AttributeSet)。对于那些仍和我一样想继续探究的人-让我们深入下去吧。本文不是应该讨论View的构造函数的吗?一般来说,你只需实现前两个(一个用于代码,一个用于XML inflation)。}}只需要这个两个参数的构造方法你就能随意的使用obtainStyledAttributes()了。

2022-10-21 10:24:22 254

原创 Scroller & ViewDragHelper工具类

凡是包裹在ViewGroup中的子控件,当我们需要实现拖动这些子控件的效果时,都可以考虑使用ViewDragHelper类。ViewDragHelper类提供了很多函数和跟踪状态,以便用户拖拽和重新布局其内部的子控件。

2022-10-17 18:58:32 512

ThreadBestPrices

该代码为Google官方推荐代码,用以说明在多线程中如何采用最佳的编程方式实现想要的功能。不太适合初学者查看,但对有基础的人来说,看后会有不一样的收获。

2019-03-29

Android编程实战

你是否从事Android操作系统开发,会创建简单的Android应用,但想进一步提升自己的开发技巧?你是否想深入挖掘Android操作系统的特性与功能,挑战现有开发水准?你是否正在想方设法创建高级、直观、创新的Android应用?毫无疑问,这本书适合你。, 本书从自定义视图、多点触摸手势讲起,到集成在线Web服务,进一步扩展到探索地理围栏和活动识别等新技术。作为一名经验丰富的Android工程师,Erik Hellman通过本书深入剖析了一些专业技巧、诀窍、容易绊倒开发者的陷阱,以及一些鲜为人知的技术:, 优化组件,以实现尽可能流畅的用户体验, 创建自定义视图, 全面理解Android SDK, 掌握Android Studio和Gradle, 使用Android音频、视频和图形API, 文本转语音以及语音识别项目, 充分利用新的Android位置API, 使用Android连接技术与远程设备通信, 执行后台处理, 使用Android加密API, 找到并安全使用隐藏API, 使用Google Play Service为应用启用云计算, 在Google Play Store中发布和销售应用

2017-09-25

Animations

各种我们经常见到的Animations~

2016-11-29

HandlerThread

handler+looper+handlerThread实践

2016-11-22

SQLite的实际应用

SQLite本地数据库的应用

2016-11-06

Fragment+ViewPager+GridView最佳实践

Fragment+ViewPager+GridView最佳实践,可以看看这篇博文~ http://blog.csdn.net/jxq1994/article/details/52984062

2016-11-01

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

TA关注的人

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