android
文章平均质量分 67
TangGeeA
这个作者很懒,什么都没留下…
展开
-
Android NativeBridge过程分析
Art的NativeBridge使用hodini作为callback实际去加载类库其中做了少量的一些操作1 Zoygote fork应用进程的时候frameworks/base/core/jni/com_android_internal_os_Zygote.cppForkAndSpecializeCommon函数bool use_native_bridge = !is_system_server && (instructionSet != NULL) &&原创 2023-10-19 15:58:31 · 522 阅读 · 0 评论 -
SEAndroid学习
selinux 学习原创 2022-11-27 16:56:24 · 1020 阅读 · 1 评论 -
surfaceflinger 新版本总结(Android10)
surfaceflinger概览原创 2022-09-14 09:11:59 · 776 阅读 · 0 评论 -
Android连接器(二)-elf文件的加载
VerifyElfHeaderelf加载过程其实最主要的部分就是创建程序的段ElfReader::ElfReader(const char* name, int fd, off64_t file_offset, off64_t file_size) : name_(name), fd_(fd), file_offset_(file_offset), file_size_(file_size), phdr_num_(0), phdr_mmap_(nu原创 2022-05-06 10:44:27 · 765 阅读 · 0 评论 -
Android连接器(一)-elf文件格式总结
elf包含两种视图,分别是文件视图和程序视图描述文件视图的主要数据结构就是section,一个elf文件包含多个section,每个section是相对独立的数据。文件使用Section Headers来描述section的名称类型以及位置大小。描述程序的视图为程序头表和程序头。链接器会根据程序头表来对数据进行加载。程序头表中存放多个程序头,程序头描述的是程序段。程序段并不在elf中,需要链接器进行内存分配,并将elf文件中的不同部分映射到分配的段内存上。一个程序段版本多个具有相同属性(读写执行权限一原创 2022-05-06 10:39:05 · 788 阅读 · 0 评论 -
Android连接器(三)-Android 程序加载运行-链接器实现
/* * This is the entry point for the linker, called from begin.S. This * method is responsible for fixing the linker's own relocations, and * then calling __linker_init_post_relocation(). * * Because this method is called before the linker has fixed i原创 2022-05-04 15:50:06 · 1121 阅读 · 0 评论 -
聊一聊PhoneWindowManager的窗口布局管理
记得之前在小米的时候,有个同学说PhoneWindowManager是最乱的地方,好像很多杂活都是PhoneWindowManager去干,其实我不太认同这个说法。 仔细分析一下,PhoneWindowManager实现了WindowManagerPolicy, WindowManagerPolicy注释写的很清楚: * This interface supplies all UI-specific behavior of the window manage原创 2022-04-11 09:28:40 · 2366 阅读 · 0 评论 -
Android 策略路由
Android使用netd对网络进行管理,一个操作系统如何对网络进行管理的呢,又是如何实现的,我们本篇文章就来分析一下。Android的网络管理我觉得最重要的就是策略路由,为了了解Android的策略路由,我们先熟悉下路由规则。路由器我们都比较熟悉,属于三成设备,路由器是用于数据报转发的,那么路由器如何确定将一个设备转发到下一跳路由呢,是通过路由表。#ip route show61.135.165.183 via 192.168.1.1 dev wlp5s0 proto unspec defaul原创 2021-08-11 08:46:55 · 6454 阅读 · 3 评论 -
Android 设置window信息到inputflinger
在Android InputDispatch事件派发->选择目标窗口一文中我们分析了Android 根据Wms的window信息来派发事件到window对应的应用程序,今天我们来分析下Android如何更新window信息到inputflinger。当window信息发生变化的时候Wms需要更新window的信息到inputflinger, Android使用InputMonitor.java类来完成操作,InputMonitor 更新window的函数为updateInputWindowsLw。 我们在原创 2021-01-20 22:24:45 · 1054 阅读 · 0 评论 -
Android 打包镜像对权限的管理
Android ext4镜像制作的主要逻辑都在system/extras/ext4_utils/make_ext4fs.c文件中,其实就是根据某个文件夹创建ext4格式的二进制文件。 ext4包含superblock,inode, inode table, group descriptors, block bitmap 和block等主要的结构。文件的权限信息一般保存在inode中。正常情况下打包文件的权限和目标目录下的权限应该是相同的static u32 build_directory_structu原创 2021-01-12 22:34:04 · 741 阅读 · 0 评论 -
Android InputDispatch事件派发->选择目标窗口
WindowManagerService的主要两大作用:1 和surfaceflinger交互,创建surface, 通知surfacelinger窗口的层级、大小、位置等属性。2 和inputflinger交互, 告知inputflinger当前窗口大小位置,是否可以接受input事件以及窗口可以处理什么类型的事件。surfacelinger和inputflinger都是系统里面两个负载较重的服务。为了分心WindowManagerService我准备先从inputflinger这端着手,因为这端原创 2021-01-12 22:28:17 · 3024 阅读 · 1 评论 -
Android sdk version和Android版本对照
原创 2021-01-03 08:19:37 · 5676 阅读 · 0 评论 -
ActivityManagerService对于Task的管理
在Ams中Activity的容器是Task, task的容器是stack, 所以我们先来看下stack是如何管理Task的final class ActivityStack { /** * The back history of all previous (and possibly still * running) activities. It contains #TaskRecord objects. */ private ArrayList<Tas原创 2020-12-31 22:30:06 · 546 阅读 · 1 评论 -
Android Ams对于Activity生命周期的管理
分析Activity的生命周期管理,我觉得应该先看下面两篇关于Activity的官方文档:了解 Activity 生命周期处理 Activity 状态更改里面有下面一段话是,比较简洁的说出了Activity生命周期。常见的处罚Activity生命周期的方式有几种1 上面的Activity finish露出下面的Activity。2 一个Activity启动另外一个Activity,然后调用者finish。3 一个Activity启动另外一个Activity,然后调用者不finish。4 o原创 2020-12-20 17:59:50 · 1725 阅读 · 0 评论 -
ActivityManagerService->Activity启动->任务选择和Activity复用(Android 6.0)
之前分析过很多次Ams管理Activity启动,但是并没有太认真,最近想重新分析下Android 10.0,发现难度比较大,所以先找软柿子捏捏,从Android 6.0入手,后面再分析一遍Android 10.0。分析Android代码的过程,其实就是对Android设计的理解,所以建议读者再读本篇代码分析文章之前一定一定要读下下面两篇Android的官方文档,来了解下Android对Activity任务管理实现了什么样的功能。 这两篇官方文档分别是:了解任务和返回堆栈“最近使用的应用”屏幕这两篇文原创 2020-12-18 22:17:32 · 518 阅读 · 0 评论 -
Android android:documentLaunchMode属性和FLAG_ACTIVITY_NEW_DOCUMENT说明
其实“最近使用的应用”屏幕添加链接描述 这篇文章已经写的很清楚了,但是网上的很多介绍都是翻译的api文档,让人看了一头雾水,这里再给大家科普一下。 首先要知道Android的最近任务里面的显示是以任务为单位的, 一般清空下Android程序按照应用按照应用包名来组织task, 或者按照taskAffinity来组织逻辑原创 2020-12-13 12:30:32 · 5119 阅读 · 0 评论 -
Android 10 存储模型->requestLegacyExternalStorage
在Android使用fuse文件系统开始,Android针对外置存储支持了独立的沙箱存储空间, 一般通过Context.getExternalFilesDir() Api获取,该空间内的数据为应用独有,并且不需要申请任何权限即可使用。但是当时并没有限制应用读写非沙箱内的数据。但是从Android Q开始,出于数据隐私问题,Android 希望禁止应用程序操作非沙箱内的数据。 但是为了过度,Android提供了requestLegacyExternalStorage机制,来帮助应用使用原来的机制继续读写存储卡原创 2020-10-19 22:27:25 · 33258 阅读 · 9 评论 -
PackageManagerService分析(Android 10)->应用安装的整体流程
Android的应用安装分为三种情况,我们从adb命令可以窥探一二。 install [-lrtsdg] [--instant] PACKAGE push a single package to the device and install it install-multiple [-lrtsdpg] [--instant] PACKAGE... push multiple APKs to the device for a single package and install the原创 2020-10-18 11:17:32 · 1840 阅读 · 0 评论 -
PackageManagerService分析(Android 10)->Pms的两把锁
/** * Keep track of all those APKs everywhere. * <p> * Internally there are two important locks: * <ul> * <li>{@link #mPackages} is used to guard all in-memory parsed package details * and other related state. It is a fine-grained l原创 2020-10-10 12:09:46 · 1110 阅读 · 4 评论 -
PackageManagerService分析(Android 10)->静态库的支持
Platform support for static shared librariesThis change adds support for static shared libraries thatemulate static linking allowing apps that statically linkagainst the same library version to share a commonimplementation. A library is hosed by a pac原创 2020-10-09 20:01:44 · 337 阅读 · 1 评论 -
PackageManagerService分析(Android 10)->abi的确定
ABI(Application Binary Interface,应用程序二进制接口)是对目标代码的约束。ABI是和平台密切相关的,这相当于cpu支持的指令集, 在Android适配过程中,支持的api要写在BoardConfig.mk文件中,也就是板级信息,我截取pixel的配置,如下TARGET_ARCH := arm64TARGET_ARCH_VARIANT := armv8-aTARGET_CPU_ABI := arm64-v8aTARGET_CPU_ABI2 :=#TODO: add原创 2020-10-08 19:56:59 · 810 阅读 · 0 评论 -
PackageManagerService分析(Android 10)->original-package机制分析
<!-- Private tag to declare the original package name that this package is based on. Only used for packages installed in the system image. If given, and different than the actual package name, and the given original package was previously installed原创 2020-10-08 15:18:10 · 572 阅读 · 0 评论 -
PackageManagerServie 安装位置确定
PackageManagerService分析起来存在一些问题,由于我们对一些功能不甚了解,想一口吃一个胖子的方式分析下来还是比较困难的,所以我们采用庖丁解牛的方式,将Pms拆分成几个功能来进行分析。今天我们的入手点就是来分析下PackageManagerService如何确定应用安装的位置。 经过分析,我们发现这部分原创 2020-09-26 19:38:54 · 1172 阅读 · 0 评论 -
PackageManagerService分析(Android 10)->启动
1原创 2020-09-02 08:32:06 · 469 阅读 · 0 评论 -
Android存储系统-外置存储权权限管理实现
前言 在Android存储系统-使用fuse来管理外置存储 一文中我们介绍了Android fuse 来实现灵活的权限管理,我们知道获取不同的外置存储权限使用的外置存储目录是不同的, 获取外置存储读权限的应用程序看到的fuse目录为/mnt/runtime/read/${label}目录,获取了外置存储写权限的应用程序使用的是fuse的/mnt/runtime/write/${label}目录,而没有获取任何外置原创 2020-08-11 21:55:49 · 3646 阅读 · 0 评论 -
Android存储系统-使用fuse来管理外置存储
本文不是主要简介fuse文件系统,本文主要是将Android如何使用fuse文件系统来做到灵活的权限管理。 Android对于外置存储的管理,需要实现以下几个目标:1、读写外置存储需要 android.permission.READ_EXTERNAL_STORAGE和android.permission.WRITE_EXTERNAL_STORAGE, 这两个权限是运行时权限,可以动态的授予和撤销, 所以主存储目原创 2020-08-09 15:27:34 · 13444 阅读 · 2 评论 -
Android存储系统-MountService 和vold 对外置存储的管理(3)
Android 4.4就实现了多用户功能,但是一直没有正式开发,直到Android 7.0添加了基于文件的加密能力,每个用户可以使用自己的加密空间,这才完全开放,今天我们就来分析下Android的多用户目录管理。在Android存储系统-MountService 和vold 对外置存储的管理(1) 一文中我们看到Android的MountService启动后会发送user_added 和 user_started原创 2020-08-03 22:25:16 · 898 阅读 · 1 评论 -
Android存储系统-MountService 和vold 对外置存储的管理(2)
使用fuse文件系统进行挂载EmulatedVolumemInternalPath = mRawPath = private_path/media| /data/mediamPath = /storage/emulated| /storage/fsuuidEmulatedVolume作为主存储mInternalPath mRawPath = private_path/media| /data/mediamPath = /storage/emulatedPublicVolume可见:原创 2020-08-02 18:46:30 · 2930 阅读 · 0 评论 -
Android存储系统-MountService 和vold 对外置存储的管理(1)
现状介绍PIXEL举例sailfish:/ # df/dev/root 1999708 782936 1216772 40% /tmpfs 1898544 436 1898108 1% /devtmpfs 1898544 0 1898544 0% /mnt/dev/block/sda31 292868 224200 68668 77% /vendor/dev/bl原创 2020-07-30 21:58:06 · 4488 阅读 · 2 评论 -
Android虚拟机内存参数说明
ART的比较复杂,这里分析dalvik虚拟的的参数,和art参数的概念是一致的-xms: 虚拟机堆的起始大小,启动时申请的堆内存大小 prop:dalvik.vm.heapstartsize指定-xmx: 虚拟机堆使用的虚拟内存最大大小 prop:dalvik.vm.heapsize 指定-XX:HeapGrowthLimit: 非largeHeap应用最大使用的堆内存 prop:dalvik.vm.heapgrowthlimit-XX:HeapMinFree 堆最小空闲值,空闲值小于该值时应该扩容原创 2020-07-04 09:30:11 · 1619 阅读 · 0 评论 -
android 链接器分析
我们已经知道,exec系统调用后,操作系统解析完成elf文件后,将控制权交给链接器的_start执行,下面以x86平台进行分析bionic/linker/arch/x86/begin.c__LIBC_HIDDEN__ void _start() { void (*start)(void); void* raw_args = (void*) ((uintptr_t) __built...原创 2019-02-16 14:04:16 · 920 阅读 · 0 评论 -
Android 动态链接器-ELF文件的加载
VerifyElfHeaderelf加载过程其实最主要的部分就是创建程序的段:ElfReader::ElfReader(const char* name, int fd, off64_t file_offset, off64_t file_size) : name_(name), fd_(fd), file_offset_(file_offset), file_size_(file_s...原创 2020-04-06 09:27:05 · 1020 阅读 · 0 评论 -
pixel 编译安装Aosp
其实没什么可说,具体可以参考完整指引如何編譯AOSP (Build Android P),整合GMS及刷機 (Pixel 2) 这篇文章, 但是实际操作的时候会有些问题,就是建议一定要先刷一遍官網的ROM,并且rom的版本和你之后要编译的AOSP分支版本是一致的,这会少走很多冤枉路。如果刷完之后还是开不了机,则检查你刷的官方ROM是否和你编译的分支一致,如果不一致,下载正确版本重新刷一遍,如果一...原创 2020-04-05 21:22:15 · 1023 阅读 · 0 评论 -
ELF文件分析
背景 一个程序要想运行,首先要加载到内存中,程序的pc指针指向内存中的代码,代码在执行的时候会在使用内存中的数据。这些数据可以分为两类:静态数据。动态数据。什么是动态数据呢,动态数据在程序运行过程中在堆或者栈上分配内存。而静态数据则不然,静态数据在代码编译完成后,就应该确定使用的地址和空间。静...原创 2020-04-04 10:31:53 · 997 阅读 · 0 评论 -
apktool反编译资源分析
前边分析的理解Android资源索引一文分析了resource.arsc的基本格式,我们简单的回顾一下原创 2020-03-30 20:10:52 · 1637 阅读 · 0 评论 -
Android资源索引--resources.arsc
今天来介绍下resource.arsc的格式:原创 2020-03-26 20:34:37 · 2960 阅读 · 0 评论 -
art虚拟机打开日志
art/runtime/parsed_options.cc// gLogVerbosity.class_linker = true; // TODO: don’t check this in!// gLogVerbosity.compiler = true; // TODO: don’t check this in!// gLogVerbosity.gc = true; // T...原创 2020-03-26 16:13:10 · 745 阅读 · 1 评论 -
aapt字符串池
class StringPool{private: const bool mUTF8; // The following data structures represent the actual structures // that will be generated for the final string p...原创 2020-03-21 11:23:10 · 339 阅读 · 0 评论 -
理解Android资源索引
今天来说说Android的资源索引系统, Android的资源编译使用aapt工具, 查找则使用AssertManager.Android如何来索引资源呢,首先我们从一个应用程序来找资源进行分析.Android中通过id来进行资源的查找, 那么怎么通过id来查找呢我们对id进行分割, id是一个32位的数字, 前8位为packageid, 后面8为为typeid,最后16位是在该type下的...原创 2020-03-08 16:35:13 · 988 阅读 · 0 评论 -
Android 各种截屏方法
1 应用内截屏(无SurfaceView, TextureView)boolean cacheEnable = captureView.isDrawingCacheEnabled();captureView.setDrawingCacheEnabled(true);captureView.buildDrawingCache();Bitmap bitmap = captureView.get...原创 2020-02-05 17:28:55 · 3404 阅读 · 1 评论