Android自定义配置
文章目录
屏幕不休眠
# 获取屏幕休眠时间
adb shell settings get system screen_off_timeout
# 休眠时间修改为最大值,最大值就是永不休眠。
adb shell settings put system screen_off_timeout 2147483647
# frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<integer name="def_screen_off_timeout">2147483647</integer> # 休眠时间修改为最大值,最大值就是永不休眠
# frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
private static final int DEFAULT_SCREEN_OFF_TIMEOUT = 15 * 1000;
private int getScreenOffTimeoutLocked(int sleepTimeout)
{
int timeout = mScreenOffTimeoutSetting;
if (timeout < 0)
{
return mMaximumScreenOffTimeoutFromDeviceAdmin;
}
}
开机显示自定义静态LOGO
# device/qcom/common/display/logo
sudo apt-get install python-imaging
# 生成splash.img
python logo_gen.py snapdragon.png
# 烧录
fastboot flash splash splash.img
注意:如果没有烧录splash.img则显示企鹅
lk运行后,程序会bootable/bootloader/lk/dev/fbcon/fbcon.c文件中的display_image_on_screen函数,它会从splash分区获取图像数据,如果成功,就直接将splash分区中的图像数据显示在LCD上,获取失败才会调用fbcon_flush函数,该函数将imageBuffer_rgb888数组中的内容显示在LCD上。
注意
- 图片不能过大,128*128可以
- 背景可以透明
- 烧录前最好先擦除
- 如果擦除后不烧录,则显示企鹅
系统中文显示
# build/make/target/product/full_base.mk
# PRODUCT_LOCALES := en_US
PRODUCT_LOCALES := zh_CN
隐藏状态栏电量
# frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
不显示图标
# frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
不监听电量广播
开机不显示No SIM card 提示
# vendor/qcom/proprietary/commonsys/telephony-apps/SimSettings/src/com/qualcomm/qti/simsettings/SimSelectNotification.java
隐藏状态栏和三大按键
1. 默认配置文件
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
添加:<string name="policy_control" translatable="false">immersive.full=*</string>
说明
- 全屏沉浸模式(包括状态栏和虚拟按键): immersive.full=* 可下拉???
- 沉浸状态栏:immersive.status=*
- 沉浸虚拟按键(隐藏后底部上划可以呼出): immersive.navigation=*
- 恢复正常模式(如果隐藏了状态栏或者虚拟按键但是又不想用了):null
2. 加载配置文件
# frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
函数 private void loadGlobalSettings(SQLiteDatabase db) 中加上如下代码:
loadStringSetting(stmt, Settings.Global.POLICY_CONTROL, R.string.policy_control);
说明
- 从配置文件中获取值,赋值给静态变量 Settings.Global.POLICY_CONTROL
- Settings.Global.POLICY_CONTROL 定义在:frameworks/base/core/java/android/provider/Settings.java中 public static final String POLICY_CONTROL = “policy_control”;
隐藏搜索栏
1. 在布局文件中删除
# packages/apps/Launcher3/res/layout/search_container_workspace.xml
注释
<!---
<fragment
android:name="com.android.launcher3.qsb.QsbContainerView$QsbFragment"
android:layout_width="match_parent"
android:tag="qsb_view"
android:layout_height="match_parent"/>
-->
2. 在launcher中去掉
# packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
在函数: public void bindAndInitFirstWorkspaceScreen(View qsb) 中
/* 除去Launcher3 自带的google 搜索框
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");
}
*/
/**
* Initializes and binds the first page
* @param qsb an existing qsb to recycle or null.
*/
public void bindAndInitFirstWorkspaceScreen(View qsb) {
if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
return;
}
// Add the first page
CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, 0);
// Always add a QSB on the first screen.
if (qsb == null) {
// In transposed layout, we add the QSB in the Grid. As workspace does not touch the
// edges, we do not need a full width QSB.
qsb = LayoutInflater.from(getContext())
.inflate(R.layout.search_container_workspace,firstPage, false);
}
// 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");
// }
}
关闭系统休眠
<bool name="def_dim_screen">false</bool>
不起作用,似乎没用这个配置
/**
* 是否使屏幕常亮
* @param activity
*/
public static void keepScreenLongLight(Activity activity) {
boolean isOpenLight = CommSharedUtil.getInstance(activity).getBoolean(CommSharedUtil.FLAG_IS_OPEN_LONG_LIGHT, true);
Window window = activity.getWindow();
if (isOpenLight) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
Launcher图标清空
目录:packages/apps/Launcher3/src/com/android/launcher3
清单:packages/apps/Launcher3/AndroidManifest.xml
Activity:packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
layout:packages/apps/Launcher3/res/layout/launcher.xml
直接隐藏
# packages/apps/Launcher3/res/layout/launcher.xml
把android:id="@+id/hotseat"隐藏:
android:visibility="invisible" (还占有布局)
清空布局
# packages/apps/Launcher3/res/xml/device_profiles.xml
把适配文件device_profile.xml中的默认图标都清空
注意
- LauncherApplication.java初始化判断屏幕大小/屏幕密度获取最接近的分辨率,选择不同的行列
- Launcher.java
- LauncherProvider: Launcher的数据库,一个contentprovider里面存储了桌面的item信息, loadFavorites()会解析xml 目录下的default_workspace.xml文件,把读出来的内容写到数据库中
- LauncherModel.Java中 loadAllapps()获取到所有应用的集合.,通过包名匹配,然后直接从集合中删除掉不需要创建桌面图标的应用
默认开启以太网
添加全局变量Settings.Global
字符串定义
# frameworks/base/core/java/android/provider/Settings.java
public static final String ETHERNET_ON = "ethernet_on";
@Deprecated
public static final String ETHERNET_ON = Global.ETHERNET_ON;
// INSTANT_APP_SETTINGS.add(ETHERNET_ON);
MOVED_TO_GLOBAL.add(Settings.Global.ETHERNET_ON);
// 在SETTINGS_TO_BACKUP数组中加入这个变量
默认值
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<integer name="def_ethernet_on">1</integer>
数据库加载
# frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadIntegerSetting(stmt, Settings.Global.ETHERNET_ON, R.integer.def_ethernet_on); // 设置默认值
使用
Settings.Global.getInt(getActivity().getContentResolver(),Settings.Global.SWITCH_MODE_ON, 0));
Settings.Global.putInt(getActivity().getContentResolver(),Settings.Global.SWITCH_MODE_ON, 1);
开启
# frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
int enable = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.ETHERNET_ON,0);
Log.i(TAG, "enable="+enable);
if(enable != EthernetManager.ETH_STATE_ENABLED) {
Log.i(TAG, "Ethernet is not enable");
return;
}
注意
- 编译时make update-api
默认配置
<bool name="def_dim_screen">false</bool> 自动关屏
<bool name="def_airplane_mode_on">false</bool> 飞行模式
<!-- Default screen brightness, from 0 to 255. 102 is 40%. -->
<integer name="def_screen_brightness">102</integer> 屏幕亮度
<bool name="def_screen_brightness_automatic_mode">false</bool> 自动亮度调节
<bool name="def_bluetooth_on">false</bool> 蓝牙
<bool name="def_wifi_display_on">false</bool>
<bool name="def_install_non_market_apps">true</bool> 安装非市场apk
<bool name="def_package_verifier_enable">true</bool>
<bool name="assisted_gps_enabled">true</bool> gps定位
<bool name="def_netstats_enabled">true</bool>
<bool name="def_usb_mass_storage_enabled">true</bool> usb存储模式
<bool name="def_wifi_on">false</bool> wifi
<bool name="def_networks_available_notification_on">true</bool>
<!-- Default value for whether or not to pulse the notification LED when there is a
pending notification -->
<bool name="def_notification_pulse">false</bool> LED闪烁
<!-- user interface sound effects -->
<integer name="def_power_sounds_enabled">0</integer> 声音
<string name="def_low_battery_sound" translatable="false">/system/media/audio/ui/LowBattery.ogg</string>
<integer name="def_dock_sounds_enabled">0</integer>
<integer name="def_dock_sounds_enabled_when_accessibility">0</integer>
<string name="def_desk_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string>
<string name="def_desk_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string>
<string name="def_car_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string>
<string name="def_car_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string>
<integer name="def_lockscreen_sounds_enabled">0</integer>
<string name="def_lock_sound" translatable="false">/system/media/audio/ui/Lock.ogg</string>
<string name="def_unlock_sound" translatable="false">/system/media/audio/ui/Unlock.ogg</string>
<string name="def_trusted_sound" translatable="false">/system/media/audio/ui/Trusted.ogg</string>
<string name="def_wireless_charging_started_sound" translatable="false">/system/media/audio/ui/WirelessChargingStarted.ogg</string>
<string name="def_charging_started_sound" translatable="false">/system/media/audio/ui/ChargingStarted.ogg</string>
<bool name="def_lockscreen_disabled">true</bool> 不锁屏
<bool name="def_device_provisioned">false</bool>
<integer name="def_dock_audio_media_enabled">1</integer>
<!-- Notifications use ringer volume -->
<bool name="def_notifications_use_ring_volume">true</bool> 声音提醒
<!-- Default for Settings.System.VIBRATE_IN_SILENT -->
<bool name="def_vibrate_in_silent">false</bool>
<string name="def_time_12_24">24</string> 设置时间格式 24小时制还是12小时制
测试
备注
作者 [@lhgcs]
2020 年 07月 24日