MTK Android12 开机向导

news2025/7/9 10:52:41

文章目录

  • 需求-场景
  • 参考资料:
    • 博客资料
    • 官网参考资料:
    • 参考资料注意点
  • 附件资料文件说明:
  • 推荐工具:
  • 配置定制的 声明叠加层 APK
  • 需求实现
    • 替换字符、删减开机向导界面、添加开机向导界面
      • 删除部分界面需求,官网说明如下
      • 更新部分字符串、图片资源,官网说明如下
      • 遇到问题
      • 具体实现
        • 配置系统编译环境
  • 总结


需求-场景

开机向导定制

备注:开机向导是一个单独的apk 无源码,在单独apk 基础上,修改apk 实现开机向导定制。

参考资料:

博客资料

如果您有开机向导的需求,建议看一下相关开机向导定制例子,介绍,这一块内容本身对外资料很少,需要自己理解一下,然后针对需求更改。

Android 运行时资源替换----Runtime Resource Overlay:

Android8.0 Setupwizard 定制:

Android开机向导setupwizard,设置系统语言,WiFi向导:

Android Q新增Google Setup Wizard页面

Android10定制Google开机向导

Android集成自定义Google Setup Wizard

GMS如何客制化GMS开机向导

官网参考资料:

官网资料相关开机向导部分本身不对外开放的,需要谷歌账号有一定的开发权限。
自定义向导脚本
配置可选步骤:
自定义SUW:

参考资料注意点

开机向导内容属于Framework层内容模块,单独apk,没有源码,需要知晓修改原理。
开机向导修改,针对不同的主控芯片平台不一样,RK、全志、mtk、展锐、谷歌… 不同的Android版本 参考资料只是思路,针对自身平台找到自身的DEMO或者对应的修改点,不可照抄照搬。
本文针对自己在MTK Android12 上面实现需求的一个思路、编译位置、涉及到知识业务点一个总结。
存在不同平台开机引导包、不同版本开机引导包apk 名称都不一样的情况。

附件资料文件说明:

SetupWizard.apk MTK的开机向导app
SetupWizardOverlay-master.zip 第三方自定义开机向导源码
GmsSampleIntegration MTK Android12 开机向导叠加DEMO
附件资料-MTKAndroid12 开机向导相关资料

推荐工具:

2024最新版Android逆向教程——第2天:dex反编译工具的安装和使用

推荐工具目的,查看附件中的SetupWizard.apk 源码,找到 wizard_script.xml 里面的配置,这样不管需求是什么,好对应上对应的action和resultCode,
不然造成找不到加载资源crash掉、按钮点击按钮无反应不跳转;同时自己需要添加界面或者删除界面时候,好修改wizard_script.xml 文件 及 关联的xml 文件。

其源码如下:

<?xml version="1.0" encoding="utf-8"?>
<WizardScript xmlns:wizard="http://schemas.android.com/apk/res/com.google.android.setupwizard" wizard:version="2">
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.OEM_PRE_SETUP;end"
        id="oem_pre_setup"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.WELCOME;end"
        id="welcome">
        <result
            wizard:action="check_user_unlock_qr"
            wizard:name="start_qr_provision"
            wizard:resultCode="101"/>
        <result
            wizard:action="check_user_unlock_dpm_user_complete"
            wizard:name="dpm_user_complete"
            wizard:resultCode="111"/>
        <result
            wizard:action="check_user_unlock_dpm_user_complete"
            wizard:name="dpm_profile_complete"
            wizard:resultCode="112"/>
        <result
            wizard:action="check_user_unlock_work_setup_interrupted_qr_scan"
            wizard:name="check_user_unlock_work_setup_interrupted_qr_scan"
            wizard:resultCode="114"/>
        <result
            wizard:action="check_user_unlock_work_setup_interrupted_consumer_flow"
            wizard:name="check_user_unlock_work_setup_interrupted_consumer_flow"
            wizard:resultCode="115"/>
        <result
            wizard:action="check_user_unlock_nfc"
            wizard:name="check_user_unlock_nfc"
            wizard:resultCode="124"/>
        <result
            wizard:action="check_user_unlock_work_setup_interrupted_nfc_tap"
            wizard:name="check_user_unlock_work_setup_interrupted_nfc_tap"
            wizard:resultCode="125"/>
        <result
            wizard:action="check_user_unlock_fail_provisioning"
            wizard:name="provisioning_extras_not_saved"
            wizard:resultCode="128"/>
        <result wizard:action="check_user_unlock"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_fail_provisioning">
        <result wizard:action="fail_provisioning"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.SHOW_PROVISIONING_ERROR;end"
        id="fail_provisioning"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_work_setup_interrupted_nfc_tap">
        <result wizard:action="work_setup_interrupted_nfc_tap"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.WORK_SETUP_INTERRUPTED;end"
        id="work_setup_interrupted_nfc_tap">
        <result
            wizard:action="nfc_provision_flow"
            wizard:name="continue_start_nfc_provisioning"
            wizard:resultCode="1"/>
        <result wizard:action="factory_reset"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_nfc">
        <result wizard:action="nfc_provision_flow"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_nfc_provision_flow"
        id="nfc_provision_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_work_setup_interrupted_qr_scan"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.WORK_SETUP_INTERRUPTED;end"
        id="work_setup_interrupted_qr_scan">
        <result
            wizard:action="check_user_unlock_qr"
            wizard:name="continue_start_qr_scan"
            wizard:resultCode="1"/>
        <result wizard:action="factory_reset"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_work_setup_interrupted_consumer_flow"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.WORK_SETUP_INTERRUPTED;end"
        id="work_setup_interrupted_consumer_flow">
        <result
            wizard:action="check_user_unlock"
            wizard:name="continue_start_consumer_flow"
            wizard:resultCode="1"/>
        <result wizard:action="factory_reset"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_qr">
        <result wizard:action="qr_provision_flow"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock_dpm_user_complete">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_USER_UNLOCK;end"
        id="check_user_unlock"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.SLOTS_SELECTION;end"
        id="slots_selection">
        <result
            wizard:action="sim_missing"
            wizard:name="skip"
            wizard:resultCode="1"/>
        <result wizard:action="carrier_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.SIM_MISSING;end"
        id="sim_missing">
        <result
            wizard:action="esim_intro"
            wizard:name="esim"
            wizard:resultCode="101"/>
        <result
            wizard:action="carrier_setup"
            wizard:name="esim_only"
            wizard:resultCode="102"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.SIM_READY;end"
        id="sim_ready">
        <result wizard:action="carrier_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.ESIM_INTRO;end"
        id="esim_intro"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CARRIER_SETUP;end"
        id="carrier_setup">
        <result
            wizard:action="sim_setup"
            wizard:name="all_subscriptions_completed"
            wizard:resultCode="98765"/>
        <result wizard:action="carrier_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.SIM_SETUP;end"
        id="sim_setup"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.DEVICE_OWNER_WARNING;end"
        id="device_owner_warning">
        <result
            wizard:action="check_frp"
            wizard:name="skip"
            wizard:resultCode="1"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.FACTORY_RESET;end"
        id="factory_reset"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.CHECK_FRP;end"
        id="check_frp"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.CHECK_QUICK_START;end"
        id="check_quick_start">
        <result
            wizard:action="quick_start_flow"
            wizard:name="quick_start"
            wizard:resultCode="101"/>
        <result wizard:action="connect_and_update"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_quick_start_flow"
        id="quick_start_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_connect_and_update_flow"
        id="connect_and_update">
        <result
            wizard:action="no_network_flow"
            wizard:name="no_connection"
            wizard:resultCode="1"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_zero_touch_flow"
        id="zero_touch">
        <result
            wizard:action="post_dpm_user_flow"
            wizard:name="dpm_user_complete"
            wizard:resultCode="111"/>
        <result
            wizard:action="add_personal_account_after_work_profile"
            wizard:name="add_personal_account_after_work_profile"
            wizard:resultCode="120"/>
        <result
            wizard:action="setup_as_new_flow"
            wizard:name="financed_device_provisioning_complete"
            wizard:resultCode="121"/>
        <result
            wizard:action="work_profile_setup"
            wizard:name="work_profile_setup"
            wizard:resultCode="122"/>
        <result
            wizard:action="post_dpm_user_flow"
            wizard:name="device_owner_setup"
            wizard:resultCode="123"/>
        <result
            wizard:action="setup_as_new_flow"
            wizard:name="gmscore_zero_touch"
            wizard:resultCode="116"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_unified_restore_flow"
        id="unified_restore_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_post_dpm_provision_finalization_flow"
        id="work_profile_setup">
        <result wizard:action="transition_to_personal_profile_setup"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_no_network_flow"
        id="no_network_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.TRANSITION_TO_PERSONAL_PROFILE_SETUP;end"
        id="transition_to_personal_profile_setup">
        <result wizard:action="add_personal_account_after_work_profile"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_account_flow"
        id="add_personal_account_after_work_profile">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:flow="SetupAsNewFlow"
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_account_flow"
        id="setup_as_new_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_post_dpm_user_flow"
        id="post_dpm_user_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_qr_provision_flow"
        id="qr_provision_flow">
        <result wizard:action="oem_post_setup"/>
    </WizardAction>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.OEM_POST_SETUP;end"
        id="oem_post_setup"/>
    <WizardAction
        wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_post_dpm_provision_finalization_flow"
        id="enterprise_finalization_flow"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.google.android.setupwizard.KID_POST_SETUP;end"
        id="kid_post_setup"/>
    <WizardAction
        wizard:uri="intent:#Intent;action=com.android.setupwizard.EXIT;end"
        id="exit"/>
</WizardScript> 

配置定制的 声明叠加层 APK

查看官网是怎么说明的
在这里插入图片描述
所以在 MTKAndroid2 中的GmsSampleIntegration 里面有这样的配置 AndroidManifest.xml, SUW 仅将其用于查找此 APK,配置后不需要做任何需求和实现。

  <receiver android:name=".SuwCustomizationReceiver"
                  android:exported="true">
            <intent-filter>
                <action android:name="com.android.setupwizard.action.PARTNER_CUSTOMIZATION" />
            </intent-filter>
  </receiver>

需求实现

替换字符、删减开机向导界面、添加开机向导界面

先给介绍一下官网相关资料:

删除部分界面需求,官网说明如下

在这里插入图片描述
所以,先确认下需要删除的界面是否是可删的,不然删除无用,崩溃。

更新部分字符串、图片资源,官网说明如下

在这里插入图片描述
在这里插入图片描述
所以只有指定的可以叠加的资源才能叠加,动画、背景、主题、字符串…等。根据实际需求,对比可以修改的叠加资源是否可以修改,如果不满足则修改无用。

遇到问题

如上已经知晓修改资源的 name,如何查找具体的 id 或者 标签name 呢? 因为只有找到了 具体需要修改的name 你才能在对应的values、drawable…文件里面配置吧。
比如:
可叠加资源包括以下资源:

@array/deferred_high_priority_actions

那么 deferred_high_priority_actions 到底是什么,有哪些内容,这样才能方便copy 到自定义叠加apk 资源包里面去。

实际发现 在源码里面是不存在的,找不到。 在开机引导包 SetupWizard.apk里面找,这个时候反编译工具派上用场了。比如:

在这里插入图片描述
@string/sim_missing_text
在设备中未检测到 SIM 卡时显示的文本。此资源在 Android 7.0 及更高版本中有所更改。
在这里插入图片描述

具体实现

找到叠加apk 源码,对应的module 下面,添加需要修改的内容。

配置系统编译环境

找到了对应的叠加apk,但是需要把这个源码编译到系统才起作用的嘛

先查看一下叠加apk 源码目录下面的Android.mk,它是有很多模块的,每个模块对应不同的res 资源包,可查看如下 源码。

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_full $(LOCAL_PATH)/res



###############################################################################
# Various GMS Sample Integration targets
LOCAL_PATH:= $(my-dir)

# GmsSampleIntegration
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsSampleIntegration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_full $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsSampleIntegrationGo
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsSampleIntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsSampleIntegrationGo_2GB
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsSampleIntegrationGo_2GB
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
ifeq ($(strip $(MTK_PRODUCT_LINE)),tablet)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_go_2gb_tb $(LOCAL_PATH)/res
else
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_go_2gb $(LOCAL_PATH)/res
endif

LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType2Integration (No GSA, Chrome)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType2Integration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_no_gsa $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType2IntegrationGo (No GSA, Chrome)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType2IntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_no_search_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType3aIntegration (GSA, No Chrome, no placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType3aIntegration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_min $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType3aIntegrationGo (GSA, No Chrome, no placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType3aIntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_min_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType3bIntegration (GSA, No Chrome, search placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType3bIntegration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_no_chrome $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType3bIntegrationGo (GSA, No Chrome, search placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType3bIntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_no_chrome_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4aIntegration (GSA, Chrome, no placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4aIntegration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_min $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4aIntegrationGo (GSA, Chrome, no placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4aIntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_min_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4bIntegration (GSA, Chrome, search placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4bIntegration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_no_chrome $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4bIntegrationGo (GSA, Chrome, search placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4bIntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_PRODUCT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_no_chrome_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4cIntegration (GSA, Chrome, search+chrome placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4cIntegration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_full $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4cIntegrationGo (GSA, Chrome, search+chrome placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4cIntegrationGo
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_go $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType4cIntegrationGo_2GB (GSA, Chrome, search+chrome placement)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType4cIntegrationGo_2GB
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_go_2gb $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

# GmsEEAType1Integration (No GSA, No Chrome)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := GmsEEAType1Integration
LOCAL_MODULE_OWNER := google
LOCAL_MODULE_TAGS := optional
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_min $(LOCAL_PATH)/res
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)



根据源码项目名称搜索编译配置位置: 当然,如果你知道自己项目配置的位置,俺就直接在对应的编译文件中配置下。 这里说明一下,其实我自己项目是不知道在哪里配置的,
但是是GMS项目,那么一定有GMS项目自带apk 比如Youtube/SetupWizard/Photos/Gmail2 所以找到他们然后 添加自己的叠加apk GmsSampleIntegration


fise4@ubuntu-PowerEdge-R730:~/Android/mt6769-alps-release-s0.mp1.rc/alps-release-s0.mp1.rc/vendor$ grep -rn GmsSampleIntegration



google/apps/GmsSampleIntegration/Android.mk:5:# GmsSampleIntegration
google/apps/GmsSampleIntegration/Android.mk:7:LOCAL_PACKAGE_NAME := GmsSampleIntegration
google/apps/GmsSampleIntegration/Android.mk:17:# GmsSampleIntegrationGo
google/apps/GmsSampleIntegration/Android.mk:19:LOCAL_PACKAGE_NAME := GmsSampleIntegrationGo
google/apps/GmsSampleIntegration/Android.mk:29:# GmsSampleIntegrationGo_2GB
google/apps/GmsSampleIntegration/Android.mk:31:LOCAL_PACKAGE_NAME := GmsSampleIntegrationGo_2GB
google/products/gms_go.mk:88:    GmsSampleIntegrationGo
google/products/gms_go_2gb.mk:86:    GmsSampleIntegration \
google/products/gms_go_2gb.mk:108:    #GmsSampleIntegrationGo_2GB
google/products/gms_go_2gb.mk:109:    GmsSampleIntegration
google/products/gms.mk:29:    GmsSampleIntegration \

注意点:Android.mk 里面有很多几个module,比如如下几个:

...
GmsSampleIntegration  
GmsSampleIntegrationGo  
GmsSampleIntegrationGo_2GB  
GmsEEAType2Integration  
GmsEEAType2IntegrationGo   
GmsEEAType3aIntegration  
GmsEEAType3aIntegrationGo  
GmsEEAType3bIntegration
...

我们自己用到的是GmsSampleIntegration ,对应配置查看下:

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res_dhs_full $(LOCAL_PATH)/res

那不就是res_dhs_full 目录嘛,那就在对应的目录添加资源文件和字符串了。

总结

本文仅仅针对定制开机向导提供了一些思路和实践思路,具体需要针对不同平台来实现。

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

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

相关文章

思科模拟器路由器的基本配置

一、实验目的 了解路由器的作用掌握路由器的基本配置方法 3、掌握路由器模块的使用和互连方式 二、实验环境 2811路由器一台&#xff0c;计算机两台&#xff0c;Console配置线一根&#xff0c;网线若干&#xff1b;本实验拓扑图如图8-1所示&#xff1b;计算机IP地址规划如表8-…

HTTP multipart/form-data 请求

序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频&#xff0c;经过查询方法相应的方法发现使用 multipart/form-data 的方式&#xff0c;这是最常见处理二进制文件的表单编码类型。  学习了一下午&#xff0c;现在总结一下使用的方法和相关的知识点&#x…

一、测试工具LoadRunner Professional脚本编写-录制前设置

设置基于URL的脚本 原因:基于HTML的脚本会导致login接口不能正确录制 设置UTF-8 原因:不勾选此项会导致脚本中文变为乱码

Hadoop生态圈框架部署(九-2)- Hive HA(高可用)部署

文章目录 前言一、Hive部署&#xff08;手动部署&#xff09;下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决冲突2.3.1 解决guava冲突2.3.2 解决SLF4J冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在M…

JAVA |日常开发中Websocket详解

JAVA &#xff5c;日常开发中Websocket详解 前言一、Websocket 概述1.1 定义1.2 优势 二、Websocket 协议基础2.1 握手过程2.2 消息格式2.3 数据传输方式 三、Java 中使用 Websocket3.1 Java WebSocket API&#xff08;JSR - 356&#xff09;3.2 第三方库&#xff08;如 Tyrus&…

算法基础学习Day6(动态窗口)

文章目录 1.题目2.题目解答1.最大连续1的个数题目及题目解析算法学习思路一:暴力解法思路二:滑动窗口 代码提交 2.将x减到0的最小操作数题目及题目解析算法学习滑动窗口解决问题 代码提交 1.题目 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09;1658. 将 x…

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…

【leetcode】替换后的最长重复字符、将字符串翻转到单调递增

1.替换后的最长重复字符 示例如下&#xff1a; 下面我们来分析一下一个例子&#xff0c;其中K 2 暴力枚举 这里的字符串s是仅由大写字母组成&#xff0c;首先我们尝试用暴力解法的思路来想一下这道题&#xff0c;通过从第一个字符开始进行枚举&#xff0c;如果出现了条件判断…

HarmonyOS 线性容器List 常用的几个方法

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和LinkedList相比&#xff0c;LinkedList是双向链表&#xff0c;可以快速…

C# 网络编程--基础核心内容

在现今软件开发中&#xff0c;网络编程是非常重要的一部分&#xff0c;本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌&#xff1a; : 上图引用大佬的图&#xff0c;大家也关注一下&#xff0c;有技术有品质&#xff0c;有国有家&#xff0c;情…

基于Python实现web网页内容爬取

文章目录 1. 网页分析2. 获取网页信息2.1 使用默认的urllib.request库2.2 使用requests库1.3 urllib.request 和 requests库区别 2. 更改用户代理3. BeautifulSoup库筛选数据3.1 soup.find()和soup.find_all() 函数 4. 抓取分页链接参考资料 在日常学习和工作中&#xff0c;我们…

ASP .NET Core 中的环境变量

在本文中&#xff0c;我们将通过组织一场小型音乐会&#xff08;当然是在代码中&#xff09;来了解 ASP .NET Core 中的环境变量。让我们从创建项目开始&#xff1a; dotnet new web --name Concert 并更新Program.cs&#xff1a; // replace this: app.MapGet("/"…

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…

操作系统:中断与处理器调度

目录 1、中断与中断系统 中断概念&#xff1a; 中断装置&#xff1a; 中断相关概念&#xff1a; 中断优先级别与中断屏蔽 2、处理机&#xff08;CPU&#xff09;调度 调度相关参数&#xff1a;P62 调度算法&#xff1a; 处理机调度时机 处理机调度过程 3、调度级别与多…

【推荐算法】单目标精排模型——FiBiNET

key word: 学术论文 Motivation&#xff1a; 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的&#xff0c;这篇文章的作者提出了采用SENET实现动态学习特征的重要性&#xff1b;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…

AndroidStudio配置aar包的依赖方式

创建本地仓库文件夹和aar文件夹 创建本地仓库文件夹LocalRepo&#xff0c;文件夹名称可以自定义。在LocalRepo文件夹下为每一个aar单独创建文件夹&#xff0c;如下所示。aar包就放在各自的文件夹下。请注意一个aar文件夹下只能放置一个aar。 配置build.gradle文件 在aar文件…

unity 让文字变形

效果&#xff1a; using TMPro; using UnityEngine; using NaughtyAttributes;[ExecuteInEditMode] public class TMTextPerpective : MonoBehaviour {[OnValueChanged("DoPerspective")][Range(-1f, 1f)]public float CenterBias 0f;[OnValueChanged("DoPers…

关于SpringBoot项目创建后构建总是失败的问题

第一个问题&#xff1a;IDEA创建项目总是失败 原因&#xff1a;创建项目的时候默认使用的是https://start.spring.io&#xff0c;这个是一个外国网站&#xff0c;众所周知的就是国内访问总是出现不稳定的现象&#xff0c;这就是导致项目创建失败的最终原因。 解决方法&#x…

个人IP建设:简易指南

许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者&#xff0c;您无法使用营销团队&#xff0c;因此许多人通过推荐和他们的网络来产生需求。因此&#xff0c;扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…

LLM对话过程的DDD

终于抽出时间调整了一下DDD的结构&#xff0c;感觉这套设计虽然有些不是很原教旨&#xff0c;但已经能很好的支持至少一年的业务迭代了。直接给结论&#xff0c;直接抄也不会有什么错。 整体方案脱胎自openai的assistant api Entity Thread&#xff0c;对话过程。由Message构…