Android存储相关
Android存储包括内部存储和外部存储。
内部存储英文:Internal Storage,属于系统自带存储空间的一部分,在手机内部。具体说就是除了后文要提到的 非ROOT下能看到并且读取的目录 外的所有手机内部的存储。
对于应用开发来说,内部存储主要关注以下2个目录:
/data/app : 应用程序安装的目录
/data/data: 该目录存放应用程序的私有数据
应用的安装目录应用安装的时候,系统 PMS (PackageManagerService) 进程会将 apk 文件复制到这个目录。
应用的私有目录应用安装完成之后,Android 系统都会在 /data/data 目录下用应用包名作为名字自动创建一个文件夹,这个文件夹就是应用的私有目录。
常用的私有目录有:
cache (/data/data/应用包名/cache)存放应用的缓存信息。获取 API :
1context.getCacheDir()
shared_prefs (/data/data/应用包名/shared_prefs)存放应用的 SharedPreference ...
Android Makefile中常用函数说明
filter语法:$(filter key1 key2,$(VAR))功能:从 VAR 中将包含有key1或者key2的过滤出来。例如:
12345VAR = a b c d, key1=a,key2=e$(filter key1 key2,$(VAR))#### 结果:a
filter-out语法:$(filter-out key1 key2,$(VAR))功能:从 VAR 中将包含有key1或者key2的过滤掉,保留其他的。例如:
12345VAR = a b c d, key1=a,key2=e$(filter-out key1 key2,$(VAR))#### 结果:b c d
call语法:$(call VARIABLE,PARAM,PARAM,...)功能:在执行时,将参数PARAM依次赋给临时变量$(1),$(2),...。然后再对VARIABLE展开后的表达式进行处理。例如:
12345define FUNC1$(info echo 4-$(1) $(2))endef$(call FUNC1,hello,wolrd)
inherit-product使用如下:
...
碎碎念-20230310
博客今天算是彻底从Hugo迁移到了Hexo,内容不多,所以考虑后续把以前写的都整理下,慢慢丰富起来。
从08年开始工作到现在,已经将近15个年头了,一直在软件这个行业里闯荡(好像也没闯出来个啥),自学的、工作中遇到的,等等问题或多或少记录整理了一些,也就借着最近这个时间,整理下,做成自己的博客内容。
……….
呃,算了,本来想写堆废话,唠唠自己工作中的一些事情的,下班了,回家看娃了!!(孩子今天发烧了,好像感染了甲流)
Windows系统禁止运行PowerShell脚本解决办法
问题这几天着手将之前的基于Hugo做的博客迁移到Hexo过来,需要安装Node.js相关。
系统上之前有node.js,是通过nvm安装的,只是版本有点低,所以升级看看,但升级问题就来了,系统提示:
12345无法加载文件 \*\*.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。+ CategoryInfo : SecurityError: (:) [],ParentContainsErrorRecordException+ FullyQualifiedErrorId : UnauthorizedAccess
一下就感觉不爽了!怎么就不行了呃,以前都可以的!(好像是2年前了 ~:> )
既然遇到了,那就解决吧!
解决办法在Windows搜索栏中输入powershell
然后以管理员身份运行,如上图。接着输入命令:
1get-executionpolicy
通过命令看到,这里是 Restricted。然后我们把它改了,输 ...
AOSP系统通知Notification
应用发送通知创建通知渠道123456// 渠道唯一IDconst val CHANNAL_ID = "channel_id"//创建 NotificationChannel 对象var channel = NotificationChannel(CHANNAL_ID, "message", NotificationManager.IMPORTANCE_DEFAULT)//创建通知渠道mNotificationManager.createNotificationChannel(channel)
创建并发送通知创建通知涉及到 NotificationManager 和 NotificationCompat 两个类:
NotificationCompat : 用于兼容不同版本的 Notification。
NotificationManager : 状态栏通知的管理类,负责发通知,清除通知等操作。
1234567891011// 获取 NotificationManager 对象来管理通知mNotificationManager = ge ...
AOSP长按关机键直接关机逻辑
看源码主要是找到切入点,这个可以参考网上已有源码阅读资料,然后找到一个自己觉得可以下手的地方,我这里就从配置文件开始。
配置文件 config.xml在阅读之前,需要注意配置文件
1\frameworks\base\core\res\res\values\config.xml
我们只关注两个地方,长按和短按相关的:
1234567891011121314151617181920<!-- 长按 --><!-- Control the behavior when the user long presses the power button. 0 - Nothing 1 - Global actions menu 2 - Power off (with confirmation) 3 - Power off (without confirmation) 4 - Go to voice assist--><integer name="config_longPressOnPowerBehavior">1</integer&g ...
Android Framework调试方法-Java部分
Java 代码的调试,主要依据两个因素,一个是你要调试的进程;一个是调试的类对应的包名路径,同时还要保证你所运行的手机环境和你要调试的代码是匹配的。
注意:符合以上两个因素,即使源码编译不过也可以调试。
查看系统进程系统进程名称是system_server,通过下面的命令可以看到 pid(进程ID)。
1ps -A |grep system_server
这里 pid=3023,继续用 cat 命令查看此进程的内存映射,看看是否services映射到内存里边。
1cat /proc/3023/maps |grep services
odex 是 Android 系统对于 dex 的进一步优化,目的是为了提升执行效率。从这个信息便可以确定,我们的 services.jar 确实是跑到这里了,也就是我们的系统服务相关联的代码,可以通过调试 system_server 进程进行跟踪。
调试首先通过adb连接到设备:然后在需要调试的地方打断点:点击调试按钮选择对应的进程
点击OK开始调试。
Android源码中`__BEGIN_DECLS`和`__END_DECLS`作用
最近在阅读Android系统底层代码,发现在很多代码和库的头文件中都有 __BEGIN_DECLS 和 __END_DECLS这两个宏。
这两个宏定义是在bionic/libc/include/sys/cdefs.h中。(Android 9 )
1234567#if defined(__cplusplus)#define __BEGIN_DECLS extern "C" {#define __END_DECLS }#else#define __BEGIN_DECLS#define __END_DECLS#endif
从宏定义#if defined(__cplusplus)就可以猜出来,这个处理c和c++兼容的。
extern “C”是为了解决C++编译器在调用C语言函数时找不到C语言函数的问题。
C++由于有函数的重载,使得源文件在编译时生成的函数名不仅仅包括了函数名称,还包括了一些额外的描述符,而在编译C语言源文件时生成的函数名是没有这些额外的描述符的.这样,当C++程序引用了C的头文件,想要调用C语言函数,在链接时就会因为函数名不相等而出现 ...