Android11 部分定制修改(持续更新)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

Android11 源码部分修改


1.修改之前的接4K显示器,默认4K60Hz记录

@@ -1668,7 +1668,7 @@ int setVideoResolution(int resolution) {
         setValue(HDMI_VIDEO_AUTO, 1);
 
 
-    if(resolution == 28){
+    if(resolution == 28 && getValue(HDMI_VIDEO_AUTO,"1") == 1){
         resolution = 27;
     }

2.移除launcher搜索框

--- a/packages/apps/Launcher3/res/layout/search_container_workspace.xml
+++ b/packages/apps/Launcher3/res/layout/search_container_workspace.xml
@@ -22,9 +22,9 @@
         android:id="@id/search_container_workspace"
         android:padding="0dp" >
 
-    <fragment
+    <!--fragment
         android:name="com.android.launcher3.qsb.QsbContainerView$QsbFragment"
         android:layout_width="match_parent"
         android:tag="qsb_view"
-        android:layout_height="match_parent"/>
+        android:layout_height="match_parent"/-->
 </com.android.launcher3.qsb.QsbContainerView>
\ No newline at end of file
diff --git a/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java b/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
index 1441e0b93b..4a5d7b71f7 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
@@ -512,10 +512,12 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
         }
 
         CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, firstPage.getCountX(), 1);
+        /** 
         lp.canReorder = false;
         if (!firstPage.addViewToCellLayout(qsb, 0, R.id.search_container_workspace, lp, true)) {
             Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
         }
+        */
     }
 
     public void removeAllWorkspaceScreens() {
diff --git a/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java b/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java
index c989e7bf64..e3c94c1a19 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -318,6 +318,7 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
         mSearchContainer = findViewById(R.id.search_container_all_apps);
         mSearchUiManager = (SearchUiManager) mSearchContainer;
         mSearchUiManager.initialize(this);
+        mSearchContainer.setVisibility(View.GONE);
     }
 
     public SearchUiManager getSearchUiManager() {
diff --git a/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionCon
troller.java
index a9b030e056..7c017d2d4d 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -211,7 +211,7 @@ public class AllAppsTransitionController implements StateHandler<LauncherState>,
             setter.setViewAlpha(mAppsView.getContentView(), 0, allAppsFade);
             setter.setViewAlpha(mAppsView.getScrollBar(), 0, allAppsFade);
         }
-        mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade);
+        //mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade);
 
         setter.setInt(mScrimView, ScrimView.DRAG_HANDLE_ALPHA,
                 (visibleElements & VERTICAL_SWIPE_INDICATOR) != 0 ? 255 : 0, allAppsFade);

3.设置客户默认壁纸,添加客户壁纸到壁纸库

diff --git a/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png b/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
index cb00d82a82..ecf08e015d 100644
Binary files a/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png and b/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png differ
diff --git a/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/drawable/default_wallpaper01.png b/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/drawable/default_wallpaper01.png
new file mode 100644
index 0000000000..f8b0cbb1b6
Binary files /dev/null and b/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/drawable/default_wallpaper01.png differ
diff --git a/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/drawable/default_wallpaper01_small.png b/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/drawable/default_wallpaper01_small.png
new file mode 100644
index 0000000000..f8b0cbb1b6
Binary files /dev/null and b/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/drawable/default_wallpaper01_small.png differ
diff --git a/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/values-nodpi/wallpapers.xml b/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/values-nodpi/wallpapers.xml
index 1e340e4b28..57708d1f25 100644
--- a/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/values-nodpi/wallpapers.xml
+++ b/vendor/mediatek/proprietary/packages/apps/WallpaperPicker/res/values-nodpi/wallpapers.xml
@@ -17,5 +17,6 @@
 
 <resources>
     <string-array name="wallpapers" translatable="false">
+    <item>default_wallpaper01</item>
     </string-array>
 </resources>

4.内置客户需要的apk

+++ b/build/make/target/product/handheld_product.mk
@@ -34,7 +34,12 @@ PRODUCT_PACKAGES += \
     preinstalled-packages-platform-handheld-product.xml \
     QuickSearchBox \
     SettingsIntelligence \
-    frameworks-base-overlays
+    frameworks-base-overlays \
+    chrome \

+++ b/packages/apps/Chrome/Android.mk
@@ -0,0 +1,24 @@
+# ///ADD START
+# ///ADD END
+# 设置当前工作路径
+LOCAL_PATH:= $(call my-dir)
+# 清除变量值
+include $(CLEAR_VARS)
+# 生成的模块名称
+LOCAL_MODULE := chrome
+# 生成的模块类型
+LOCAL_MODULE_CLASS := APPS
+# 生成的模块后缀名,此处为apk
+LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
+# 设置模块tag,tags取值可以为:user debug eng tests optional
+# optional表示全平台编译
+LOCAL_MODULE_TAGS := optional
+# LOCAL_PRIVILEGED_MODULE := true
+LOCAL_BUILT_MODULE_STEM := package.apk
+# 设置源文件
+LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
+# LOCAL_CERTIFICATE := platform
+# 设置签名,此处表示保持apk原有签名
+LOCAL_CERTIFICATE := PRESIGNED
+# 此处表示预编译方式
+include $(BUILD_PREBUILT)

5.亮度条调节呈线性变化,修复99%~100%亮度突变的问题

//Android11 其亮度随亮度调变化是呈现非线性的,用了新的算法,我们这里修改一下
//255太亮了,我们这里设置最大亮度值未241
/*
	几个数值的说明
	0.94486916F == 241/255		我们自己设定的亮度值百分比
	65535						亮度条最大的数值
*/
//设置亮度最大值241
--- a/frameworks/base/core/res/res/values/config.xml
+++ b/frameworks/base/core/res/res/values/config.xml
@@ -1178,7 +1178,7 @@
 
     <!-- Note: This setting is deprecated, please use
     config_screenBrightnessSettingMaximumFloat instead -->
-    <integer name="config_screenBrightnessSettingMaximum">255</integer>
+    <integer name="config_screenBrightnessSettingMaximum">241</integer>

--- a/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
+++ b/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
@@ -141,14 +141,24 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr
                     System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT, mMaxBrightness),
                     mMinVrBrightness, mMaxVrBrightness);
         } else {
+            
             value = convertLinearToGammaFloat(Settings.System.getFloat(mContentResolver,
                     System.SCREEN_BRIGHTNESS_FLOAT, mDefaultBacklight),
                     mMinBrightness, mMaxBrightness);
         }
-        return getPercentage(value, GAMMA_SPACE_MIN, GAMMA_SPACE_MAX);
+
+        int val = Settings.System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS, 241);
+        if(val > 241){
+            Settings.System.putInt(mContentResolver, System.SCREEN_BRIGHTNESS, 241);
+            val = 241;
+        }
+        
+        //return getPercentage(value, GAMMA_SPACE_MIN, GAMMA_SPACE_MAX);
+        return getPercentage(val, 0, 241);
     }
 
     private double getPercentage(double value, int min, int max) {
+
         if (value > max) {
             return 1.0;
         }
diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com
/android/systemui/settings/BrightnessController.java
index 71e788375d..ad9548ceed 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -379,9 +379,12 @@ public class BrightnessController implements ToggleSlider.Listener {
             maxBacklight = mMaximumBacklight;
             settingToChange = Settings.System.SCREEN_BRIGHTNESS_FLOAT;
         }
+        /*
         final float valFloat = MathUtils.min(convertGammaToLinearFloat(value,
                 minBacklight, maxBacklight),
                 1.0f);
+        */
+        final float valFloat = ((float)value / (float)65535) * 0.94486916F;
         if (stopTracking) {
             // TODO(brightnessfloat): change to use float value instead.
             MetricsLogger.action(mContext, metric,
@@ -450,7 +453,8 @@ public class BrightnessController implements ToggleSlider.Listener {
             return;
         }
         // Returns GAMMA_SPACE_MIN - GAMMA_SPACE_MAX
-        final int sliderVal = convertLinearToGammaFloat(brightnessValue, min, max);
+        //final int sliderVal = convertLinearToGammaFloat(brightnessValue, min, max);
+        final int sliderVal = (int)((brightnessValue / 0.94486916F)  * (float)65535);
         animateSliderTo(sliderVal);
     }

6.替换开机画面为客户给的画面

diff --git a/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/wuxga/wuxga_uboot_3840_2160.bmp b/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/wuxga/wuxga_uboot_3840_2160.bmp
index bed0bf0c89..43630442d2 100644
Binary files a/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/wuxga/wuxga_uboot_3840_2160.bmp and b/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/wuxga/wuxga_uboot_3840_2160.bmp differ

7.修改默认语言为中文,修改设备名称型号与硬件为27M3U-A

diff --git a/build/make/tools/buildinfo.sh b/build/make/tools/buildinfo.sh
index 9bee115484..a1f97c4252 100755
--- a/build/make/tools/buildinfo.sh
+++ b/build/make/tools/buildinfo.sh
@@ -45,7 +45,8 @@ fi
 echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS"
 
 echo "# ro.build.product is obsolete; use ro.product.device"
-echo "ro.build.product=$TARGET_DEVICE"
+#echo "ro.build.product=$TARGET_DEVICE"
+echo "ro.build.product=27M3U-A"
 
 echo "# Do not try to parse description or thumbprint"
 echo "ro.build.description=$PRIVATE_BUILD_DESC"
diff --git a/device/emdoor/C27C4/vnd_C27C4.mk b/device/emdoor/C27C4/vnd_C27C4.mk
index de9dd75575..0fc38c1934 100644
--- a/device/emdoor/C27C4/vnd_C27C4.mk
+++ b/device/emdoor/C27C4/vnd_C27C4.mk
@@ -17,13 +17,13 @@ PRODUCT_BUILD_PRODUCT_IMAGE := false
 endif
 
 # set locales & aapt config.
-PRODUCT_LOCALES := en_US zh_CN zh_TW es_ES pt_BR ru_RU fr_FR de_DE tr_TR vi_VN ms_MY in_ID th_TH it_IT ar_EG hi_IN bn_IN ur_PK fa_IR pt_PT nl_NL el_GR hu_HU tl_PH ro_RO cs_CZ ko_KR km
_KH iw_IL my_MM pl_PL es_US bg_BG hr_HR lv_LV lt_LT sk_SK uk_UA de_AT da_DK fi_FI nb_NO sv_SE en_GB hy_AM zh_HK et_EE ja_JP kk_KZ sr_RS sl_SI ca_ES
+PRODUCT_LOCALES := zh_CN en_US zh_TW es_ES pt_BR ru_RU fr_FR de_DE tr_TR vi_VN ms_MY in_ID th_TH it_IT ar_EG hi_IN bn_IN ur_PK fa_IR pt_PT nl_NL el_GR hu_HU tl_PH ro_RO cs_CZ ko_KR km
_KH iw_IL my_MM pl_PL es_US bg_BG hr_HR lv_LV lt_LT sk_SK uk_UA de_AT da_DK fi_FI nb_NO sv_SE en_GB hy_AM zh_HK et_EE ja_JP kk_KZ sr_RS sl_SI ca_ES
 
 # Set those variables here to overwrite the inherited values.
 PRODUCT_MANUFACTURER := innocn
 PRODUCT_NAME := vnd_C27C4
 PRODUCT_DEVICE := $(strip $(MTK_BASE_PROJECT))
-PRODUCT_MODEL := C27C4
+PRODUCT_MODEL := 27M3U-A
 PRODUCT_POLICY := android.policy_phone
 PRODUCT_BRAND := innocn

8.关闭systemUI中的下拉栏中的飞行模式,电源相关的saver

diff --git a/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java b/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java
index 3681ad2f46..bca2196b01 100644
--- a/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java
+++ b/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SettingsActivity.java
@@ -485,7 +485,7 @@ public class SettingsActivity extends SettingsBaseActivity
         LocalBroadcastManager.getInstance(this).registerReceiver(mDevelopmentSettingsListener,
                 new IntentFilter(DevelopmentSettingsEnabler.DEVELOPMENT_SETTINGS_CHANGED_ACTION));
 
-        registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        //registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
 
         updateTilesList();
     }
@@ -495,7 +495,7 @@ public class SettingsActivity extends SettingsBaseActivity
         super.onPause();
         LocalBroadcastManager.getInstance(this).unregisterReceiver(mDevelopmentSettingsListener);
         mDevelopmentSettingsListener = null;
-        unregisterReceiver(mBatteryInfoReceiver);
+        //unregisterReceiver(mBatteryInfoReceiver);
     }
 
     @Override
diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/quick_qs_status_icons.xml b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/quick_qs_status_ico
ns.xml
index 44f52efd17..12b0a7ebfa 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/quick_qs_status_icons.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/quick_qs_status_icons.xml
@@ -47,6 +47,7 @@
         android:paddingEnd="@dimen/signal_cluster_battery_padding" />
 
     <com.android.systemui.BatteryMeterView
+        android:visibility="gone"
         android:id="@+id/batteryRemainingIcon"
         android:layout_height="match_parent"
         android:layout_width="wrap_content"
diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/system_icons.xml b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/system_icons.xml
index 818d1d7717..2f7b569267 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/system_icons.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/system_icons.xml
@@ -30,6 +30,7 @@
         android:orientation="horizontal"/>
 
     <com.android.systemui.BatteryMeterView android:id="@+id/battery"
+        android:visibility="gone"
         android:layout_height="match_parent"
         android:layout_width="wrap_content"
         android:clipToPadding="false"
diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
index 848cdb1e83..ab3c66a3ac 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
@@ -106,7 +106,7 @@
 
     <!-- The default tiles to display in QuickSettings -->
     <string name="quick_settings_tiles_default" translatable="false">
-        wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast,screenrecord
+        wifi,bt,dnd,flashlight,cell,cast,screenrecord
     </string>
 
     <!-- The minimum number of tiles to display in QuickSettings -->
@@ -114,7 +114,7 @@
 
     <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
     <string name="quick_settings_tiles_stock" translatable="false">
-        wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse
+        wifi,cell,dnd,flashlight,bt,location,hotspot,inversion,dark,work,cast,night,screenrecord,reverse
     </string>
 
     <!-- The tiles to display in QuickSettings -->

9.清除主界面的应用图标

--- a/packages/apps/Launcher3/res/xml/default_workspace_3x3.xml
+++ b/packages/apps/Launcher3/res/xml/default_workspace_3x3.xml
--- a/packages/apps/Launcher3/res/xml/default_workspace_4x4.xml
+++ b/packages/apps/Launcher3/res/xml/default_workspace_4x4.xml
//有些在vendor,按需去掉应用

10.移除点击菜单键跳出屏幕设置的弹窗

diff --git a/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java b/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
index 0970dae479..b9de23fb4b 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
@@ -2650,6 +2650,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
 
     @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
+        /*
         if (keyCode == KeyEvent.KEYCODE_MENU) {
             // KEYCODE_MENU is sent by some tests, for example
             // LauncherJankTests#testWidgetsContainerFling. Don't just remove its handling.
@@ -2667,6 +2668,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
             }
             return true;
         }
+        */
         return super.onKeyUp(keyCode, event);
     }
 
diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3
/Launcher.java
index 1e1233eea2..38c35454a2 100644
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
@@ -2690,6 +2690,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
 
     @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
+        /*
         if (keyCode == KeyEvent.KEYCODE_MENU) {
             // KEYCODE_MENU is sent by some tests, for example
             // LauncherJankTests#testWidgetsContainerFling. Don't just remove its handling.
@@ -2707,6 +2708,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
             }
             return true;
         }
+        */
         return super.onKeyUp(keyCode, event);
     }

11.修复下拉状态栏长按图标报错的问题

diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 27d6901f42..95bda3e26a 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -2692,6 +2692,14 @@ public class StatusBar extends SystemUI implements DemoMode,
         startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, 0);
     }
 
+    // Monkey SystemUI AsyncTask RuntimeException
+    private Runnable mRunnable = new Runnable() {
+        @Override
+        public void run() {
+            mAssistManagerLazy.get().hideAssist();
+        }
+    };
+
     public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
             final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
             final Callback callback, int flags) {
@@ -2700,7 +2708,10 @@ public class StatusBar extends SystemUI implements DemoMode,
         final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
                 intent, mLockscreenUserManager.getCurrentUserId());
         Runnable runnable = () -> {
-            mAssistManagerLazy.get().hideAssist();
+            // Monkey SystemUI AsyncTask RuntimeException
+            //mAssistManagerLazy.get().hideAssist();
+            mHandler.post(mRunnable);
+            // End
             intent.setFlags(
                     Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
             intent.addFlags(flags);

12.在关机前执行的一些操作

//文件路径:frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java
public void run() {
	...
    // First send the high-level shut down broadcast.
	mActionDone = false;
	Intent intent = new Intent(Intent.ACTION_SHUTDOWN);
	intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY);
	mContext.sendOrderedBroadcastAsUser(intent,UserHandle.ALL, null, br, mHandler, 0, null, null);
	//上述代码是发送关机广播,如果在某app里注册了接收ACTION_SHUTDOWN的BroadcastReceiver,在关机时会接收到这一个广播
	/*
	在一个需求中,需要Android关机前,先将一些机器关闭,再关闭Android,实现方案如下:
	1.在一个后台服务中注册一个广播接收器,这个接收器接收一个关机广播(还接收各式各样的广播)
	2.这个后台服务接收关机广播时执行,将一些机器关闭的操作
	3.在关机流程时,我们需要将流程卡在发送广播后,下面就实现相关代码
	*/
	boolean actionFlag = false;
	String prop = "";
	BufferedReader reader;
	int count = 10; 
	while(!actionFlag){
		try {
			//获取设备状态
			reader = new BufferedReader(new FileReader("/dev/xxx_status"));
			prop = reader.readLine();
			Log.e(TAG,"prop = " + prop);
			//0:设备关闭;-1:设备未连接;coun<0:超时处理
			if("0".equals(prop) || "-1".equals(prop) || count < 0){
				actionFlag = true;
			}
			count--;
			//超时处理:如果超过10s未关闭,将直接关闭Android
			//此处可优化,可以弹出提示框给用户,让用户判断
			SystemClock.sleep(1000);
		} catch (IOException e) {
			e.printStackTrace();
	}

	...
}

13.设备默认MTP模式(UsbDeviceManager.java)

具体可见(非常详细的一篇好文):https://blog.csdn.net/JESSE_ZHAO_503/article/details/7861685
/*
	在这里仅对端口切换时会显示MTP模式
	当端口切换时,使用MTP模式
	在这里需要对UsbDeviceManager.java有一些基本的了解
	//具体可见:https://blog.csdn.net/JESSE_ZHAO_503/article/details/7861685
	1、定义一个runnable线程,待命执行mShowBuiltinInstallerRunnable
	2、定义一个receiver,接收各种信息进行处理
	3、定义UsbHandler的looper
	4、发送消息
	5、updateState
	6、setUsbConfig设置usb的功能,SystemProperties.set
	7、setAdbEnabled/setAcmEnabled
	8、这个函数比较特殊,逻辑上需要关注,尤其是对adb/acm的处理	(setEnabledFunctions(String functions, boolean makeDefault))
	9、updateCurrentAccessory
	10、updateUsbState更新usb的状态,将usb的状态广播出去。广播的intent UsbManager.ACTION_USB_STATE,将usb的状态、功能携带到intent中
	11、消息处理函数public void handleMessage(Message msg) {...}
	12、updateUsbNotification/updateAdbNotification
*/

/*
UsbDeviceManager的主要流程:
一 构造函数主要有两个动作:
1创建线程
HandlerThreadthread= new HandlerThread("UsbDeviceManager",
Process.THREAD_PRIORITY_BACKGROUND);
2实例化 mHandler,并给该hander提供looper
mHandler = new UsbHandler(thread.getLooper());
3其他为变量的初始化
二 主要的工作就进入到UsbHandler这个处理类里了
1 UsbHandler的构造函数:a)对usb的function及相关的功能设置,系统属性值进行获取及初始化. b)启用两个监听的动作,监听setting的设置改变以及usb uevent事件的变化。
2 handleMessage的重载,在UsbHandler的成员函数中,会发送消息,那么处理消息的流程是如何被启动的呢?这个流程就是looper来完成的,每个handler内都有message的发送、接收。但是这个handler必须指定looper,有looper来完成消息的分发、管理。Handler中只是完成具体的发送和处理。
三 handleMessage中的几个消息
1 MSG_UPDATE_STATE://usb的连接状态有变化时,收到kernel的uevent信息时(我们主要针对这个mes进行修改)
2 MSG_ENABLE_ADB
3 MSG_SET_CURRENT_FUNCTION://功能设置,上面应用传下来的动作
4 MSG_SYSTEM_READY
5 MSG_BOOT_COMPLETED
*/
public void handleMessage(Message msg) {
switch (msg.what) {
                case MSG_UPDATE_STATE:			//当USB的连接状态发生变化时,就执行这里面的代码
                	...
                	if (mBootCompleted) {
                		...
                	   //setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
                	   setEnabledFunctions(UsbManager.FUNCTION_MTP, false);
                	   ...
                	}
}

14.默认连接物理键盘时,开启屏幕键盘

/device/emdoor/C27C4/innocn_overlay/vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml
@@ -125,7 +125,7 @@
     <integer name="def_multi_press_timeout_millis">300</integer>
 
     <!-- Default for Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD -->
-    <bool name="def_show_ime_with_hard_keyboard">false</bool>
+    <bool name="def_show_ime_with_hard_keyboard">true</bool>
 
     <!-- Default for Settings.System.POINTER_SPEED -->
     <integer name="def_pointer_speed">0</integer>


/vendor/mediatek/proprietary/packages/apps/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2411,6 +2411,9 @@ class DatabaseHelper extends SQLiteOpenHelper {
             loadIntegerSetting(stmt, Settings.Secure.SLEEP_TIMEOUT,
                     R.integer.def_sleep_timeout);
 
+            loadBooleanSetting(stmt, Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD,
+                    R.bool.def_show_ime_with_hard_keyboard);
+
             /// M: Load MTK added Secure providers before Android M.
             mUtils.loadCustomSecureSettings(stmt);

15.修改屏幕默认色温

diff --git a/vendor/mediatek/proprietary/custom/mt8195/hal/pq/cust_gamma.cpp b/vendor/mediatek/proprietary/custom/mt8195/hal/pq/cust_gamma.cpp
index d315a03208..36dbd4bfb1 100644
--- a/vendor/mediatek/proprietary/custom/mt8195/hal/pq/cust_gamma.cpp
+++ b/vendor/mediatek/proprietary/custom/mt8195/hal/pq/cust_gamma.cpp
@@ -1449,103 +1449,207 @@ const gamma_entry_t cust_gamma[GAMMA_LCM_MAX][GAMMA_INDEX_MAX] =
                 3972,   3976,   3980,   3984,   3988,   3992,   3996,   4000,   4004,   4008,   4012,   4016,   4020,   4024,   4028,   4032,   4036,   4040,   4044,   4048,   4052,   4056,   4060,   4064,   4068,   4072,   4076,   4080,   4084,   4088,   4092 },
         },
         { // Gamma 7
         ...
         ...
         ...
}
//对gamma7进行修改,这个需要使用一些仪器去获取对应色温,然后使用IC产商的工具生成对应的gamma值

16.加入自定义按键

具体参考如下博客:
https://www.cnblogs.com/dyufei/p/6612790.html
首先在设备树文件中,对原有的GPIO对应的键值进行修改,改为181,具体二进制键值,可以在adb shell中使用getevent查看,点击该按键,即可看到,这部分是驱动修改,下面我们将在framework层进行修改
1.先找到frameworks/base/data/keyboards/Generic.kl文件,新增对应十进制键值为181的键值:

	key 181   SELF_MENU

2.找到framework/native/include/input/InputEventLabels.h,将SELF_MENU加入到数组static const InputEventLabel KEYCODES[]中,按顺序添加,放在最后,后面好找,如下:

	DEFINE_KEYCODE(SELF_MENU),

3.找到frameworks/native/include/android/keycodes.h,找到枚举enum {…},根据枚举中最后的值288+1,写入如下(数字一定要跟2中的放置的index对应,所以2中是放在最后的):

	AKEYCODE_SELF_MENU = 289

4.找到frameworks/base/core/java/android/view/KeyEvent.java,添加如下代码:

public static final int KEYCODE_SELF_MENU = 289;
//顺便修改一下这个
@TestApi
public static final int LAST_KEYCODE = KEYCODE_SELF_MENU;

5.找到frameworks/base/core/res/res/values/attrs.xml,在中添加如下:

<enum name="KEYCODE_SELF_MENU" value="289" />

6.然后在terminal,执行一下make update-api
7.增加广播,在/frameworks/base/core/res/AndroidManifest.xml增加如下

    <protected-broadcast android:name="android.intent.action.ACTION_xxx_xxx_xxx" />

8.找到frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java,在类内添加如下方法:

@Override
public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,int policyFlags){
	...
	//找个地方加入这个按键
	else if (keyCode == KeyEvent.KEYCODE_SELF_MENU) {
	sendMenuButtonBroadcast();		//这是一个广播
	}
	...
}

private void sendMenuButtonBroadcast(){
	Intent intent=new Intent("android.intent.action.ACTION_xxx_xxx_xxx");
	mContext.sendBroadcast(intent);
}

17.开发者选项默认开启[HW停用叠加层]

参考:https://www.jianshu.com/p/ec67ee58660a

import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.RemoteException;


public class FallbackHome extends Activity {
	...
	...
	
    /**
    *   增加 开启 停用HW叠加层需要的的变量
    */
    private static final int SETTING_VALUE_ON = 1;
    private static final int SETTING_VALUE_OFF = 0;
    private static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
    static final int SURFACE_FLINGER_READ_CODE = 1010;
    private static final int SURFACE_FLINGER_DISABLE_OVERLAYS_CODE = 1008;
    private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
    private IBinder mSurfaceFlinger;

    /**
    *   修改默认 开启 停用HW叠加层的方法writeHardwareOverlaysSetting
    */
    void writeHardwareOverlaysSetting() {
        mSurfaceFlinger = ServiceManager.getService(SURFACE_FLINGER_SERVICE_KEY);
        try {
            final Parcel data = Parcel.obtain();
            data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
            data.writeInt(SETTING_VALUE_ON);
            mSurfaceFlinger.transact(SURFACE_FLINGER_DISABLE_OVERLAYS_CODE, data,
                    null /* reply */, 0 /* flags */);
            data.recycle();
        } catch (RemoteException ex) {
            // intentional no-op
        }
    }
    ...
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        mWallManager = getSystemService(WallpaperManager.class);
        writeHardwareOverlaysSetting();
        if (mWallManager == null) {
            Log.w(TAG, "Wallpaper manager isn't ready, can't listen to color changes!");
        } else {
            loadWallpaperColors(flags);
        }
		...
    }

18.删除电源图标

--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/system_icons.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/system_icons.xml
@@ -30,6 +30,7 @@
         android:orientation="horizontal"/>
 
     <com.android.systemui.BatteryMeterView android:id="@+id/battery"
+        android:visibility="gone"
         android:layout_height="match_parent"
         android:layout_width="wrap_content"
         android:clipToPadding="false"


--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
@@ -106,7 +106,7 @@
 
     <!-- The default tiles to display in QuickSettings -->
     <string name="quick_settings_tiles_default" translatable="false">
-        wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast,screenrecord
+        wifi,bt,dnd,flashlight,rotation,cell,airplane,cast,screenrecord
     </string>
 
     <!-- The minimum number of tiles to display in QuickSettings -->
@@ -114,7 +114,7 @@
 
     <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
     <string name="quick_settings_tiles_stock" translatable="false">
-        wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse
+        wifi,cell,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse
     </string>


--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
@@ -511,6 +511,7 @@
     <string-array name="config_statusBarIconBlackList" translatable="false">
         <item>@*android:string/status_bar_rotate</item>
         <item>@*android:string/status_bar_headset</item>
+        <item>@*android:string/status_bar_battery</item>
     </string-array>
 
     <!-- A path similar to frameworks/base/core/res/res/values/config.xml
diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/BatteryMeterView.java b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/BatteryMeterView.java
index a2cdd41af0..9fe7067e53 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -292,6 +292,7 @@ public class BatteryMeterView extends LinearLayout implements
                     getContext(), newValue);
             setVisibility(icons.contains(mSlotBattery) ? View.GONE : View.VISIBLE);
         }
+        setVisibility(View.GONE);  
     }
 
     @Override

19.音量默认50%, notification volume默认为0


    默认音量为50%

diff --git a/frameworks/base/services/core/java/com/android/server/audio/AudioService.java b/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
index 256b53e5d8..16497a113c 100644
--- a/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
+++ b/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
@@ -337,7 +337,7 @@ public class AudioService extends IAudioService.Stub
         0,  // STREAM_SYSTEM
         0,  // STREAM_RING
         0,  // STREAM_MUSIC
-        1,  // STREAM_ALARM
+        0,  // STREAM_ALARM
         0,  // STREAM_NOTIFICATION
         0,  // STREAM_BLUETOOTH_SCO
         0,  // STREAM_SYSTEM_ENFORCED
@@ -742,7 +742,7 @@ public class AudioService extends IAudioService.Stub
           // DTMF tone is not audiable ( or too low)  via BT SCO/ABS device.
           if (maxCallVolume != -1) {
             AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] =
-                    (maxCallVolume * 3) / 4;
+                    (maxCallVolume * 2) / 4;
            }
@@ -742,7 +742,7 @@ public class AudioService extends IAudioService.Stub
           // DTMF tone is not audiable ( or too low)  via BT SCO/ABS device.
           if (maxCallVolume != -1) {
             AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] =
-                    (maxCallVolume * 3) / 4;
+                    (maxCallVolume * 2) / 4;
            }
         }
 
@@ -759,10 +759,10 @@ public class AudioService extends IAudioService.Stub
         } else {
             if (isPlatformTelevision()) {
                 AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] =
-                        MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 4;
+                        MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 2;
             } else {
                 AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] =
-                        MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 3;
+                        MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 2;
             }
         }
 
@@ -778,7 +778,7 @@ public class AudioService extends IAudioService.Stub
         } else {
             // Default is 6 out of 7 (default maximum), so scale accordingly.
             AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_ALARM] =
-                        6 * MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] / 7;
+                        1 * MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] / 2;
         }
 
         int maxSystemVolume = SystemProperties.getInt("ro.config.system_vol_steps", -1);

注意这个Notification volume使用了别名,跟STREAM_RING是一致的,所以修改STREAM_RING的默认值即可

--- a/frameworks/base/media/java/android/media/AudioSystem.java
+++ b/frameworks/base/media/java/android/media/AudioSystem.java
@@ -1756,7 +1756,7 @@ public class AudioSystem
     public static int[] DEFAULT_STREAM_VOLUME = new int[] {
         4,   // STREAM_VOICE_CALL
         15,  // STREAM_SYSTEM
-        8,   // STREAM_RING
+        0,   // STREAM_RING
         8,   // STREAM_MUSIC
         8,   // STREAM_ALARM

20.亮度线性变化后,80%-90%亮度变化小,90%-100%亮度变化大

--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -384,7 +384,18 @@ public class BrightnessController implements ToggleSlider.Listener {
                 minBacklight, maxBacklight),
                 1.0f);
         */
-        final float valFloat = (float)value / (float)65535;
+        //final float valFloat = (float)value / (float)65535;
+        float modifiedValue = 0.0F;
+        //80%以下的亮度显示不做改变,80%~90%的亮度显示增幅为正常的1.6倍,90%以上的亮度显示增幅为正常的0.4倍
+        if(value >= 0 && value < 52428){
+            modifiedValue = (float)value;
+        }else if(value >= 52428 && value < 58981){
+            modifiedValue = 52428.0F + ((float)value - 52428.0F) * 1.6F;
+        }else if (value >= 58981 && value <= 65535){
+            modifiedValue = 65535.0F - (65535.0F - (float)value) * 0.4F;
+        }
+        final float valFloat = modifiedValue / 65535.0F;
+
         if (stopTracking) {
             // TODO(brightnessfloat): change to use float value instead.
             MetricsLogger.action(mContext, metric,
@@ -454,7 +465,14 @@ public class BrightnessController implements ToggleSlider.Listener {
         }
         // Returns GAMMA_SPACE_MIN - GAMMA_SPACE_MAX
         //final int sliderVal = convertLinearToGammaFloat(brightnessValue, min, max);
-        final int sliderVal = (int)(brightnessValue * (float)65535);
+        float actualSliderVal = brightnessValue * 65535.0F;
+        int sliderVal = (int)(brightnessValue * (float)65535);
+        //为了保证slider不跳变,对上面的changed回调做一个逆运算
+        if(actualSliderVal >= 52428.0F && actualSliderVal < 62913.0F){
+            sliderVal = (int)((actualSliderVal - 52428.0F) / 1.6F + 52428.0F);
+        }else if(actualSliderVal >= 62913.0F){
+            sliderVal = (int)((actualSliderVal - 65535.0F) / 0.4F + 65535.0F); 
+        }
         animateSliderTo(sliderVal);
     }

21.settings移除系统->手势->导航选项

--- a/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/gestures.xml
+++ b/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/gestures.xml
@@ -47,12 +47,12 @@
         settings:searchable="false"
         settings:controller="com.android.settings.gestures.DoubleTwistPreferenceController" />
 
-    <Preference
+    <!--Preference
         android:key="gesture_system_navigation_input_summary"
         android:title="@string/system_navigation_title"
         android:fragment="com.android.settings.gestures.SystemNavigationGestureSettings"
         settings:controller="com.android.settings.gestures.SystemNavigationPreferenceController"
-        settings:keywords="@string/keywords_system_navigation" />
+        settings:keywords="@string/keywords_system_navigation" /-->
 
     <Preference

22.增加长按电源键广播,屏蔽原生的关机选项(为了规避navigation bar覆盖原生关机选项)

主要是另外的systemUI开发关机界面

--- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -1180,6 +1180,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         mContext.sendBroadcast(intent);
     }
 
+    private void sendPowerButtonLongPressBroadcast(){
+        Intent intent=new Intent("android.intent.action.ACTION_POWER_BUTTON_LONG_PRESS");
+        mContext.sendBroadcast(intent);
+    }
+
     private void goToSleep(long eventTime, int reason, int flags) {
         mRequestedOrGoingToSleep = true;
         mPowerManager.goToSleep(eventTime, reason, flags);
@@ -1256,7 +1261,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                 mPowerKeyHandled = true;
                 performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
                         "Power - Long Press - Global Actions");
-                showGlobalActionsInternal();
+                sendPowerButtonLongPressBroadcast();
+                //showGlobalActionsInternal();
                 break;
             case LONG_PRESS_POWER_SHUT_OFF:
             case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:

23.如果使用某apk进行录像,那么不弹出录像提示框

--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
@@ -83,7 +83,7 @@ public class MediaProjectionPermissionActivity extends Activity
         }
 
         try {
-            if (mService.hasProjectionPermission(mUid, mPackageName)) {
+            if (mService.hasProjectionPermission(mUid, mPackageName) || "com.xxxxxx.systemui".equals(mPackageName) ) {
                 setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));
                 finish();
                 return;

24.关闭双击电源键,启动相机的功能

--- a/frameworks/base/core/res/res/values/config.xml
+++ b/frameworks/base/core/res/res/values/config.xml
@@ -3185,7 +3185,7 @@
 
     <!-- Allow the gesture to double tap the power button twice to start the camera while the device
          is non-interactive. -->
-    <bool name="config_cameraDoubleTapPowerGestureEnabled">true</bool>
+    <bool name="config_cameraDoubleTapPowerGestureEnabled">false</bool>
 
     <!-- Allow the gesture power + volume up to change the ringer mode while the device
          is interactive. -->

25.修改鼠标右键功能为返回键

+++ b/frameworks/native/services/inputflinger/reader/mapper/accumulator/CursorButtonAccumulator.cpp
@@ -84,7 +84,7 @@ uint32_t CursorButtonAccumulator::getButtonState() const {
         result |= AMOTION_EVENT_BUTTON_PRIMARY;
     }
     if (mBtnRight) {
-        result |= AMOTION_EVENT_BUTTON_SECONDARY;
+        result |= AMOTION_EVENT_BUTTON_BACK;
     }
     if (mBtnMiddle) {
         result |= AMOTION_EVENT_BUTTON_TERTIARY;

26.系统app开机自启动

系统服务启动分为三类
1. startBootstrapServices()
2. startCoreServices()
3. startOtherServices()

startBootstrapServices
1. 启动Installer服务
2. 启动ActivityManagerService,Installer服务赋值给AMS
3. 启动PowerManagerService,AMS initPowerManagement
4. 启动LightsService
5. SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY
6. 启动PackageManagerService
7. 启动SensorService

startCoreServices
1. 启动BatteryService
2. 启动UsageStatsService
3. AMS setUsageStatsManager

startOtherServices
1. 启动SchedulingPolicyService
2. 启动TelecomLoaderService
3. 启动TelephonyRegistry
4. 启动CameraService
5. 启动AccountManagerService
6. 启动ContentService
7. AMS安装系统Provider
8. 启动VibratorService
9. 启动ConsumerIrService
10. 启动AlarmManagerService
11. 初始化WatchDog与AMS相关
12. 启动WindowManagerService
13. 启动InputManagerService
14. 把WMS赋值给AMS
15. 启动AccessibilityManagerService
16. 启动LockSettingsService
17. 启动DeviceIdleController
18. 启动StatusBarManagerService
19. 启动ClipboardService
20. 启动ConnectivityService
21. 启动NotificationManagerService
22. 启动JobSchedulerService
23. 启动LauncherAppsService

最后启动SystemUi
————————————————
版权声明:本文为CSDN博主「字节小站」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/future234/article/details/81145447

根据上述启动,将一般的系统app放置在方法 startOtherServices中

+++ b/frameworks/base/services/java/com/android/server/SystemServer.java
@@ -2344,10 +2344,22 @@ public final class SystemServer {
             t.traceBegin("StartSystemUI");
             try {
                 startSystemUi(context, windowManagerF);
+                startMyAppSystemUi(context, windowManagerF);
             } catch (Throwable e) {
                 reportWtf("starting System UI", e);
             }
             t.traceEnd();

@@ -2636,6 +2648,24 @@ public final class SystemServer {
         windowManager.onSystemUiStarted();
     }
 
+    private static void startMyAppSystemUi(Context context, WindowManagerService windowManager) {
+        PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+        Intent intent = new Intent("com.xxxxxxxxx.intent.ACTION_SYSTEM_UI_SERVICE");
+        intent.setPackage("com.xxxxx.systemui");
+        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
+        //Slog.d(TAG, "Starting service: " + intent);
+        context.startServiceAsUser(intent, UserHandle.SYSTEM);
+    }

加入模块名

+++ b/device/mediateksample/IC_NAMEXXXX/device.mk
@@ -210,3 +210,4 @@ PACKAGE_FILTER += \
          MtkQuickSearchBox
+PRODUCT_PACKAGES += TEST

加入TEST.apk,本地加入编译文件

include $(CLEAR_VARS)
LOCAL_MODULE := TEST
LOCAL_MODULE_CLASS := APPS
#LOCAL_PROPRIETARY_MODULE := true
#LOCAL_MODULE_OWNER := mtk
LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := TEST.apk
include $(BUILD_PREBUILT)

27.屏蔽特定cameraID

+++ b/frameworks/av/services/camera/libcameraservice/CameraService.cpp
@@ -282,7 +282,7 @@ void CameraService::filterAPI1SystemCameraLocked(
@@ -282,7 +282,7 @@ void CameraService::filterAPI1SystemCameraLocked(
             ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, deviceId.c_str());
             continue;
         }
-        if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA) {
+        if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA || (strcmp(deviceId.c_str(),"212") == 0)) {
             // All system camera ids will necessarily come after public camera
             // device ids as per the HAL interface contract.
             break;

+++ b/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -154,7 +154,7 @@ void CameraProviderManager::collectDeviceIdsLocked(const std::vector<std::string
             ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, deviceId.c_str());
             continue;
         }
-        if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA) {
+        if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA || (strcmp(deviceId.c_str(),"212") == 0)) {
             systemDeviceIds.push_back(deviceId);
         } else {
             publicDeviceIds.push_back(deviceId);

+++ b/frameworks/base/core/java/android/hardware/camera2/CameraManager.java
@@ -1239,16 +1239,20 @@ public final class CameraManager {
             int idCount = 0;
             for (int i = 0; i < mDeviceStatus.size(); i++) {
                 int status = mDeviceStatus.valueAt(i);
+                String value = mDeviceStatus.keyAt(i);
                 if (status == ICameraServiceListener.STATUS_NOT_PRESENT
-                        || status == ICameraServiceListener.STATUS_ENUMERATING) continue;
+                        || status == ICameraServiceListener.STATUS_ENUMERATING
+                        || "212".equals(value)) continue;
                 idCount++;
             }
             cameraIds = new String[idCount];
             idCount = 0;
             for (int i = 0; i < mDeviceStatus.size(); i++) {
                 int status = mDeviceStatus.valueAt(i);
+                String value = mDeviceStatus.keyAt(i);
                 if (status == ICameraServiceListener.STATUS_NOT_PRESENT
-                        || status == ICameraServiceListener.STATUS_ENUMERATING) continue;
+                        || status == ICameraServiceListener.STATUS_ENUMERATING
+                        || "212".equals(value)) continue;
                 cameraIds[idCount] = mDeviceStatus.keyAt(i);
                 idCount++;
             }

28.修改音量曲线,减少其最大值,防止破音

+++ b/device/mediatek/vendor/common/audio_policy_config/audio_policy_volumes.xml
@@ -88,8 +88,8 @@ volume index from 0 to 100.
     <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER">
         <point>0,-2970</point>
         <point>33,-2010</point>
-        <point>66,-1020</point>
-        <point>100,0</point>
+        <point>66,-1500</point>
+        <point>100,-1020</point>
     </volume>
     <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE"
                                         ref="DEFAULT_NON_MUTABLE_EARPIECE_VOLUME_CURVE"/>

29.修复屏幕录制音频后,再播放时,右声道无声音问题

AudioALSACaptureDataClient::AudioALSACaptureDataClient(AudioALSACaptureDataProviderBase *pCaptureDataProvider, stream_attribute_t *stream_attribute_target){
...
+    //mBesRecordStereoMode = false; //formerly==20220628 
+    mBesRecordStereoMode = true;}

30.移除闹铃音频编译

frameworks/base/data/sounds/AllAudio.mk
@@ -24,7 +24,6 @@ PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Carbon.ogg \
-    $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Cesium.ogg \
     $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Fermium.ogg \
@@ -34,7 +33,6 @@ PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Oxygen.ogg \
-    $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Platinum.ogg \
     $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:$(TARGET_COPY_OUT_PRODUCT)/media/audio/alarms/Plutonium.ogg \

31.因为权限,可能导致无法打开相机的问题

--- a/frameworks/av/services/camera/libcameraservice/CameraService.cpp
+++ b/frameworks/av/services/camera/libcameraservice/CameraService.cpp
@@ -567,7 +567,7 @@ void CameraService::onTorchStatusChangedLocked(const String8& cameraId,
 }
 
 static bool hasPermissionsForSystemCamera(int callingPid, int callingUid) {
-    return checkPermission(sSystemCameraPermission, callingPid, callingUid) &&
+    return /*checkPermission(sSystemCameraPermission, callingPid, callingUid) &&*/
             checkPermission(sCameraPermission, callingPid, callingUid);
 }
 
@@ -643,7 +643,7 @@ std::string CameraService::cameraIdIntToStrLocked(int cameraIdInt) {
     const std::vector<std::string> *deviceIds = &mNormalDeviceIdsWithoutSystemCamera;
     auto callingPid = CameraThreadState::getCallingPid();
     auto callingUid = CameraThreadState::getCallingUid();
-    if (checkPermission(sSystemCameraPermission, callingPid, callingUid) ||
+    if (/*checkPermission(sSystemCameraPermission, callingPid, callingUid)*/hasPermissionsForSystemCamera(callingPid,callingUid)||
             getpid() == callingPid) {
         deviceIds = &mNormalDeviceIds;
     }

32. 去除状态栏

--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -139,6 +139,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
         mFooter = view.findViewById(R.id.qs_footer);
         mContainer = view.findViewById(id.quick_settings_container);
 
+        Log.d("QSFragment","=======mContainer==setVisibility(View.GONE)====");
+        mContainer.setVisibility(View.GONE);
+
         mQSContainerImplController = mQSContainerImplControllerBuilder
                 .setQSContainerImpl((QSContainerImpl) view)
                 .build();

33.动态更换开机动画

diff --git a/device/mediatek/mt8195/init.mt8195.rc b/device/mediatek/mt8195/init.mt8195.rc
index 50324cd709..43b0c14417 100755
--- a/device/mediatek/mt8195/init.mt8195.rc
+++ b/device/mediatek/mt8195/init.mt8195.rc
@@ -202,7 +202,7 @@ on post-fs
     chmod 0770 /mnt/vendor/protect_f
 
     chown system system /mnt/vendor/protect_s
-    chmod 0770 /mnt/vendor/protect_s
+    chmod 0777 /mnt/vendor/protect_s
     chown root log /proc/ccci_sib
 
 on post-fs-data
diff --git a/frameworks/base/cmds/bootanimation/BootAnimation.cpp b/frameworks/base/cmds/bootanimation/BootAnimation.cpp
index 83bbbbb55e..deb7b14877 100644
--- a/frameworks/base/cmds/bootanimation/BootAnimation.cpp
+++ b/frameworks/base/cmds/bootanimation/BootAnimation.cpp
@@ -77,6 +77,9 @@ static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimat
 static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip";
 static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
 static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip";
+
+static const char EMDOOR_MNT_VENDOR_BOOTANIMATION_FILE[] = "/mnt/vendor/protect_s/bootanimation.zip";
+
diff --git a/device/mediatek/mt8195/init.mt8195.rc b/device/mediatek/mt8195/init.mt8195.rc
index 50324cd709..43b0c14417 100755
--- a/device/mediatek/mt8195/init.mt8195.rc
+++ b/device/mediatek/mt8195/init.mt8195.rc
@@ -202,7 +202,7 @@ on post-fs
     chmod 0770 /mnt/vendor/protect_f
 
     chown system system /mnt/vendor/protect_s
-    chmod 0770 /mnt/vendor/protect_s
+    chmod 0777 /mnt/vendor/protect_s
     chown root log /proc/ccci_sib
 
 on post-fs-data
diff --git a/frameworks/base/cmds/bootanimation/BootAnimation.cpp b/frameworks/base/cmds/bootanimation/BootAnimation.cpp
index 83bbbbb55e..deb7b14877 100644
--- a/frameworks/base/cmds/bootanimation/BootAnimation.cpp
+++ b/frameworks/base/cmds/bootanimation/BootAnimation.cpp
@@ -77,6 +77,9 @@ static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimat
 static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip";
 static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
 static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip";
+
+static const char EMDOOR_MNT_VENDOR_BOOTANIMATION_FILE[] = "/mnt/vendor/protect_s/bootanimation.zip";
+
 static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip";
 static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
 static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip";
@@ -545,7 +548,7 @@ void BootAnimation::findBootAnimationFile() {
 
     const bool playDarkAnim = android::base::GetIntProperty("ro.boot.theme", 0) == 1;
     static const std::vector<std::string> bootFiles = {
-        APEX_BOOTANIMATION_FILE, playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE,
+        EMDOOR_MNT_VENDOR_BOOTANIMATION_FILE,APEX_BOOTANIMATION_FILE, playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE,
         OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE
     };
     static const std::vector<std::string> shutdownFiles = {

34. log增加func的显示

#include <android/log.h>

#define LOGV(format, ...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, "%s " format, __func__, ##__VA_ARGS__) 
#define LOGD(format, ...) __android_log_print(ANDROID_LOG_DEBUG, TAG, "%s " format, __func__, ##__VA_ARGS__)
#define LOGI(format, ...) __android_log_print(ANDROID_LOG_INFO, TAG, "%s " format, __func__, ##__VA_ARGS__)
#define LOGW(format, ...) __android_log_print(ANDROID_LOG_WARN, TAG, "%s " format, __func__, ##__VA_ARGS__)
#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, TAG, "%s " format, __func__, ##__VA_ARGS__)

35. 精确每一阶音量曲线

+++ b/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -6719,6 +6719,18 @@ status_t AudioPolicyManager::checkAndSetVolume(IVolumeCurves &curves,
         volumeDb = 0.0f;
     }
 
+    float dbCompensation[16] = {0, -5.42, -9.04,
+                                -11.17, -10.12, -9.64,
+                                -9.17, -9.7, -10.64,
+                                -10.16, -8.21, -6.68,
+                                -5.15, -3.21, -1.68,
+                                0};
+    volumeDb = volumeDb + dbCompensation[index];
+    ALOGW("APM::computeVolume: volume source %d muted count %d active=%d, index = %d, volumeDb = %f", 
+        volumeSource, outputDesc->getMuteCount(volumeSource), outputDesc->isActive(volumeSource), index, volumeDb);

36.关于mtkAndroid部分,显示内容旋转(兼容硬件横竖屏)的控制

MTK设置的MTK_LCM_PHYSICAL_ROTATION运行流程device目录下,会将这个属性里的值赋给ro.surface_flinger.primary_display_orientation
在这里插入图片描述
这个值会在如下设置
在这里插入图片描述
最终会跑到这个地方
在这里插入图片描述
如果,我们需要动态修改MTK_LCM_PHYSICAL_ROTATION,在上图注释处进行处理即可。

37.关闭部分蓝牙功能的操作

在Android13中去除蓝牙的部分功能,Android13之前的旧版本(12未试过)是通过如下文件进行修改的,是可以生效的

/device/mediatekxxx/{project_name}/overlay/vendor/mediatek/proprietary/packages/apps/Bluetooth/res/vulues/config.xml
<resources>
    <bool name="profile_supported_a2dp">true</bool>
    <bool name="profile_supported_a2dp_sink">true</bool>
    <bool name="profile_supported_hdp">false</bool>
    <bool name="profile_supported_hs_hfp">false</bool>
    <bool name="profile_supported_hfpclient">true</bool>
    <bool name="profile_supported_hid_host">true</bool>
    <bool name="profile_supported_opp">true</bool>
    <bool name="profile_supported_pan">false</bool>
    <bool name="profile_supported_pbap">false</bool>
    <bool name="profile_supported_gatt">true</bool>
    <bool name="pbap_include_photos_in_vcard">false</bool>
    <bool name="pbap_use_profile_for_owner_vcard">false</bool>
    <bool name="profile_supported_map">false</bool>
    <bool name="profile_supported_avrcp_target">true</bool>
    <bool name="profile_supported_avrcp_controller">true</bool>
    <bool name="profile_supported_sap">false</bool>
    <bool name="profile_supported_pbapclient">true</bool>
    <bool name="profile_supported_mapmce">false</bool>
    <bool name="profile_supported_hid_device">false</bool>
    <bool name="profile_supported_hearing_aid">false</bool>
    <!-- Enabling autoconnect over pan -->
    <bool name="config_bluetooth_pan_enable_autoconnect">false</bool>
    <bool name="profile_supported_mesh">true</bool>
</resources>

在Android13,使用上述方式去修改,没有生效,具体可以看到这些属性是在system下被设置的,具体的grep只需要搜索bluetooth.profile即可获取蓝牙的功能

system/libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop
...
# Whether the Advanced Audio Distribution Profile (A2DP) Sink role is enabled on this device.
# Set by vendors overlay, read at Bluetooth initialization
prop {
    api_name: "isProfileA2dpSinkEnabled"
    type: Boolean
    scope: Public
    access: Readonly
    prop_name: "bluetooth.profile.a2dp.sink.enabled"
}

# Whether the Advanced Audio Distribution Profile (A2DP) Source role is enabled on this device.
# Set by vendors overlay, read at Bluetooth initialization
prop {
    api_name: "isProfileA2dpSourceEnabled"
    type: Boolean
    scope: Public
    access: Readonly
    prop_name: "bluetooth.profile.a2dp.source.enabled"
}
...

根据上述的prop_name,我们可以知道这个是一个bool的属性,我们在自己项目的device.mk对这些属性进行设置,具体如下:

# BT
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.a2dp.sink.enabled=false
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.avrcp.controller.enabled=true
PRODUCT_PROPERTY_OVERRIDES += persist.vendor.bluetooth.a2dp_src_sink_both_enable=false
PRODUCT_PROPERTY_OVERRIDES += persist.vendor.bluetooth.blemesh_enable=true
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.hfp.ag.enabled=false
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.hfp.hf.enabled=false
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.pbap.server.enabled=false
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.pbap.client.enabled=false
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.pan.nap.enabled=false
PRODUCT_PROPERTY_OVERRIDES += bluetooth.profile.opp.enabled=false

做好上述这些设置即可。

38.audioflinger软件左右声道混音

--- a/vendor/mediatek/proprietary/custom/t6718b_p4mme_T10_32/hal/audioflinger/audio/audio_custom_exp.h
+++ b/vendor/mediatek/proprietary/custom/t6718b_p4mme_T10_32/hal/audioflinger/audio/audio_custom_exp.h
@@ -133,12 +133,12 @@
 /******************************************************************
 ** define using exernal amplifier
 ******************************************************************/
-#define USING_EXTAMP_HP
+//#define USING_EXTAMP_HP
 
 /******************************************************************
 ** define the stereo speaker 
 ******************************************************************/
-#define ENABLE_STEREO_SPEAKER
+//#define ENABLE_STEREO_SPEAKER
 
 /***************************************************
 * Define phonmic and headset mic mode.

39.Android10 开机动画角度旋转

修改了一些屏幕旋转角度的属性,开机动画的最初几秒并未生效,在后几秒后才生效,导致开机动画会有一个旋转的跳变,这里没有深究相关的原因,直接从开机动画的代码中进行了修改,这里由0°转换成180°,具体如下

--- a/frameworks/base/cmds/bootanimation/BootAnimation.cpp
+++ b/frameworks/base/cmds/bootanimation/BootAnimation.cpp
@@ -457,10 +457,10 @@ status_t BootAnimation::readyToRun() {
     if (status)
         return -1;
 /// M: The tablet rotation maybe 90/270 degrees, so set the lcm config for tablet
-    t.setDisplayProjection(mDisplayToken, DisplayState::eOrientationDefault, Rect(dinfo.w, dinfo.h), Rect(dinfo.w, dinfo.h));
+    t.setDisplayProjection(mDisplayToken, DisplayState::eOrientation180, Rect(dinfo.w, dinfo.h), Rect(dinfo.w, dinfo.h));
 
     /// M: The tablet rotation maybe 90/270 degrees, so set the lcm config for tablet
-    t.setDisplayProjection(mDisplayToken, DisplayState::eOrientationDefault,
+    t.setDisplayProjection(mDisplayToken, DisplayState::eOrientation180,
         Rect(dinfo.w, dinfo.h), Rect(dinfo.w, dinfo.h));
     t.apply();
  • 31
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值