- 博客(143)
- 资源 (13)
- 收藏
- 关注
原创 实现 AIDL for HAL
本文通过在 vendor 分区使用 AIDL 实现 HAL 层 Led 控制,解决 framework 耦合带来的移植性问题。构建了基于 AIDL 的接口定义与服务实现,包含 ILed.aidl 接口、Android.bp 构建配置及 C++ 服务逻辑,利用 Binder 机制实现跨进程通信,并通过 vintf 配置确保兼容性与可移植性,最终生成可独立部署的 HAL 服务。
2026-10-19 17:49:49
113
原创 为 LedManagerService 添加区权限申请功能
本文介绍了在Android系统中定义与使用自定义权限的完整流程:首先在AndroidManifest.xml中声明权限,设置protectionLevel="dangerous"以触发运行时授权;其次在服务端LedManagerService中通过enforceCallingPermission强制检查权限;接着在SystemServer中注册服务;最后在PermissionController中配置权限组及描述文本,确保权限申请界面正确显示。整个过程实现了安全可控的系统级权限管理。
2026-10-13 16:39:16
84
原创 在 Android 系统中自定义 LedManagerService 服务并提供给 app 使用
本文介绍了在Android框架中添加LedManagerService的完整流程:首先创建AIDL接口ILedManager.aidl并定义服务接口,随后在Context中注册服务名称;接着实现LedManager管理类,通过ServiceManager获取远程服务。最后在services/ledmanager目录下实现LedManagerService,提供LED控制原生方法调用,并通过Android.bp配置构建依赖。整个过程实现了系统级LED服务的封装与访问。
2026-10-11 20:56:42
207
原创 Android 15 及以上版本创建系统级 app 并测试驱动
在 Android 15+ 系统中,通过 sharedUserId="android.uid.system" 结合白名单机制可实现系统级应用。推荐使用 Magisk 模块方式动态添加包名至 package-shareduid-allowlist.xml,无需编译系统镜像。配合 JNI 调用 /dev/myled 驱动,实现对硬件的直接控制,适用于开发系统级功能测试。
2026-09-28 21:40:32
265
原创 实现 Android 字符设备驱动
本文基于LineageOS 23.2(Android 16)和红米9(lancelot)平台,详细介绍了在MT6768芯片上开发并部署字符设备驱动的完整流程。通过创建myled驱动,使用miscdevice机制实现LED控制,并配置Kconfig、Makefile将其编译进boot.img。同时,通过修改sepolicy文件和ueventd规则,正确设置SELinux与UAC权限,确保驱动可访问。最终通过编译并刷入boot.img和vendor.img完成部署,为后续系统级应用测试奠定基础。
2026-09-28 21:04:38
213
原创 Windows 下使用 Appium
本文简要介绍了Appium的安装配置流程:1)通过npm全局安装Appium服务器;2)使用命令安装Android的UiAutomator2驱动并设置环境变量;3)下载Appium Inspector工具;4)提供基础配置文件示例,包含平台类型、设备信息、应用包名等必要参数。整个过程涵盖了从环境搭建到基本配置的关键步骤,为移动端自动化测试提供快速入门指导。
2026-07-23 16:01:29
58
原创 使用 python 源码搭建 conda 环境
为了避免新编译的 python 污染系统已有的环境变量,这里只需要设置 --prefix 参数(即编译出的 python 存放位置,注意:这个参数需要绝对路径,我是在当前目录下新建了一个文件夹:268)。另外,安装好后,我发现 anaconda 的环境中还有历史版本(可以通过 conda search python 查看),所以把 anaconda 的配置文件(通过 conda config --show 获得的)也一并贴在这里,主要是里面的 channels 配置。下载并解压后,在源码目录执行。
2023-08-28 13:53:13
3087
原创 React Native 解决 TextInput 设置 maxLength 后,拼音输入法无法输入的问题
解决 TextInput 设置 maxLength 后,拼音输入法无法输入的问题
2023-07-12 19:17:27
1710
原创 AGP 8.0 解决 ‘kaptGenerateStubsDebugKotlin‘ task (current target is 17) 问题
kaptGenerateStubsDebugKotlin
2023-05-07 15:34:01
14864
7
原创 Android Studio 设置强制项目依赖指定版本
在项目的主module的build.gradle的dependencies节点里添加configurations.all {},{}中的前缀是 resolutionStrategy.force ,后面是指定各module强制依赖的包
2022-04-30 21:31:23
3231
原创 git 问题 fatal: early EOF,fatal: index-pack failed
git clone 的时候报:fatal: the remote end hung up unexpectedly MiB | 4.00 KiB/sfatal: early EOFfatal: index-pack failed多是因为网速的问题,把最低网速和无响应时间配置一下:git config --global http.lowSpeedLimit 0git config --global http.lowSpeedTime 999999 #单位/秒...
2022-03-11 10:42:55
599
原创 chrome使用技巧
1.开启虚拟摄像头及允许 httpwindows 下:1.创建 chrome 快捷方式。2.打开快捷方式的属性,并修改目标输入框内容为:"C:\Program Files\Google\Chrome\Application\chrome.exe" --use-fake-device-for-media-stream --disable-web-security --user-data-dir=D:chrome3.保存,通过修改后的快捷方式打开 chrome 即可。2.网站不受信任在该网页空白
2022-01-26 16:20:06
1467
转载 git 不用clone整个远程仓库,只把特定的commit给fetch下来的方案
一个麻烦点就是,我需要阅读一个大点的开源项目,远程仓库的代码量太庞大了,如果我需要git reset --hard [commit sha1]感兴趣的commit快照,就首先得git clone整个远程仓库,时间需要等待太长,而且网络一旦有问题还会功亏一篑。所有有没有一种只拉取远程仓库中的某个commit呢?有。命令行如下:make a new blank repository in the current directorygit initadd a remotegit remote add
2021-11-08 16:52:52
1965
原创 HashMap 从 0 到 1(最容易理解的 HashMap 讲解)
前言**阅读提醒:**关于 HashMap 的原理网上有很多内容,这里提供一个全新的视角来看待 HashMap ,请耐心看下去,保证你彻底理解 HashMap。首先,按照一般的讲解模式会说 “HashMap 的意义就是实现一种快速的查找并且插入、删除性能都不错的一种数据结构。”,然后接着讲解 HashMap 的数据结构和实现快速的查找、插入、删除的方式。这种方式虽然理清了 HashMap 的原理,但总觉得和 HashMap 间,隔着一层若有若无的东西;所以,我们不妨换个角度,先不管 HashMap 的原
2021-04-18 10:32:43
609
原创 将 ReactNative 接入已有的 Android 项目
将 ReactNative 接入已有的 Android 项目环境:react-native 0.63,windows10 ,android-studio4.1.1第一步:首先按照官网 集成到已有的原生应用 的方法集成,这里还有一份中文版 集成到已有的原生应用注意:在集成过程中要注意以下几点。1.在执行 yarn add react-native 时可能不止有 react 的 warning ,我们需要把这些包都安装上。2. maven 仓库的地址需要修改成下面的样式,不能用文档中的路径(注意路
2020-11-18 14:35:09
782
原创 如何查看 Proxy 模式的 $ProxyX.class文件
在学习 Proxy 的实现原理时我们要查看 $Proxy0.class 的代码,由于 $Proxy0.class 是在内存中的,所以我们需要写到本地。废话不多说,方式如下:在调用动态代理的main方法中加上System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); System.ge...
2018-10-08 17:21:55
2386
转载 常用端口
转载自 https://www.cnblogs.com/thinkingthigh/p/4071612.html0|无效端口,通常用于分析操作系统 1|传输控制协议端口服务多路开关选择器 2|管理实用程序 3|压缩进程 5|远程作业登录 7|回显 9|丢弃 11|在线用户 13|时间 17|每日引用 18|消息发送协议 19|字符发生器 20|F...
2018-06-06 11:26:28
1936
原创 java Callable 实现原理分析
前言我们常用的创建线程方式一般有下面 2 种:继承Thread,重写run方法实现Runnable接口,重新run方法其实在 Executor 框架中还有一种方法可以实现异步,那就是实现 Callable 接口并重写call方法。虽然是实现 Callable ,但是在 Executor 实际运行时,会将 Runnable 的实例或 Callable 的实例转化为 Runnable...
2018-05-31 15:50:23
35886
1
原创 常用 Maven 仓库地址
在使用 Nexus 搭建自己的 Maven 仓库时,我们需要为一些公共的 Maven 仓库做镜像,这就需要这些仓库的真实地址了,下面是这些仓库的地址: 仓库名称 仓库地址 gradle 引用方式 jcenter https://jcenter.bintray.com jcenter() mavenCentral https://repo1.mave...
2018-05-22 15:12:10
53579
转载 java 枚举类型的实现原理
转载自 http://blog.youkuaiyun.com/mhmyqn/article/details/48087247Java从JDK1.5开始支持枚举,也就是说,Java一开始是不支持枚举的,就像泛型一样,都是JDK1.5才加入的新特性。通常一个特性如果在一开始没有提供,在语言发展后期才添加,会遇到一个问题,就是向后兼容性的问题。像Java在1.5中引入的很多特性,为了向后兼容,编译器会帮我们写的...
2018-03-13 15:13:51
1911
原创 关于腾讯玄武实验室公布的应用克隆漏洞的一些思考
2018-01-09 国家信息安全漏洞共享平台 公布了 《关于Android平台WebView控件存在跨域访问高危漏洞的安全公告》 另外,关于该漏洞的原理 这里 有个补充说明:从上文中我们可以看出是由于 WebView 的 file 跨域问题,使应用加载的 JavaScript 可以获取应用的 私有数据 (即 /data/data/packageName/ 下的文件)导致的这个漏洞
2018-01-12 13:03:07
3210
原创 通过一堂化学课来彻底理解 ThreadLocal
关于 ThreadLocal 相信很多读者都在网上看到了这样的介绍:ThreadLocal 为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,请允许我在这里向你提出这样一个问题:多线程共享资源时,资源往往是唯一的(如写入文件),而 ThreadLocal 会为每个线程提供一个相同的数据副本,明显和资源共享不一样,那么为
2018-01-09 16:03:47
659
原创 真正的一行注解获取Android23+权限 重要更新 接入优化
真正的一行注解获取Android23+权限 重要更新 接入优化前言由于部分读者反映 AbcPermission 的接入方式太麻烦,利用周末时间我写了个 gradle 插件用于简化接入流程。这里提供了 2 套接入方案:一为最简便的;另一个支持版本自定义(如果你一直用最新版,这个可以忽略)。AbcPermission 的概念 这里 有详细的讲解。这里是一次重要的升级,也可以直接看 AbcPermissi
2017-12-25 15:35:49
780
原创 一行注解处理Android23+权限 AbcPermission 重要更新
一行注解处理Android23+权限 AbcPermission 重要更新关于 AbcPermission 的概念 这里 有详细的讲解。但是在以前的版本中我们都不能对用户授权后进行回调,虽然用户只在初次授权的时候会多一次操作,但对用户体验影响不大。为了更加优化用户体检,从 V1.6 以后 AbcPermission 支持对 无返回值的方法 进行回调,并且其回调流程已统一整合在 AbcPerperm
2017-12-19 14:57:36
778
原创 真正的一行注解处理Android23+权限
真正的一行注解处理Android23+权限关于 Android 23 及其以上版本的权限获取库,github 上有很多比较优秀的开源项目,如:RxPermission,AndPermission,PermissionGen 等。似乎我们不需要再纠结 23+ 上的权限问题了,但是(开始转折)这些开源项目的权限处理都可以用下面的流程图表示:图一正如上图所示这些开源项目无论用什么技术封装的都需要我们实现红
2017-12-04 10:44:13
2065
原创 实现 AlertDialog 点击确定按钮不关闭
当我们在使用AlertDialog时,无论点击“确定”(PositiveButton)还是“取消”(NegativeButton),对话框都会消失,这在某些情景下是不合理的。例如下面这种情况:AlertDialog 里面有必填或必选项,当用户没有输入或选择时就点击了确定,这时对话框不应该消失的,而是应该提示用户完成填写或选择后才能进行下一步。关于 AlertDialog 实现上面的效果,百度了一下多
2017-07-19 16:52:10
3276
原创 Kotlin 从学习到 Android 第十三章 对象
对象表达式和声明有时,我们想创建这样一个对象:只对原有的类做稍微的修改,而不需要声明一个该类的子类。在 java 中可以使用匿名内部类实现,而在 kotlin 中可以使用 对象表达式 和 对象声明 来实现。对象表达式创建继承某种类型的匿名类的对象:window.addMouseListener(object : MouseAdapter() { override fun mouseClick
2017-06-15 22:09:22
954
原创 Kotlin 从学习到 Android 第十一章 枚举类、嵌套类 和 密封类
一、枚举类枚举类最基本的用法是实现类型安全的枚举:enum class Direction { NORTH, SOUTH, WEST, EAST}每一个枚举常量都是一个对象,枚举常量间以 “,” 分割。初始化因为每个 enum 都是 enum 类的一个实例,所以可以对它们进行初始化:enum class Color(val rgb: Int) { RED(0xFF0000
2017-06-13 23:11:48
1191
原创 Kotlin 从学习到 Android 第十章 扩展
与 C# 、Gosu 类似,Kotlin 也可以为一个类扩展一个新的功能,而不需要从类继承或使用任何类型的设计模式,如装饰( Decorator )。这是通过一种被称为扩展的特殊声明完成的。Kotlin 支持扩展函数和扩展属性。扩展函数声明扩展函数时,我们需要在函数名前加上一个接收类型,也就是被扩展的类型。例如:下面的代码为 MutableList 添加一个 swap 的新函数。fun Mutabl
2017-06-12 23:03:04
943
原创 Kotlin 从学习到 Android 第九章 可见性修饰符
类、对象、接口、构造函数、函数、属性和它们的 setter 都可以有可见性修饰符。( getter 总是与属性具有相同的可见性。)在 Kotlin 中有四个可见性修饰符: private , protected , internal 和 public。如果没有用修饰符修饰,默认是 public 。下面将介绍可见性修饰符在修饰不同类型时的作用:包函数、属性和类、对象和接口可以在“顶级”中声明,也就是说
2017-06-08 22:03:43
997
原创 Kotlin 从学习到 Android 第八章 接口
接口Kotlin中的接口与Java 8非常相似。它们可以包含抽象方法的声明,以及方法实现。与抽象类不同,接口不能存储状态。它们可以具有属性,但这些属性必须是抽象的,或者提供存取器实现。定义接口使用关键字 interface :interface MyInterface { fun bar() fun foo() { // 函数体是可选的 }}接口的实现一个类或
2017-06-07 21:50:53
1540
原创 Kotlin 从学习到 Android 第七章 属性和字段
声明属性在 Kotlin 中可以用 var 声明可修改属性,也可以用 val 声明只读属性:class Address { var name: String = ... var street: String = ... var city: String = ... var state: String? = ... var zip: String = ...}
2017-06-06 22:27:30
3425
原创 Kotlin 从学习到 Android 第六章 类和继承
类类在 Kotlin 中使用关键字 class 声明:class Invoice {}类的声明包括类名,类头(参数类型,构造函数等)和类体(花括号包裹的内容)。类头和类体都是可选的;如果一个类没有类体,那么花括号可以省略。class Empty构造函数在 Kotlin 中一个类可以有一个主要构造函数和多个次要构造函数。主要构造函数是类头的一部分,放在类名之后,并含有可选的类型参数。class
2017-06-05 13:51:48
979
原创 Kotlin 从学习到 Android 第五章 返回和跳转
在 Kotlin 中,有三种返回和跳转语句:return 从最近的一个封闭函数或匿名函数中返回;break 跳出最近的封闭循环;continue 继续执行最近封闭循环的下一步;上面这三个表达式也能够作为其他表达式的一部分:val s = person.name ?: returnbreak 和 continue 标签在 Kotlin 中任何表达式都可以使用标签,标签的格式为:标签名@,例如
2017-06-03 22:16:58
1202
原创 RecyclerView 上拉加载更多及滚动到底部的判断(上)
关于下拉刷新上拉加载更多,网上有很多例子;下拉刷新比较简单直接使用系统提供 SwipeRefreshLayout 即可,比较麻烦的是上拉加载更多,实现上拉的方法多种多样,这里对各个方法总结一下。需求分析RecyclerView 滚动到底部后,用户再往上拖拽(这里使用场景是拖拽,而不是手指离屏后的自动滚动到底部)时,RecyclerView 展示出 加载更多 的字样并请求更多的数据,请求成功后更新 R
2017-06-02 10:33:12
4562
1
原创 Kotlin 从学习到 Android 第四章 控制流
if 表达式在 Kotlin 中,if 是表达式语句,它可以返回一个值,因此在 Kotlin 中没有三目运算符(condition ? then : else)。// 传统的 if 用法var max = a if (a < b) max = b// 传统的 if 和 else 用法 var max: Intif (a > b) { max = a} else { max
2017-06-01 22:08:47
736
Android Support Percent Library
2015-07-02
ViewPager中使用FragmentPagerAdapter.notifyDataSetChanged无法更新当前Fragment解决方案
2016-03-14
Android studio plugins
2016-08-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅