Android系统定制手册(一)
2 E币
成为会员,免费下载资料
文件大小:187.48 KB
上传者:虽万人吾往矣
时间:2022-10-09 10:21:00
下载量:0
1. 概述
1.1. 适用范围
RK3399 Android7.1 Industry
RK3399 Android10
RK356X Android11
RK3588 Android12
对于其他 Android 的版本,可供参考。
1.2. 修改方式
Android 系统定制,一般有临时修改的方式和代码修改的方式。
临时修改的方式:一般可以通过调试串口或者 ADB 对设备进行操作。
代码修改的方式:修改完代码后,需要进行 SDK 的编译以及固件的烧录。
其中,SDK 的编译或者固件的烧录参考 WiKi 教程。
1.3. 名词解释
CPU_TYPE:表示主控芯片,比如 rk3288,rk3399,rk3399pro, rk356x, rk3588
PRODUCT_TYPE:表示产品类型,比如 rk3399_firefly,rk3399_firefly_aio,rk3399_firefly_aioc_ai
1.4. 定制说明
对于系统的定制的内容,在 Android12 Android11, Android10.0 和 Android7.1 Industry 会有部分内
容不相同,对于这部分内容会对其区分,而没有区分的内容表示兼容。 2. 开机 logo 动画修改
2.1. 第一阶段
2.1.1. 代码修改的方式
准备 logo
制作新的 logo.bmp
图片属性和默认的 logo.bmp 一致,否则会出现颠倒异常
width,height 都为偶数
替换 logo
替换 kernel/logo.bmp
2.2. 第二阶段
2.2.1. 临时修改的方式
准备 bootanimation.zip
准备 png 文件
width,height 都为偶数
准备 desc.txt 文件,比如
800 1280 30
p 0 0 part0
800 1280 30 含义:前两个数字代表图片的像素宽度和高度,30 代表帧数,也就是 1 秒播放的图片张
数
p 0 0 part0 含义:p 代表标志位,0 表示无限循环,0 表示阶段间隔时间为 0,part0 表示对应文件
夹
desc.txt 文本格式:Unix+UTF-8
制作 bootanimation.zip
以存储方式压缩成 zip 文件
push bootanimation.zip
adb shell setprop persist.sys.root_access 3
adb root
adb remount
adb push bootanimation.zip system/media/bootanimation.zip
adb shell reboot
2.2.2. 代码修改的方式
准备 bootanimation.zip
把制作好的 bootanimation.zip 放到 device/rockchip/CPU_TYPE/目录下
在 device/rockchip/CPU_TYPE/device.mk 文件里,添加如下内容:
PRODUCT_COPY_FILES += \
device/rockchip/CPU_TYPE/bootanimation.zip:/system/media/bootanimation.zip
3. 默认屏幕方向修改
3.1. 临时修改的方式
系统可读可写
adb shell setprop persist.sys.root_access 3
adb root
adb remount
修改或添加属性值
Android7.1
在/system/build.prop 文件中,修改或添加 ro.sf.hwrotation 的值
0:横屏
90:竖屏
180:反向横屏
270:反向竖屏
Android10 及以上
在 vendor/build.prop 文件中,修改或添加 ro.surface_flinger.primary_display_orientation 的值
ORIENTATION_0:横屏
ORIENTATION_90:竖屏
ORIENTATION_180:反向横屏
ORIENTATION_270:反向竖屏
系统重启
adb shell reboot
3.2. 代码修改的方式
Android 7.1:
在 device/rockchip/CPU_TYPE/PRODUCT_TYPE/system.prop 文件里,修改 ro.sf.hwrotation 的值
Android 10 及以上:
在 device/rockchip/CPU_TYPE/BoardConfig.mk 文件里,修改 SF_PRIMARY_DISPLAY_ORIENTATION 的值
0:横屏
90:竖屏
180:反向横屏
270:反向竖屏
删除 out 目录下的 build.prop
rm out/target/product/PRODUCT_TYPE/obj/ETC/system_build_prop_intermediates/build.prop
4. 默认隐藏状态栏
4.1. 临时修改的方式
在 Settings 应用里,使能选项即可。
Settings–>Display–>Always hide the status bar 4.1.1. 代码修改的方式
修改内容如下
diff --git a/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
b/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
index ba87da7ec4..e32c9699f9 100644
--- a/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
+++ b/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
@@ -12,7 +12,7 @@
true
- false
+ true
5. 内置 APP 的几种方式
5.1. 代码修改的方式
可在 vendor 目录下新增 APP 的文件夹
5.1.1. 不可卸载
可参考 vendor/firefly/fireflyapi
Android.mk 里的内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := firefly_sdkapi_demo
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := platform
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)
LOCAL_CERTIFICATE := platform 含义:APK 签名使用系统签名
LOCAL_PRIVILEGED_MODULE 如果不设置或者设置为 false,安装位置为/system/app
fireflyapi.mk 里的内容
PRODUCT_PACKAGES += \
firefly_sdkapi_demo
PRODUCT_COPY_FILES += \
vendor/firefly/fireflyapi/fireflyapi:system/bin/fireflyapi \
vendor/firefly/fireflyapi/fireflyapi.jar:system/framework/fireflyapi.jar 5.1.2. 可卸载
在 device/rockchip/CPU_TYPE/PRODUCT_TYPE/ 目录下新建一个 preinstall_del 目录
把 apk 拷贝到 device/rockchip/CPU_TYPE/PRODUCT_TYPE/preinstall_del 目录下
编译 android
6. 内置默认输入法
6.1. 代码修改的方式
获取输入法包名
adb shell settings get secure enabled_input_methods
com.android.inputmethod.latin/.LatinIME:com.iflytek.inputmethod.google/com.iflytek.inputmethod.FlyIME:com.g
oogle.android.inputmethod.pinyin/.PinyinIME
adb shell settings get secure default_input_method
com.iflytek.inputmethod.google/com.iflytek.inputmethod.FlyIME 修改代码如下
diff --git a/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
b/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
index ba87da7ec4..7ed79b4c15 100644
--- a/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
+++ b/frameworks/base/packages/SettingsProvider/res/values/custom_defaults.xml
@@ -19,4 +19,7 @@
false
+
+ com.android.inputmethod.latin/.LatinIME:com.iflytek.inputmethod.google/com.iflytek.inp
utmethod.FlyIME:com.google.android.inputmethod.pinyin/.PinyinIME
+ com.iflytek.inputmethod.google/com.iflytek.inputmethod.FlyIME
diff --git
a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index cac5f800bd..f705a895b4 100644
--- a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2474,6 +2474,11 @@ class DatabaseHelper extends SQLiteOpenHelper {
stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
+ " VALUES(?,?);");
+ loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
+ R.string.enabled_input_methods);
+ loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
+ R.string.def_input_method);
+
loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
R.string.def_location_providers_allowed);
7. 删除内置应用
7.1. 临时修改的方式
adb shell setprop persist.sys.root_access 3
adb root
adb remount
adb shell rm -r system/app/APK_NAME/
adb shell reboot
或者
adb shell setprop persist.sys.root_access 3
adb root
adb remount
adb shell rm -r system/priv-app/APK_NAME/
adb shell reboot
7.2. 代码修改的方式
如果应用有源代码,在应用源代码的 Android.mk 文件里注释掉 include $(BUILD_PACKAGE)
如果应用是 APK 文件且有 Android.mk,则在 Android.mk 文件里注释掉 include $(BUILD_PREBUILT)
8. 开机启动应用
8.1. 修改代码的方式
8.1.1. 非 Launcher
在应用源码里的 AndroidManifest.xml 添加如下内容
package="com.example.testfile"android:sharedUserId="android.uid.system">
增加广播接收的代码 BootBroadcastReceiver.java,比如
package com.example.testfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class BootBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "sjft";
public static final String EXTRA_VOLUME_STATE = "android.os.storage.extra.VOLUME_STATE";
public static final int STATE_UNMOUNTED = 0;
public static final int STATE_CHECKING = 1;
public static final int STATE_MOUNTED = 2;
public static final int STATE_MOUNTED_READ_ONLY = 3;
public static final int STATE_FORMATTING = 4;
public static final int STATE_EJECTING = 5;
public static final int STATE_UNMOUNTABLE = 6;
public static final int STATE_REMOVED = 7;
public static final int STATE_BAD_REMOVAL = 8;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (action.equals("android.intent.action.PACKAGE_REPLACED")){
String packageName = intent.getData().getSchemeSpecificPart();
Log.v(TAG,"BootBroadcastReceiver packageName:"+packageName);
if(context.getPackageName().equals(packageName)){
Intent launchIntent = new Intent(context, MainActivity.class);//重新启动应用
//此处如果不想写死启动的 Activity,也可以通过如下方法获取默认的启动 Activity
//Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchIntent);
}
} else if (action.equals("android.intent.action.BOOT_COMPLETED")) {
Intent launchIntent = new Intent(context, MainActivity.class);//重新启动应用
//此处如果不想写死启动的 Activity,也可以通过如下方法获取默认的启动 Activity
//Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchIntent);
}
}
}
开机自启动 apk 需要系统签名(系统签名文件)
必须先打开一次开机自启动 apk,才能接收到开机完成的广播
8.1.2. Launcher
删除或者不编译 SDK 里的 Launcher 应用
在应用源码里的 AndroidManifest.xml 里最先启动的 Activity 添加如下内容
9. 默认语言的修改
语言的支持列表可以查看 build/target/product/languages_full.mk。
9.1. 临时修改的方式
系统可读可写
adb shell setprop persist.sys.root_access 3
adb root
adb remount
修改/system/build.prop 文件中 ro.product.locale 的值(Android 10 及以上为: /vendor/build.prop)
en-US:英文
zh-CN:中文
系统重启
adb shell reboot
9.2. 代码修改的方式
在 build/target/product/full_base.mk 里修改 PRODUCT_LOCALES 的值
中文
PRODUCT_LOCALES := zh_CN 删除 out 目录下的 build.prop
rm out/target/product/PRODUCT_TYPE/obj/ETC/system_build_prop_intermediates/build.prop
展开》
折叠》