Android 进阶——系统启动之SystemServer创建并启动Installer服务(八)_android 12 installapkverity

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

引言

SystemServer进程在执行startBootstrapServices方法后,首先就通过SystemServiceManager创建和启动Installer系统服务。
在这里插入图片描述

以后更多精选系列文章以高度完整的系列形式发布在公众号,真正的形成一套完整的技术栈,欢迎关注,目前第一个系列是关于Android系统启动系列的文章,大概有二十几篇干货。

一、Intsaller系统服务概述

\frameworks\base\services\core\java\com\android\server\pm\Installer.java继承自com.android.server.SystemService,同时持有installd守护进程对应Binder服务的代理对象,本质上就是通过Binder调用去与Linux底层installd守护进程通信完成真正的完成Apk文件格式的优化和转换建立相关的数据目录删除文件安装应用等工作。因此在其他系统核心服务启动前首先被启动,

private void startBootstrapServices() {

Installer installer = mSystemServiceManager.startService(Installer.class);

SystemServiceManager.startService(Installer.class)触发com.android.server.pm.Installer#onStart回调时,首先通过ServerManager获取名为installdBinder服务代理对象,然后调用这个Binder服务代理对象通过socket与Linux的installd 守护进程通信。

package com.android.server.pm;

import com.android.internal.os.BackgroundThread;
import com.android.server.SystemService;
public class Installer extends SystemService {
private volatile IInstalld mInstalld;

public Installer(Context context, boolean isolated) {
super(context);
mIsolated = isolated;
}

@Override
public void onStart() {
if (mIsolated) {
mInstalld = null;
} else {
connect();
}
}

private void connect() {
IBinder binder = ServiceManager.getService(“installd”);
if (binder != null) {
try {
binder.linkToDeath(new DeathRecipient() {
@Override
public void binderDied() {
Slog.w(TAG, “installd died; reconnecting”);
connect();
}
}, 0);
}
}

if (binder != null) {
mInstalld = IInstalld.Stub.asInterface(binder);
try {
invalidateMounts();
}
} else {
Slog.w(TAG, “installd not found; trying again”);
BackgroundThread.getHandler().postDelayed(() -> {
connect();
}, DateUtils.SECOND_IN_MILLIS);
}
}
public void dexopt(String apkPath, int uid, @Nullable String pkgName, String instructionSet,
int dexoptNeeded, @Nullable String outputPath, int dexFlags,
String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries,
@Nullable String seInfo, boolean downgrade, int targetSdkVersion,
@Nullable String profileName, @Nullable String dexMetadataPath,
@Nullable String compilationReason) throws InstallerException {
if (!checkBeforeRemote()) return;
try {
mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,
dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo, downgrade,
targetSdkVersion, profileName, dexMetadataPath, compilationReason);
}
}
public void rmdex(String codePath, String instructionSet) throws InstallerException {
try {
mInstalld.rmdex(codePath, instructionSet);
}
}
public void createUserData(String uuid, int userId, int userSerial, int flags)
throws InstallerException {
if (!checkBeforeRemote()) return;
try {
mInstalld.createUserData(uuid, userId, userSerial, flags);
}
}

public void linkNativeLibraryDirectory(String uuid, String packageName, String nativeLibPath32,
int userId) throws InstallerException {
if (!checkBeforeRemote()) return;
try {
mInstalld.linkNativeLibraryDirectory(uuid, packageName, nativeLibPath32, userId);
}
}
public void createOatDir(String oatDir, String dexInstructionSet)
throws InstallerException {
if (!checkBeforeRemote()) return;
try {
mInstalld.createOatDir(oatDir, dexInstructionSet);
}
}
public void linkFile(String relativePath, String fromBase, String toBase)
throws InstallerException {
if (!checkBeforeRemote()) return;
try {
mInstalld.linkFile(relativePath, fromBase, toBase);
}
}
public void deleteOdex(String apkPath, String instructionSet, String outputPath)
throws InstallerException {
mInstalld.deleteOdex(apkPath, instructionSet, outputPath);
}
public void installApkVerity(String filePath, FileDescriptor verityInput, int contentSize)
throws InstallerException {
if (!checkBeforeRemote()) return;
mInstalld.installApkVerity(filePath, verityInput, contentSize);
}
public boolean reconcileSecondaryDexFile(String apkPath, String packageName, int uid,
String[] isas, @Nullable String volumeUuid, int flags) throws InstallerException {
return mInstalld.reconcileSecondaryDexFile(apkPath, packageName, uid, isas,
volumeUuid, flags);
}

public void invalidateMounts() throws InstallerException {
if (!checkBeforeRemote()) return;
mInstalld.invalidateMounts();
}

}

二、com.android.server.SystemService概述

\frameworks\base\services\core\java\com\android\server\SystemService.java本质上就是对于一些运行在系统进程服务进行了抽象,定义了一些统一的生命周期方法和运行规则(所有方法都必须在系统服务进程的main looper thread中被调用)。

package com.android.server;

import android.os.ServiceManager;
/**
* The base class for services running in the system process. Override and implement
* the lifecycle event callback methods as needed.
* {@hide}
*/
public abstract class SystemService {

private final Context mContext;
public SystemService(Context context) {
mContext = context;
}
public abstract void onStart();

protected final void publishBinderService(String name, IBinder service) {
publishBinderService(name, service, false);
}
protected final void publishBinderService(String name, IBinder service,
boolean allowIsolated) {
ServiceManager.addService(name, service, allowIsolated);
}
protected final IBinder getBinderService(String name) {
return ServiceManager.getService(name);
}
protected final void publishLocalService(Class type, T service) {
LocalServices.addService(type, service);
}
protected final T getLocalService(Class type) {
return LocalServices.getService(type);
}

private SystemServiceManager getManager() {
return LocalServices.getService(SystemServiceManager.class);
}
}

三、Intsaller系统服务的启动

1、com.android.server.SystemServer#startBootstrapServices 触发Installer系统服务启动

private void startBootstrapServices() {
Installer installer = mSystemServiceManager.startService(Installer.class);

2、com.android.server.SystemServiceManager#startService反射创建并回调com.android.server.pm.Installer#onStart

\frameworks\base\services\core\java\com\android\server\SystemServiceManager.java

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-Z8B2wCR1-1713552870990)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值