Lineageos 22.1(Android 15) 开机向导制作

一、前言

开机向导原理其实就是将特定的category的Activity加入ComponentResolver,如下

 <category android:name="android.intent.category.SETUP_WIZARD"/>

然后我们开机启动的时候,FallbackHome结束,然后启动Launcher的时候,就会找到对应的开机向导Activity页面。所以我们现定制我们自己的应用。

二、定制MyApp

1.清单文件,定义好权限和Launcer相关的category

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.WRITE_SETTINGS"tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"tools:ignore="ProtectedPermissions" /><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyProvision2"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"android:label="@string/app_name"android:theme="@style/Theme.MyProvision2"><intent-filter android:priority="2"><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.HOME"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.SETUP_WIZARD"/></intent-filter></activity></application></manifest>

2.MainActivity,简单一个页面,点击之后完成配置

package com.example.myprovision2import android.content.ComponentName
import android.content.pm.PackageManager
import android.os.Bundle
import android.provider.Settings
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import com.example.myprovision2.ui.theme.MyProvision2Themeclass MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContent {MyProvision2Theme {Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->Greeting(name = "Android",modifier = Modifier.padding(innerPadding))Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {Image(modifier=Modifier.fillMaxSize(),painter = painterResource(R.drawable.pic),contentScale = ContentScale.FillBounds,contentDescription = "")OutlinedButton(onClick = {finishSetup()}) {Text(text = "FINISH SET UP",)}}}}}}private fun finishSetup() {setProvisioningState()disableSelfAndFinish()}private fun disableSelfAndFinish() {// remove this activity from the package manager.val pm = packageManagerval name: ComponentName = ComponentName(this, MainActivity::class.java)pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)
//         terminate the activity.finish()}private fun setProvisioningState() {
//        Settings
//        Log.i(TAG, "Setting provisioning state")// Add a persistent setting to allow other apps to know the device has been provisioned.Settings.Global.putInt(contentResolver, Settings.Global.DEVICE_PROVISIONED, 1)Settings.Secure.putInt(contentResolver, Settings.Secure.USER_SETUP_COMPLETE, 1)}}@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {Text(text = "Hello $name!",modifier = modifier)
}@Preview(showBackground = true)
@Composable
fun GreetingPreview() {MyProvision2Theme {Greeting("Android")}
}

3.这里有特殊的权限,需要在system/etc/permissions内配置,我们准备一下权限的xml
com.example.myprovision2.xml

<?xml version="1.0" encoding="utf-8"?>
<!--~ Copyright (C) 2019 The Android Open Source Project~~ Licensed under the Apache License, Version 2.0 (the "License");~ you may not use this file except in compliance with the License.~ You may obtain a copy of the License at~~      http://www.apache.org/licenses/LICENSE-2.0~~ Unless required by applicable law or agreed to in writing, software~ distributed under the License is distributed on an "AS IS" BASIS,~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.~ See the License for the specific language governing permissions and~ limitations under the License-->
<permissions><privapp-permissions package="com.example.myprovision2"><permission name="android.permission.WRITE_SECURE_SETTINGS"/></privapp-permissions>
</permissions>

4.修改Android.bp

android_app_import {name: "MyApp",// this needs to be a privileged applicationprivileged: true,// Make sure the build system doesn't try to resign the APKdex_preopt: {enabled: false,},arch: {arm: {apk: "MyApp.apk",},arm64: {apk: "MyApp.apk",},x86: {apk: "MyApp.apk",},x86_64: {apk: "MyApp.apk",},},certificate: "platform",required: ["MyAppPermissions"],}// 定义 XML 文件复制规则 
prebuilt_etc {name: "MyAppPermissions",      // 模块唯一标识 src: "com.example.myprovision2.xml", // 源文件路径(相对于当前 Android.bp )sub_dir: "permissions",        // 指定 system/etc 下的子目录 filename: "com.example.myprovision2.xml", // 目标文件名(可重命名)}

完成之后我们make MyApp就会自动复制权限xml到对应目录下。

三、验证

我们push apk和xml到对应目录下之后,然后重启设备。这里重启之前还需要重置一下变量

adb shell settings put secure user_setup_complete 0

这样解锁有就可以正常启动我们自定义的开机向导了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【二分搜索 C/C++】洛谷 P1873 EKO / 砍树

2025 - 02 - 19 - 第 55 篇 Author: 郑龙浩 / 仟濹(CSND) 【二分搜索】 文章目录 洛谷 P1873 EKO / 砍树题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 说明/提示题目中的部分变量思路代码 洛谷 P1873 EKO / 砍树 题目描述 伐木工人…

DeepSeek系列模型发展:从LLM到V3、R1的技术突破与优化各阶段的重要论文汇总(附下载地址)

DeepSeek 系列模型从最初的 LLM 版本发展到最新的 V3 和 R1 版本&#xff0c;在架构设计、训练效率和推理能力方面不断取得进步。以下是各版本按时间倒序的详细信息&#xff1a; 1. DeepSeek-R1 发布时间&#xff1a;2025年1月 论文标题&#xff1a;DeepSeek-R1: Incentivizi…

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…

推荐一款AI大模型托管平台-OpenWebUI

推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离…

js中常用方法整理

数据类型 typeOf()Number&#xff08;&#xff09;parseInt()parseFloat()- * / %检测数据类型转换为数字转换为整数类型转换为浮点类型非加法的数字运算toString()Boolean()String()转换为字符串&#xff0c;不能转换undefined/null字符串拼接转换为布尔类型转换为字符串、所有…

java练习(33)

ps:题目来自力扣 最强回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…

本地部署DeepSeek大模型

环境&#xff1a;nuc工控机器 x86架构 ubuntu20.04 1、浏览器打开Download Ollama on Linux&#xff0c;复制命令。 2.打开终端&#xff0c;输入命令。 curl -fsSL https://ollama.com/install.sh | sh 等待安装&#xff0c;安装完成后&#xff0c;终端输入 ollama&#xff…

Nginx 常用命令和部署详解及案例示范

一、Nginx常用命令 1.1 启动 Nginx 要启动 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重启 Nginx 在修改了 Nginx…

2025鸿蒙开发面试题汇总——通俗易懂

问题和通俗易懂的答案&#xff0c;覆盖鸿蒙开发的核心知识点和实际场景&#xff0c;方便面试时快速评估候选人能力&#xff1a; 一、基础概念&#xff08;必问&#xff09; 鸿蒙和安卓最大的区别是什么&#xff1f;举个实际例子。 答案&#xff1a;鸿蒙是“分布式操作系统”&am…

Kotlin 优雅的接口实现

1. 日常遇到的冗余的接口方法实现 日常开发中&#xff0c;经常会要实现接口&#xff0c;但是很多场景中&#xff0c;只需要用到其中一两个方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多个接口需要实现&#xff0c;但是很多时候我们只需要用到其中的一…

Java List 自定义对象排序 Java 8 及以上版本使用 Stream API

从 Java 8 开始&#xff0c;你可以使用 Stream API 对 List 进行排序&#xff0c;这种方式更加简洁和灵活。 以下是一个示例代码&#xff1a; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors;// 自定…

【Spring详解一】Spring整体架构和环境搭建

一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构&#xff0c;包含一系列功能要素&#xff0c;被分为大约20个模块 Spring核心容器&#xff1a;包含Core、Bean、Context、Expression Language模块 Core &#xff1a;其他组件的基本核心&#xff…

Linux内核读写锁与读写信号量的区别及选用

在Linux内核中&#xff0c;读写锁&#xff08;rwlock_t&#xff09;和读写信号量&#xff08;struct rw_semaphore&#xff09;是两种不同的同步机制&#xff0c;适用于不同的场景。以下是它们的区别和选用建议&#xff1a; 核心区别 特性读写锁 (rwlock_t)读写信号量 (struct…

用openresty和lua实现壁纸投票功能

背景 之前做了一个随机壁纸接口&#xff0c;但是不知道大家喜欢对壁纸的喜好&#xff0c;所以干脆在实现一个投票功能&#xff0c;让用户给自己喜欢的壁纸进行投票。 原理说明 1.当访问http://demo.com/vote/时&#xff0c;会从/home/jobs/webs/imgs及子目录下获取图片列表&…

LLaMA 3.1 模型在DAMODEL平台的部署与实战:打造智能聊天机器人

文章目录 前言 一、LLaMA 3.1 的特点 二、LLaMA3.1的优势 三、LLaMA3.1部署流程 &#xff08;一&#xff09;创建实例 &#xff08;二&#xff09;通过JupyterLab登录实例 &#xff08;3&#xff09;部署LLaMA3.1 &#xff08;4&#xff09;使用教程 总结 前言 LLama3…

【Python爬虫(25)】解锁Python爬虫:数据存储的最优选择与高效策略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍

这里写目录标题 1 混合精度训练1.1 FP16和FP321.2 优点1.3 存在的问题1.4 解决办法 2 DeepSpeed3 vLLM3.1 存在的问题3.2 解决方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解码场景 3.3 结论 4 LightEval4.1 主要功能4.2 使用方法4.3 应用场景 本文继续深入了解O…

使用 FFmpeg 剪辑视频指南

FFmpeg 是一个功能强大的多媒体处理工具&#xff0c;可以进行视频和音频的剪辑、合并、转码等操作。本文将详细介绍如何使用 FFmpeg 进行视频剪辑&#xff0c;并通过实例帮助你快速掌握剪辑技巧。我们会从最基础的剪切功能讲起&#xff0c;再延伸到一些高级操作&#xff0c;如指…

【分布式理论15】分布式调度1:分布式资源调度的由来与过程

文章目录 一、操作系统的资源调度&#xff1a;从单核到多核二、 分布式系统的资源调度&#xff1a;从单台服务器到集群三、 固定资源映射四、 动态资源分配&#xff1a;灵活的任务-资源匹配五、 资源调度过程&#xff1a;从申请到执行 本文主要讨论主题&#xff1a; 从操作系统…

【Linux C/C++开发】Linux系统轻量级的队列缓存mqueue

前言 开发设计时&#xff0c;通常会对业务流程进行模块化&#xff0c;有些流程之间&#xff0c;不要求同步&#xff0c;但又需要传递信息时&#xff0c;如果存储到数据库&#xff0c;效率降低很多&#xff0c;如果是存放在内存是最好的。此时可以选择系统的IPC&#xff08;进程…