首页 > 其他分享 >Android Framework基础知识

Android Framework基础知识

时间:2024-03-12 23:04:02浏览次数:28  
标签:代码 jar server Framework 进程 Android 基础知识 sdk

哈喽大家好,我是Zzz. 给大家分享一篇Framework入门的基础知识文章,内容纯纯原创。

一、Application,Activity和进程的关系?

    Application、Activity只是进程虚拟机运行的一个类对象,只是属于系统的一个组件和进程没有直接联系。Android支持为每个组件可以单独进程方式运行。

       一个Application就是单独的一个进程这个说法是不对的,Application、Activity只是运行程序中的一个普通的类并不代表一个单独的进程,进程是运行起来的一个程序。

二、Android系统进程间的相互关系

 一个Application或者展示Activity的进程运行在Android系统中需要那些东西进行服务?

Zygote进程:负责孵化之后服务和应用的进程(孵化进程)是所有系统进程的父进程由Zygote来孵化各种进程;

System_server进程:是系统核心服务的一个进程,这个进程包含了系统中核心Service的运行,给系统提供如:Window的管理、Activity的管理,系统的核心功能都在System_server中;

SurfaceFlinger进程:主要跟驱动层、硬件层进行交互,使屏幕进行绘制,如App进程产生的界面由SurfaceFlinger进行的绘制;

ServiceManager进程:App开发中用的getService()就是在和ServiceManager进行交互,这个进程就是保存了一个类似于HashMap,保存了System_server中一些核心服务把服务中的引用交给ServiceManager使得我们的App进程向ServiceManager要需要的服务;

每一个进程直接各自都是相互独立的他们之间的通信或控制只能通过跨进程通信的方式进行交互;除了Linux中Socket、共享内存、管道等一些方式Android特别的通信方式为Binder通信,底层实现是通过系统调用和底层驱动层进行实现。

SurfaceFlinger中包括匿名共享内存,因为binder通信是由内存大小限制的由于SurfaceFlinger要显示一个界面是一个巨大的图片占用的内存比较多这个时候就需要用到匿名共享内存;

三、哪些代码是运行在App进程的、哪些又是运行在System_server进程的?

1、除了自己写的业务代码,一般Android SDK里面的代码都是运行在App进程的,sdk里面是android.jar(在sdk下的platfroms/android-*/)也就是编译出的framework.jar,因为app需要依赖sdk才可以编译通过,说明各个app肯定会使用sdk中的代码,这个代码属于所有app共用的,故修改一个类就会影响所有的应用进程;

2、一般com.system.server.*相关的类都是运行在system_server,这一部分平时是接触不到的,由于普通应用根本无法引入相关的server代码,因此这次代码属于system_server特殊应用自己的代码,普通应用只能通过跨进程通信的方式与其通信获取相关数据及接收控制,一般java代码对应的是services.jar;

四、主要jar包介绍

Android源码编译之后会有很多文件,在源码路径out/target/product/generic_x86_64/system/framework/文件下

1、framework-res.apk----》android系统资源库(如图片、布局、dialog、主题、控件都在这里)

2、framework.jar-----》Android的sdk中核心代码

3、services.jar-----》框架层服务端的编译后jar包

五、面对实际项目需求到底该修改那一块的代码呢?修改原则是什么?

需要具体分析需求,按以下几步的优先级进行:

1、明确业务需求,分析业务是否可以应用层面(即App的业务代码)通过标准接口实现,如果是真实的项目又同时要考虑到是否这个App可能被其他的第三方应用替代,或者卸载等;

2、如果业务代码无法通过标准接口实现,则在考虑应用程序的框架修改是否可以实现,也就是android sdk部分,即framework.jar,要考虑该部分代码是运行于所有的app,要考虑功耗影响及稳定性,尽量把修改面变小,不可修改sdk的标准接口,只能考虑新加,但是接口的具体实现可以根据情况改变,修改错误可可能黑屏;

3、framework.jar部分的框架也无法满足时候,就需要考虑System_server中去修改相关的Service等是否可以满足,这一部分更需要谨慎修改,一不小心很可能导致系统无法启动黑屏;

标签:代码,jar,server,Framework,进程,Android,基础知识,sdk
From: https://blog.csdn.net/weixin_51139372/article/details/135152654

相关文章

  • Django基础知识点一
    Django基础知识点【零】补充方法【1】Django项目测试if__name__=='__main__':importosimportdjangoos.environ.setdefault('DJANGO_SETTINGS_MODULE','BookSystem.settings')django.setup()'''测试代码''......
  • 命令行 要查看在Windows上已安装的所有.NET Framework版本 查看在Windows上已安装的
       要查看在Windows上已安装的所有.NETFramework版本,可以按照以下步骤执行:打开命令提示符(CommandPrompt)或PowerShell。可以通过在Windows搜索栏中键入“cmd”或“PowerShell”来找到并打开这些应用程序。在命令提示符或PowerShell中,输入以下命令并按Enter键:......
  • android使用okhttp3连接springboot
    首先在build.gradle.kts中导入依赖在dependencies{}中添加以下代码implementation("com.squareup.okhttp3:okhttp:4.9.1")之后在MainActivity中加入以下代码privateOkHttpClientclient=newOkHttpClient();privatevoidsendPostRequest(Useruser){//......
  • 链表基础知识详解
    引言在计算机科学中,数据结构是存储、组织数据的方式。而链表,作为一种基础而强大的数据结构,因其独特的特性,在多种算法和应用场景中拥有不可替代的地位。什么是链表,为什么要使用链表链表(LinkedList)是一种线性表,但与数组不同的是,链表中的元素在内存中并不是连续放置的。每......
  • 关于android stdio连接mysql数据库出现过的问题
    根据网上的资料连接mysql数据库的步骤有:1.导入mysql连接jar包我的androidstdio文件里没有libs文件夹,就在build创建了一个,选择jar包,aslibrary,重启下进程,就会生成一些文件2.在mainfest.xml文件下加入网络权限<uses-permissionandroid:name="android.permission.INTERNET"/>......
  • ADB 下载、安装及使用教程:让你更好地管理 Android 设备
    简介作为一名测试工程师,我们经常需要在我们的Android设备上进行调试、管理或者定制。而Android调试桥(ADB)是Google官方提供的工具,可以帮助我们在计算机上与Android设备进行通信和控制。本教程将带领你一步步学习如何下载、安装和使用ADB,让你更好地管理你的Android设备......
  • Android RecyclerView的使用(以实现一个简单的动态聊天界面为例)
    RecycleView可以实现动态列表的功能,毕竟在实际开发中大多数情况下不可能提前知道一个列表要塞进去多少东西。比如说QQ微信的聊天栏界面,可以抽象成一个RecycleView(或者一个ListView),没人说话时列表为空,你发一句话我发一句话,这列表就长起来了。再或者像是一些管理系统里,每一个物品......
  • Unable to cast object of type 'Microsoft.EntityFrameworkCore.Query.Internal.Enti
    如题再做查询的时候报了这个错误。原代码如下:publicvirtualasyncTask<PagedList<ApiScope>>GetApiScopesAsync(stringsearch,intpage=1,intpageSize=10){varpagedList=newPagedList<ApiScope>();varfilteredApiScopes......
  • Android 发布aar远程依赖出现扩展方法无法找到问题
    原文:Android发布aar远程依赖出现扩展方法无法找到问题-Stars-One的杂货小窝起因最近在整合自己的工具类库,偶然发现之前写的扩展方法使用远程依赖却是提示找不到但我有个aar库却是正常的,于是看了下这两者的区别,发现是build.gradle多了下面这个导致的问题packagingOptio......
  • Android获取散列秘钥(KeyHash)
    1.下载openssl,地址:https://code.google.com/archive/p/openssl-for-windows/downloads2.解压openssl3.将.keystore放到openssl的bin目录下4.执行keytool-exportcert-alias签名的alias名称-keystore签名.keystore|opensslsha1-binary|opensslbase64备注:如果出现......