Android13系统集成方案

test.apk与BootStrap模块完整实现

一、目录结构规划

二、test.apk模块集成

1、将apk文件放到 packages/apps/TestApp/src/com/app/test 文件中

2、Android.mk配置文件

文件路径:packages / apps / TestApp / Android.mk

cs 复制代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# 模块名称
LOCAL_MODULE := TestApp
# 模块类型
LOCAL_MODULE_CLASS := APPS
# 预编译 APK 文件路径
LOCAL_SRC_FILES := src/com/app/test/test.apk
# 后缀
LOCAL_MODULE_SUFFIX := .apk
# 平台签名
LOCAL_CERTIFICATE := platform
# 安装到 priv-app 目录(获得系统权限)
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PREBUILT)

三、BootStrap模块实现

1、AndroidManifest.xml

文件路径:packages / apps / BootStrap / AndroidManifest.xml

cs 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bootstrap">

    <!-- 必要权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!-- Android 13 中如果需要从后台启动 Activity,需声明 -->
    <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />

    <application
        android:label="System BootStrap"
        android:persistent="true">

        <!-- 主Activity -->
	<activity android:name=".MainActivity"
		android:exported="false"
		android:launchMode="singleInstance">
	</activity>

        <receiver android:name=".BootReceiver"
		android:exported="true"
		android:enabled="true"
		android:directBootAware="true"> <!-- 添加 directBootAware -->
		<intent-filter android:priority="-1000"> <!-- 降低优先级 -->
			<action android:name="android.intent.action.BOOT_COMPLETED" />
			<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
		</intent-filter>
	</receiver>

    </application>
</manifest>

2、Android.mk

文件路径:packages / apps / BootStrap / Android.mk

cs 复制代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := BootStrap
#LOCAL_MODULE := BootStrap
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PACKAGE)

3、BootReceiver.java

文件路径:packages / apps / BootStrap / src / com / example / bootstrap / BootReceiver.java

cs 复制代码
package com.example.bootstrap;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;

public class BootReceiver extends BroadcastReceiver {
    private static final String TAG = "BootStrap";
    private static final long BOOT_COMPLETE_DELAY = 15000; // 15秒延迟

    @Override
    public void onReceive(final Context context, Intent intent) {
        String action = intent.getAction();
        Log.i(TAG, "Received boot action: " + action);

        if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
            // 使用 Handler 延迟启动,确保系统完全就绪
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    // 检查系统是否真正就绪
                    if (isSystemReady(context)) {
                        startTargetApp(context);
                    } else {
                        // 如果未就绪,再延迟5秒重试
                        new Handler().postDelayed(this, 5000);
                    }
                }
            }, BOOT_COMPLETE_DELAY);
        }
    }

    private boolean isSystemReady(Context context) {
        try {
            // 检查系统服务是否可用
            if (context.getPackageManager() == null) {
                return false;
            }
            // 检查系统 UI 是否已启动
            Intent homeIntent = new Intent(Intent.ACTION_MAIN);
            homeIntent.addCategory(Intent.CATEGORY_HOME);
            if (context.getPackageManager().resolveActivity(homeIntent, 0) == null) {
                return false;
            }
            return true;
        } catch (Exception e) {
            Log.e(TAG, "Error checking system ready: ", e);
            return false;
        }
    }

    private void startTargetApp(Context context) {
        try {
            String targetPackage = "com.app.test";
            Intent intent = context.getPackageManager()
                .getLaunchIntentForPackage(targetPackage);
            
            if (intent != null) {
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                
                // 添加额外标志避免干扰启动动画
                intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
                
                context.startActivity(intent);
                Log.i(TAG, "Successfully launched: " + targetPackage);
            }
        } catch (Exception e) {
            Log.e(TAG, "Exception launching app: ", e);
        }
    }
}

4、MainActivity.java

文件路径:packages / apps / BootStrap / src / com / example / bootstrap / MainActivity.java

cs 复制代码
package com.example.bootstrap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    private static final String TARGET_PACKAGE = "com.app.test";
    private static final String TAG = "BootStrap";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            // 延迟 2 秒,确保系统服务完全启动 可能会造成白色闪屏
            //Thread.sleep(2000);

            Intent intent = getPackageManager().getLaunchIntentForPackage(TARGET_PACKAGE);
            if (intent != null) {
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                startActivity(intent);
                Log.i(TAG, "Successfully launched: " + TARGET_PACKAGE);
            } else {
                Log.e(TAG, "Failed to find launch intent for: " + TARGET_PACKAGE);
            }
        } catch (Exception e) {
            Log.e(TAG, "Exception while launching app: ", e);
        }

        finish();
    }
}

四、产品配置集成

文件路径 device / rockchip / rk356x / rk3568_t / rk3568_t.mk

cs 复制代码
# 预置系统应用
PRODUCT_PACKAGES += \
    TestApp \
    BootStrap

五、编译与验证步骤

相关推荐
孜孜不倦不忘初心1 小时前
Ant Design Vue 表格组件空数据统一处理 踩坑
前端·vue.js·ant design
Joyee6911 小时前
RN 的新通信模型 JSI
前端·react native
somebody1 小时前
零经验学 react 的第6天 - 循环渲染和条件渲染
前端
青晚舟2 小时前
AI 时代前端还要学 Docker & K8s 吗?我用一次真实部署经历说清楚
前端·github
墨鱼笔记2 小时前
不使用微前端:如何实现主应用和子模块动态管理与通信实现
前端
兆子龙2 小时前
前端工程师转型 AI Agent 工程师:后端能力补全指南
前端·javascript
长安11082 小时前
web后端----HTTP协议与浏览器F12
前端·网络协议·http
前端大波2 小时前
Web Vitals 与前端性能监控实战
前端·javascript