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

五、编译与验证步骤

相关推荐
Old Uncle Tom44 分钟前
银行用户画像 -- 金融目标与需求意图
前端·人工智能·金融
IT_陈寒1 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
东方小月1 小时前
从0开发一个 Coding Agent(一):前言
前端·人工智能·typescript
恋猫de小郭1 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
会周易的程序员1 小时前
Mermaid Renderer:一款的图表可视化小工具
前端·vue.js·流程图·mermaid
ji_shuke1 小时前
远程排查 Web 系统问题:如何导出 HAR 文件协助定位
前端·问题排查
程序员爱钓鱼2 小时前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust
码农学院2 小时前
GEO与SEO协同:从传统搜索到生成式搜索的平滑迁移路径
服务器·前端·python
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构