首页 > 其他分享 >Android13开机向导

Android13开机向导

时间:2024-12-13 14:31:17浏览次数:8  
标签:xml telephony Android13 向导 hardware etc device 开机 android

文章目录


前言

前面一篇文章在Android12 基础上已经分析了开机向导定制方案,这里再以实际案例在Android13 上面从另外一个思路来实现需求


需求-场景

去掉开机向导里面的SIM模块,Tel相关的全部去掉:比如 SIM 检测界面、紧急呼叫入口和界面
备注:在上一篇笔记中已经提到了思路,其实是无法去掉SIM界面和Tel 相关的,限制太多了。
下面我们从另外的角度来解决这个问题,换一个方向思考并解决问题。 去feature

第三方资料说明

高通C6490 android13 GMS 认证之CtsCarrierApiTestCases
附件WIFI——Only图片:MTK提供的WIFI Only方案
附件:FiseSetupWizard 自定义的一个开机向导源码
附件:CusSetupWizard 自定义的一个完整的开机向导原码
附件下载地址

在这里插入图片描述
备注:

  • 附件 两个开机向导可以直接放到系统里面进行编译,去掉平台自带的开机向导,然后在已有开机向导源码基础上更改。【比较早的开机向导,UI不咋样】
  • 在开机向导源码的基础上,分析已有部分的逻辑,针对性再定制自己需求,反推思考逻辑和业务,看能否实现自己定制的需求。
  • WIFI-Only图片,为平台提供的WIFI Only部分修改点,可以借鉴。
  • 特别提醒,不同平台和不同版本,以及
    手机和平板方案区别是很大的。所以,参考即可。【这里重点提一下,如果您的方案是手机方案,是无法实现更改为WIFI Only方案的】

需求思路

按照平台 思路 从配置上去 feature

下面自己在MTKAndroid13 中 去feature的一些流程,可参考 
 去tel 相关
frameworks/native/data/etc/Android.bp


//prebuilt_etc {
//    name: "android.hardware.telephony.gsm.prebuilt.xml",
//    src: "android.hardware.telephony.gsm.xml",
//    defaults: ["frameworks_native_data_etc_defaults"],
//}

//prebuilt_etc {
//    name: "android.hardware.telephony.ims.prebuilt.xml",
//    src: "android.hardware.telephony.ims.xml",
//    defaults: ["frameworks_native_data_etc_defaults"],
//}

//prebuilt_etc {
//    name: "android.hardware.telephony.cdma.prebuilt.xml",
//    src: "android.hardware.telephony.cdma.xml",
//    defaults: ["frameworks_native_data_etc_defaults"],
//}




屏蔽tel 和 修改sim 个数 
device/mediatek/vendor/mgvi_64_armv9/device.mk
device/mediatek/vendor/mgvi_64_nfc_armv82/device.mk
device/mediatek/vendor/mgvi_64_tee_armv82/device.mk
device/mediatek/vendor/mgvi_64_teei_armv82/device.mk
device/mediatek/vendor/mgvi_64_teei_armv82/device.mk
device/mediatek/vendor/mgvi_32_armv82/device.mk
device/mediatek/vendor/mgvi_64_armv82/device.mk
device/mediatek/vendor/mgvi_32_armv82_ago/device.mk
device/mediatek/vendor/mgvi_64_ww_armv82/device.mk

#PRODUCT_COPY_FILES += $(LOCAL_PATH)/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml

# set Telephony property - SIM count    默认是2 我们改为0 
SIM_COUNT := 0   


屏蔽tel 相关
device/google_car/common/pre_google_car.mk
#$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system_ext.mk)

#$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_vendor.mk)


PRODUCT_COPY_FILES += \
        frameworks/native/data/etc/car_core_hardware.xml:system/etc/permissions/car_core_hardware.xml \
        frameworks/native/data/etc/android.hardware.type.automotive.xml:system/etc/permissions/android.hardware.type.automotive.xml \
       # frameworks/native/data/etc/android.hardware.telephony.gsm.xml:system/etc/permissions/android.hardware.telephony.gsm.xml \
        #frameworks/native/data/etc/android.hardware.telephony.cdma.xml:system/etc/permissions/android.hardware.telephony.cdma.xml \
		


device/google/coral/device.mk
    #frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \
    #frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml \
    #frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml \		

    #frameworks/native/data/etc/android.hardware.telephony.carrierlock.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.carrierlock.xml \



device/google/cuttlefish/shared/phone/device_vendor.mk
device/google/cuttlefish/shared/slim/device_vendor.mk
device/google/cuttlefish/shared/wear/device_vendor.mk

#ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
#PRODUCT_COPY_FILES += \
#    frameworks/native/data/etc/android.hardware.biometrics.face.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.biometrics.face.xml \
#    frameworks/native/data/etc/android.hardware.faketouch.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.faketouch.xml \
#    frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \
#    frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \
#    frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml
#endif




device/mediatek/common/device.mk
# For C2K CDMA feature file
#ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)),yes)
#PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml
#endif

# Telephony
#PRODUCT_COPY_FILES += device/mediatek/config/apns-conf.xml:system/etc/apns-conf.xml:mtk
#PRODUCT_COPY_FILES += vendor/mediatek/proprietary/hardware/ril/fusion/mtk-ril/mdcomm/data/vendor-apns-conf.xml:$(TARGET_COPY_OUT_VENDOR)/etc/vendor-apns-conf.xml:mtk
#PRODUCT_COPY_FILES += device/mediatek/common/spn-conf.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/etc/spn-conf.xml:mtk


#PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml

屏蔽所有 PRODUCT_PROPERTY_OVERRIDES += ro.telephony.sim.count=? 选项



device/mediatek/vendor/mgvi_64_armv9/VendorConfig.mk 
device/mediatek/vendor/mgvi_64_nfc_armv82/VendorConfig.mk
device/mediatek/vendor/mgvi_64_tee_armv82/VendorConfig.mk
device/mediatek/vendor/mgvi_64_teei_armv82/VendorConfig.mk
device/mediatek/vendor/mgvi_32_armv82/VendorConfig.mk
device/mediatek/vendor/mgvi_64_armv82/VendorConfig.mk
device/mediatek/vendor/mgvi_32_armv82_ago/VendorConfig.mk
device/mediatek/vendor/mgvi_64_ww_armv82/VendorConfig.mk
多卡 SIM 配置为no 
MTK_MULTI_SIM_SUPPORT=no

换个思路,去feature。

上面方案一去系统的feature ,经验上看,对于平板方案按照这个思路来更改是没有问题的,但是对于手机方案来做的平板产品来讲,是无法去除成功的,所以如果你是手机方案的大屏产品。无论怎么去就是去不掉。 如果从驱动层来去除feature+moden,将4G全部去掉又会发现各种报错。

还是先参考下 两套开机向导的源码吧,这里我们举例其中一个开机向导Sim界面的源码来参考 系统开机向导 可能存在的判断逻辑。

SimMissingActivity 判断跳过逻辑

 if (!SetupWizardUtils.simMissing(this) || !SetupWizardUtils.hasTelephony(this))


public class SimMissingActivity extends BaseSetupWizardActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!SetupWizardUtils.simMissing(this) || !SetupWizardUtils.hasTelephony(this)) {
            // NetworkSetupActivity comes before us. DateTimeActivity comes after.
            // If the user presses the back button on DateTimeActivity, we can only pass along
            // that information to NetworkSetupActivity if we are still around. But if we finish
            // here, we're gone, and NetworkSetupActivity will get whatever result we give here.
            // We can't predict the future, but we can reasonably assume that the only way for
            // NetworkSetupActivity to be reached later is if the user went backwards. So, we
            // finish this activity faking that the user pressed the back button, which is required
            // for subactivities like NetworkSetupActivity to work properly on backward navigation.
            // TODO: Resolve all this.
            finishAction(RESULT_SKIP, new Intent().putExtra("onBackPressed", true));
            return;
        }
        getGlifLayout().setDescriptionText(getString(R.string.sim_missing_summary));
        setNextAllowed(true);
    }


  重点代码: if (!SetupWizardUtils.simMissing(this) || !SetupWizardUtils.hasTelephony(this)) {

如果当前 不支持SIM 或者 没有Tel模块,那么就下一页

SetupWizardUtils 判断SIM 、 hasSystemFeature FEATURE_TELEPHONY

SIM 判断:

    public static boolean simMissing(Context context) {
        TelephonyManager tm = context.getSystemService(TelephonyManager.class);
        SubscriptionManager sm = context.getSystemService(SubscriptionManager.class);
        if (tm == null || sm == null) {
            return false;
        }
        List<SubscriptionInfo> subs = sm.getActiveSubscriptionInfoList();
        if (subs != null) {
            for (SubscriptionInfo sub : subs) {
                int simState = tm.getSimState(sub.getSimSlotIndex());
                if (LOGV) {
                    Log.v(TAG, "getSimState(" + sub.getSubscriptionId() + ") == " + simState);
                }
                if (simState != -1) {
                    final int subId = sub.getSubscriptionId();
                    final TelephonyManager subTm = tm.createForSubscriptionId(subId);
                    if (isGSM(subTm) || isLteOnCdma(subTm, subId)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }


Tel的判断

    public static boolean hasTelephony(Context context) {
        PackageManager packageManager = context.getPackageManager();
        return packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
    }


PackageManager.FEATURE_TELEPHONY

packageManager 是一个抽象类,最终走到ApplicationPackageManager.java 实现类里面的 hasSystemFeature 方法,具体源码跟踪可以自行跟踪一下。

ApplicationPackageManager hasSystemFeature

  @Override
    public boolean hasSystemFeature(String name) {
        return hasSystemFeature(name, 0);
    }


 @Override
    public boolean hasSystemFeature(String name, int version) {
        
        //wangfangchen add 
        if(name.contains("android.hardware.telephony")
        ){
            Log.d("wangfangchen","hasSystemFeature  name:"+name+"    return false");
            return false;
        }
        //wangfangchen end 
        .....
        return mHasSystemFeatureCache.query(new HasSystemFeatureQuery(name, version));
    }


所以,最终对于 android.hardware.telephony 相关的全部返回false 

总结

  • 编译源码,SIM界面 真的跳过了,实现了需求;紧急呼叫也没有了,实现了需求。
  • 这种方法区别于上一篇官网方法,其实是从底层触发来解决问题,这个并不是谷歌提倡的,但是能够解决实际问题,且解决方便。
  • 再次强调,不同平台不同安卓版本不同产品方案实现方法可能不一样,但是思路一样。

标签:xml,telephony,Android13,向导,hardware,etc,device,开机,android
From: https://blog.csdn.net/ItJavawfc/article/details/144412928

相关文章

  • 鸿蒙应用开发:开机自启并自检网络状态
    公司要开发一个小玩意,主要用途就是监测远端软件包与本地安装包是否一致,如果不是则下载更新本地应用,并且要求开机会自检。现在来跟各位看官老爷们分享一下其中的一些关键,希望各位不吝指教!开机自启关于如何设置开机自启这篇文章已经讲的很详细了,请移步:OpenHarmony应用开机自启......
  • 在CodeBolcks+wxWidgets+wxSmith下的C++编程教程——用向导创建一个wxWidgets项目(sTet
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • 电脑无法开机?从有经验的技术员角度来一步步教你解决
    电脑是现代生活中不可或缺的生产力工具,无论是消费者使用的台式机电脑还是个人笔记本电脑,亦或是工业应用的工控机,如果一旦出现故障,将会给我们的工作和生活上带来极大的不便,尤其是工控机作为工业设备中的核心控制电脑,若是在工厂自动化应用中的工控机发生故障的话,可能会造成生产线的......
  • 在CodeBolcks+wxWidgets下的C++编程教程——用向导创建一个Windows GUI项目
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • Webman在linux上通过service开机自启动
    一、在/etc/init.d下创建webman_app文件,权限777,文件内容如下#!/bin/sh###BEGININITINFO#Provides:webman_app#Required-Start:$remote_fs$network#Required-Stop:$remote_fs$network#Default-Start:2345#Default-Stop:016#......
  • 【Linux】自定义开机启动service
    【Linux】自定义开机启动service1.确认SELinux是否开启1.1临时关闭SELinux。临时禁用SELinux后,系统会立即生效,但重新启动后会恢复为启用状态。要临时禁用SELinux,请使用以下命令:sudosetenforce0这个命令将SELinux模式从Enforcing设置为Permissive,即系统会记录......
  • 自动化测试工具Ranorex Studio(五十六)-从命令行运行调制向导
    从命令行运行调制向导您可以在命令行下执行调制向导时,使用以下参数。当基于命令行进行自动化调制时,这是必需的。Ranorex.Instrumentation.exe/<arguments>p|pagename:默认是’Select’。设置这个选项,就可以直接导航到指定的页面。对基于命令行自动化的调制来说,这也是......
  • 电脑开机或打开程序提示缺少taskschd.msc文件问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个taskschd.msc文件(挑选合适的版本文件)把它......
  • 电脑开机或打开程序提示缺少msdt.exe文件问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个msdt.exe文件(挑选合适的版本文件)把它放入......
  • 电脑开机或打开程序提示缺少mmc.exe文件问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mmc.exe文件(挑选合适的版本文件)把它放入到......