【Android面试题】Android Framework核心面试题——Android中Pid&Uid的区别和联系

Android中Pid&Uid的区别和联系

这道题想考察什么?

考察Android 系统中Pid 以及Uid的概念和理解

考试应该如何回答

众所周知,Pid是进程ID,Uid是用户ID,只是Android和计算机不一样,计算机每个用户都具有一个Uid,哪个用户start的程序,这个程序的Uid就是那个那个用户,而Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的 Uid,如果用互相调用,只能是Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的。而同一个application 只有一个Uid,所以application下的Activity之间不存在访问权限的问题。

PID

Android中的PID全称为Process Identifier,来源于Linux中,在进程启动的时候系统会为进程分配一个独一无二的标识,进程销毁后PID会被系统回收,但是在Android中一般不会重新分配,后面的进程PID会比前面的进程的大。但是对同一个安卓应用可以具有多个PID,添加也很方便,只需要在声明类时指定进程名称即可,代码如下:

 <activity android:name=".TestActivty" android:process="com.xiaohan.test"/>

添加很方便,但是不能随意使用,因为在同一个应用(PID)中,设计到程序之间最多的是线程间的通信,一旦独立出PID则涉及到进程间通信,类似于不同的两个应用,当然也可以通过上面的私有暴露和权限暴露的方式实现数据的通信,但是系统的开销较大。

UID

Android中的UID一般认为是User Identifier,同样来源于Linux中。但是在Android中不太一样,Android最初的设计是单用户,所以UID并不是为了区别用户的,而是为了不同程序间进行数据共享。Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的Uid,因此如果程序期望互相调用,只有Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的。而同一个application只有一个Uid,所以application下的Activity之间不存在访问权限的问题。

android中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid,前提是这些应用的签名要相同。

UID如何分配

在应用启动的时候,或者手机启动的时候,PackageManagerService都会去解析apk,并且为app分配一个UID,具体的流程如下(基于Android11):

PackageManagerService.java 中在PMS 构造函数初始化的时候会执行到一个函数scanDirTracedLI(),在scanDirTracedLI()中会执行scanDirLI(),然后会执行scanPackageTracedLI(),然后再执行scanPackageLI(),然后再执行addForInitLI(),然后执行scanPackageNewLI(),当然这个过程中会涉及到很多代码细节,建议大家去学习本章中关于PKMS部分的内容。在这个scanPackageNewLI函数中会执行mSettings.getSharedUserLPw(),去获取共享用户,如果没有就创建新的,大家看下面的代码:

SharedUserSetting getSharedUserLPw(String name, int pkgFlags, int pkgPrivateFlags,
		boolean create) throws PackageManagerException {
	SharedUserSetting s = mSharedUsers.get(name);
	if (s == null && create) {
		s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
		s.userId = acquireAndRegisterNewAppIdLPw(s); //核心代码
		if (s.userId < 0) {
			// < 0 means we couldn't assign a userid; throw exception
			throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
					"Creating shared user " + name + " failed");
		}
		Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
		mSharedUsers.put(name, s);
	}
	return s;
}

上面的代码显示,如果没有为这个app创建SharedUserSetting 信息且需要创建一个,那么就创建一个,然后再调用acquireAndRegisterNewAppIdLPw函数为其分配UID。

private int acquireAndRegisterNewAppIdLPw(SettingBase obj) {
	// Let's be stupidly inefficient for now...
	final int size = mAppIds.size();
	//code1 从0开始,找到第一个未使用的ID,此处对应之前有应用被移除的情况,复用之前的ID
	for (int i = mFirstAvailableUid; i < size; i++) {
		if (mAppIds.get(i) == null) {
			mAppIds.set(i, obj);
			return Process.FIRST_APPLICATION_UID + i;
		}
	}

   //code2 最多只能安装 9999 个应用
	// None left?
	if (size > (Process.LAST_APPLICATION_UID - Process.FIRST_APPLICATION_UID)) {
		return -1;
	}

	mAppIds.add(obj);
    // code3 可以解释为什么普通应用的UID 都是从 10000开始的
	return Process.FIRST_APPLICATION_UID + size;
}

从上面我们可以看到,给APP分配的UID是遵守如下几个原则:1)从code1知道,id是可以复用的,当一个app卸载了,那么它的id会被后面安装的app复用,2)从code2得知,用户id不能超过19999,也就是说可以安装的app数不能超过9999个,否则安装的app没有uid分配;3)每个UID 都是一个大于 Process.FIRST_APPLICATION_UID 的数字,也就是都大于10000;

Android中UID的价值

在Android中一个UID的对应的就是一个可执行的程序,程序在Android系统留存期间,其UID不变。 在Android中采用沙箱的概念来管理程序,不同的程序具有唯一的UID和PID,通过该UID来标识其所具有的“资源”,包括文件目录、数据库的访问、网络、传感器和日志等,和Linux一样,相互之间互不影响。

在这里插入图片描述

不同的应用程序一般是运行在不同的进程中,相互之间的“资源”不可以访问,但可以通过进程共享的方式,实现不同程序之间的数据访问主要是针对Activity、Service和ContentProvider,其实现方式按照权限暴露级别分为:完全暴露、权限提示暴露和私有暴露三种方式。

完全暴露

是指通过android:exported=”true”实现,在AndroidMaindfest.xml中申明Activity、Service或ContentProvider时,将该属性设置为true后,就表明该类允许外界的数据访问。如果在申明时添加了intentFilter属性,则默认exported就为true,此时也可强制的设置为fasle。如未做其他设置(exported/intentFilter),则默认exported为fasle,即不对外暴露。如下代码所示:

<activity android:name=".TestActivty" android:exported="true"/>

权限提示暴露

在AndroidMaindfest.xml中申明Activity、Service或ContentProvider时,添加了permission,表明如果其他应用需要访问该类时,需要在该应用添加该类声明时的权限, 声明私有的权限,如下所示。

<activity android:name=".TestActivty" android:permission="com.xiaohan.permission"/>
//添加访问的权限说明
<uses-permission android:name="com.xiaohan.permission"/>

私有暴露

不同于以上两种类的暴露方式,如果想对于不同应用之间可以互相访问任何数据,则需要通过sharedUserId+同一套签名的方式实现,只有这样才能运行在同一个进程中(同一个沙箱中)保证数据的相互访问。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.xiaohan.test"      //应用包名
    android:sharedUserId="com.xiaohan.sharedUID"  //暴露的唯一标识
    android:sharedUserLabel="@string/app_name"  //必须是引入资源文件中的字符串
    android:versionCode="1"
    android:versionName="1.1.0"
    //安装位置,默认在内部目录,还包括auto:自动、  preferExternal:外置SD卡中
    android:installLocation="internalOnly">

在这里插入图片描述

总结

不同的应用具有唯一的UID,同一个UID可具有不同的PID;

针对不同的PID之间数据的暴露可采用私有暴露和权限暴露,针对不同的UID之间可通过完全暴露的方式;

如果一个应用是系统应用,则不需要其他应用暴露,便可直接访问该应用的数据。

最后

我整理了一套Android面试题合集,除了以上面试题,还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES
在这里插入图片描述

有需要的朋友可以扫描下方二维码,免费领取全部面试题+答案解析!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Framework面试题是关于Android操作系统框架的一些问题,主要涉及Android应用程序的开发、调试和优化等方面。常见的面试题包括: 1. 什么是Android FrameworkAndroid FrameworkAndroid操作系统的核心组件之一,它提供了一系列API和工具,用于开发、调试和优化Android应用程序。 2. Android Framework的组成部分有哪些? Android Framework由四个主要组成部分组成:应用程序框架、系统服务、库和运行时环境。 3. 什么是Android应用程序框架? Android应用程序框架是Android Framework核心组成部分,它提供了一系列API和工具,用于开发Android应用程序。应用程序框架包括四个主要组件:活动、服务、广播接收器和内容提供者。 4. 什么是Android系统服务? Android系统服务是Android Framework的一个重要组成部分,它提供了一系列系统级别的服务,如通知服务、位置服务、传感器服务等。 5. 什么是Android库? Android库是Android Framework的一个重要组成部分,它提供了一系列常用的功能和工具,如图形界面库、网络库、数据库库等。 6. 什么是Android运行时环境? Android运行时环境是Android Framework的一个重要组成部分,它提供了一系列核心库和虚拟机,用于执行Android应用程序。 7. 什么是Android应用程序的生命周期? Android应用程序的生命周期指的是应用程序从启动到关闭的整个过程,包括应用程序的创建、启动、暂停、恢复和销毁等阶段。 8. 什么是Android应用程序的四大组件? Android应用程序的四大组件包括:活动、服务、广播接收器和内容提供者。活动用于展示用户界面,服务用于在后台执行任务,广播接收器用于接收系统广播,内容提供者用于管理应用程序的数据。 9. 什么是Android应用程序的UI线程? Android应用程序的UI线程是指用于更新用户界面的线程,它负责处理用户界面的事件和更新UI组件。 10. 什么是Android应用程序的异步任务? Android应用程序的异步任务是指用于在后台执行任务的线程,它负责处理耗时的操作,如网络请求、数据库操作等。 ### 回答2: Android FrameworkAndroid 应用开发的核心部分,它是一组软件模块,为 Android 应用提供基本的服务和功能,包括视图系统、资源管理器、通知心、系统 API 等等。以下是 Android Framework 面试题的回答: 1. 什么是 Android Framework?它有哪些组成部分? Android FrameworkAndroid 应用开发的核心部分,它提供了一个标准化的架构,包括了一系列底层模块和服务,帮助开发者快速构建优质的应用程序。Android Framework 包括四个主要的组成部分: - Activity Manager:管理应用程序的生命周期、任务管理和应用程序调度。 - Content Provider:提供应用程序之间数据共享的机制。 - View System:提供视图组件的绘制和交互功能,包括 UI 组件、菜单、通知等。 - System API:提供开发者使用的系统级别 API,包括网络、存储、多媒体、传感器等各种功能。 2. 什么是 Intent? Intent 是在 Android 开发用于启动组件、传递数据和执行操作的一种消息机制。Intent 由两个主要的部分组成,第一个是传递的动作行为(Action),用于指定所要执行的操作;第二个是传递的数据(Data),可包含要传递的信息、参数或操作。Intent 在 Android 应用经常用于启动 Activity、Service、Broadcast Receiver,以及在应用程序之间传递数据。 3. 什么是 Content Provider? Content Provider 是 Android Framework 的一项核心服务,用于提供跨应用程序数据共享的机制。Content Provider 可以通过 URI 的方式访问数据,并将一些特定的操作和查询暴露给外部应用程序。Content Provider 在 Android 应用广泛应用于共享数据、存储和检索数据等功能。Content Provider 可以使用 SQLite 数据库存储数据,也可以使用其他数据源。 4. 什么是 Binder? Binder 是 Android Framework 的一种进程间通信机制。它使用了一种名为跨进程通信 (IPC) 的技术,允许不同进程之间共享数据和资源,并可让应用程序在另一个进程执行功能。在 Android Framework ,Activity 管理器、Service 和 Content Provider 等都是通过 Binder 与其他应用程序进行通信。Binder 还提供了一些高级功能,如安全性和线程管理。 5. 什么是 View System? View System 是 Android 应用程序的 UI 组件,它提供了视图绑定、事件处理、资源管理和窗口布局等功能。在 Android Framework ,View System 通过命名布局文件、使用 XML 描述视图和样式等机制,管理和绘制 UI 布局、界面组件和控件。View System 还提供了与其他系统服务的集成,如通知心、扩展菜单、对话框等。 6. 什么是 Android Manifest? Android Manifest 是 Android 应用开发必不可少的部分,它是应用程序清单文件,用于定义应用程序的基本信息和结构。Manifest 文件包含了应用程序使用的 Activity、Service、Broadcast Receiver 等组件,以及应用程序所需的权限和组件信息、应用程序元信息等。Manifest 文件还包括运行时动态创建的 Activity、Service 和 Receiver 的声明和权限标签,以及与应用程序的组件交互的 Intent 过滤器。 总结: Android FrameworkAndroid 应用开发的核心,它提供了一组标准化的软件模块,为 Android 应用程序提供基本的服务和功能。通过对 Android Framework 的学习和理解,开发者可以更好地把握 Android 应用开发的核心技术,快速构建高质量的应用程序。 ### 回答3: Android framework在移动端操作系统扮演了至关重要的角色,关系到整个Android系统的顺利运行和用户体验。以下是一些相关的面试题及其答案。 1. 什么是Android frameworkAndroid framework主要指的是整个Android操作系统的框架架构,包括组件、服务、库等等。它提供了一系列的API和开发者工具,使得应用程序设计者可以轻松地在上面开发、部署和调试应用程序。 2. Android framework的四大组件是什么? Android framework的四大组件包括Activity、Service、Content Provider和Broadcast Receiver。这些组件大都是基于事件驱动模型来设计的,通过系统的内部通信协议来实现各个组件之间的交互,以使得应用程序能够运行得更加高效、稳定和流畅。 3. Android framework的应用程序包含哪些基本结构? Android framework的应用程序包含了Activity、Manifest、布局文件、资源文件等等。其,Activity是应用程序的基本单元,Manifest是整个应用程序的配置文件,而布局文件和资源文件则用于定义应用程序的用户界面和各种资源。 4. 什么是Android Intent? Android Intent是从一个组件(如Activity、Service、Broadcast Receiver等)向另一个组件传递消息的一种机制。Intent本身就是一个数据结构,其包含了一些元数据(如操作名称、数据URI、类别、组件名称、附加的Extras等),以及一些标志(如FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_SINGLE_TOP等)等。通过使用Intent,不同组件之间可以实现相互通信和交互。 5. Android的View和ViewGroup有何区别? 在Android,View代表着一个基本的GUI控件,如Button、TextView等,而ViewGroup代表着一个包含了多个View的容器,如LinearLayout、RelativeLayout等。简单来说,View是最基本、最简单的GUI控件,而ViewGroup则是一个可以包含多个View的容器。通过使用View和ViewGroup,应用程序可以创建出丰富、多样化的用户界面。 总之,掌握了以上的面试题及其答案,相信大家对Android framework的基础知识已经有了较为全面的认识。当然,Android framework作为一个十分庞大和复杂的系统,还有许多其他的知识点和技术需要我们进一步了解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值