Framework Service读取Nvram的值,决定打开不同的launcher

本文介绍了如何在Android的FrameworkService中通过NVram存储值来动态决定启动哪个launcher。MTK平台允许修改homeintent逻辑,使得出厂设置不会影响此值,仅在刷机时更新。内容涉及NVRam在应用层及底层系统的使用和MTK针对开机logo的修改机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这里的写值在NVram中,恢复出厂设置也不影响这个值,只有刷机才会更新;
一般来说home键打开launcher的intent是固定的,但是,我们可以修改打开homeintent的逻辑,从而打开不同的launcher;
先了解一下NvRam在app层的使用 NvRAM App层的使用
以及在uboot和kernel中的使用 MTK修改动态切换开机logo,恢复出厂设置不还原


一、在framework中加入nvram的编译

diff --git a/alps/frameworks/base/Android.bp b/alps/frameworks/base/Android.bp
index 37bfc439aa..3e78c82846 100644
--- a/alps/frameworks/base/Android.bp
+++ b/alps/frameworks/base/Android.bp
@@ -785,6 +785,7 @@ java_defaults {
         "android.hardware.vibrator-V1.3-java",
         "android.hardware.wifi-V1.0-java-constants",
         "devicepolicyprotosnano",
+               "vendor.mediatek.hardware.nvram-V1.0-java",
     ],
 
     required: [
diff --git a/alps/frameworks/base/services/Android.bp b/alps/frameworks/base/services/Android.bp
index b08d1a8095..25ca50ed37 100644
--- a/alps/frameworks/base/services/Android.bp
+++ b/alps/frameworks/base/services/Android.bp
@@ -36,6 +36,7 @@ java_library {
         "services.usb",
         "services.voiceinteraction",
         "android.hidl.base-V1.0-java",
+               "vendor.mediatek.hardware.nvram-V1.0-java",
     ],
 
     libs: [

二、修改代码

1.修改home intent的逻辑

android10的在ActivityTaskManagerService.java,10以前的有点区别 搜一下getHomeIntent的方法在哪里就行,
注意private int mOffset=774; 这个值,是指数据存储位置偏移,前言里面两篇文章有mOffset的定义是怎么来的

diff --git a/alps/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/alps/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 7c39d29a70..3be814e23b 100755
--- a/alps/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/alps/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -298,6 +298,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import com.android.internal.util.HexDump;
+import vendor.mediatek.hardware.nvram.V1_0.INvram;
 

@@ -5874,10 +5876,46 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
      Intent getHomeIntent() {
        	Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
         intent.setComponent(mTopComponent);
         intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
         if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
-            intent.addCategory(Intent.CATEGORY_HOME);
+            //intent.addCategory(Intent.CATEGORY_HOME);
+                       int launcherindex=readNvRAMData();
+                       if(launcherindex==0){
+                               intent.addCategory("android.intent.category.HOME_CLIFE");
+                       }else{
+                               intent.addCategory(Intent.CATEGORY_HOME);
+                       }
         }
         return intent;
     }
+       
+       private final String NVTAG="NvRAMUtil";
+    private final String PRODUCT_INFO_FILENAME = "/mnt/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO";
+    private int mSize=1024;
+    private int mOffset=774;
+    public  int readNvRAMData() {
+        int targets = 0;
+        try {
+            String buff = null;
+            INvram agent = INvram.getService();
+            Log.i(NVTAG, "readData from "+PRODUCT_INFO_FILENAME);
+            if (agent != null) {
+                buff = agent.readFileByName(PRODUCT_INFO_FILENAME, mSize);
+            }
+            byte[] buffArr = HexDump.hexStringToByteArray(buff.substring(0, buff.length() - 1));
+            byte[] dataArr=new byte[4];
+
+            System.arraycopy(buffArr,mOffset,dataArr,0,4);
+            Log.i(NVTAG, "readData 1111: buffArr=" + Arrays.toString(dataArr));
+
+//            targets = (dataArr[0] & 0xff) | ((dataArr[1] << 8) & 0xff00) | ((dataArr[2] << 24) >>> 8) | (dataArr[3] << 24);
+            targets = (dataArr[0] & 0xff) | ((dataArr[1] << 8) & 0xff00) | ((dataArr[2] << 24) >> 8 & 0xff0000) | (dataArr[3] << 24);
+
+            Log.i(NVTAG, "readData: buffArr=" + Arrays.toString(dataArr) + ", targets == " + targets);
+        } catch (Exception e) {
+            Log.e(NVTAG, "readData exception:" + e.getLocalizedMessage());
+            e.printStackTrace();
+        }
+        return targets;
+    }

2.修改SE权限

代码如下(示例):

diff --git a/alps/device/mediatek/mt8168/sepolicy/basic/system_server.te b/alps/device/mediatek/mt8168/sepolicy/basic/system_server.te
index 5e4c9eab44..7e458d60a2 100644
--- a/alps/device/mediatek/mt8168/sepolicy/basic/system_server.te
+++ b/alps/device/mediatek/mt8168/sepolicy/basic/system_server.te
@@ -20,3 +20,5 @@ allow system_server media_rw_data_file:file open;
 allow system_server media_rw_data_file:file create;
 allow system_server sdcardfs:file rw_file_perms;
 allow system_server sdcardfs:file create;
+allow system_server nvram_agent_binder_hwservice:hwservice_manager find;
+allow system_server nvram_agent_binder:binder call;


总结

这里的写值在NVram中,恢复出厂设置也不影响这个值,只有刷机才会更新,
NvRam在app层的使用 NvRAM App层的使用
以及在uboot和kernel中的使用 MTK修改动态切换开机logo,恢复出厂设置不还原

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值