AOSP(三)玩转Android系统资源定制

前言

有些时候我们需要对Android系统进行一些个性化的定制,如开机动画、开机l画面、内置第三方App等,根据厂家的一些要求做相对应的操作,打造属于自己的系统

一、修改开机动画

开机动画主要和bootanimation.zip 文件有关,这个压缩包里面包含数张png格式的图片,还有一个desc.txt的文本文档,Android系统在开机时按desc.txt里面的指令,屏幕上会按文件名称顺序连续的播放一张张的图片,这里面的保存的图片需要按照顺序编号命名

desc.txt的内容格式

arduino 复制代码
# desc.txt文件命令

150 259 30
p 0 0 part0

150 259 30 是控制图片的分辨率,以及图片显示的帧率 p 0 0 part0 是控制图片以怎样的规律播放

  • 第一位p代表播放的意思;
  • 第二位0代表循环播放的意思(如果是1则代表只播放一次);
  • 第三位默认为0即可,指播放间隔时间为0(在循环播放情况下,代表播放完一轮后,需间隔多少秒再重新播放);
  • 第四位part0则表示这行条命令是对part0目录下的开机图片有效;

如果图片准备好了,desc.txt里面的命令准备好了,就可以把他们一起打包压缩成zip格式了,在压缩文件时使用的压缩方式为存储

替换资源路径

bash 复制代码
packages/services/Car/car_product/build/car.mk

# 替换bootanimation-832.zip
# Boot animation
PRODUCT_COPY_FILES += \
    packages/services/Car/car_product/bootanimations/bootanimation-832.zip:system/media/bootanimation.zip

编译

bash 复制代码
#单编
mmm packages/services/Car/car_product/

#全编
m -j4

二、修改开机画面

Android系统默认的开机动画是由两张图片android-logo-mask.png和android-logo-shine.png通过程序调用实现的动画效果(明暗变化)。 这两张图片保存在/frameworks/base/core/res/assets/images中,主要在目录:frameworks\base\cmds\bootanimation\BootAnimation.cpp中使用

scss 复制代码
//判断是否有动画资源
bool BootAnimation::threadLoop() {
    ...
    // animation.
    iif (mZipFileName.isEmpty()) {
        ALOGD("No animation file");
        result = android();
    } else {
       result = movie();
    }
		...
		...
    return result;
}

//用opengl绘制图片,这边也可以绘制倒车影像
bool BootAnimation::android() {
    glActiveTexture(GL_TEXTURE0);

    SLOGD("%sAnimationShownTiming start time: %" PRId64 "ms", mShuttingDown ? "Shutdown" : "Boot",
            elapsedRealtime());
    initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
    initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");

    mCallbacks->init({});

    // clear screen
    glDisable(GL_DITHER);
    glDisable(GL_SCISSOR_TEST);
    glUseProgram(mImageShader);

    glClearColor(0,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT);
    eglSwapBuffers(mDisplay, mSurface);

    // Blend state
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

简单替换的方法就是自定义png图片,替换 android-logo-mask.png文件,并重新编译:

bash 复制代码
//-B全新编译
mmm -B frameworks/base/core/res/  

三、内置第三方App

这里主要讲述内置已经编译好的APK文件,讲述不同的参数对内置APP的影响。这里总共分为三个步骤。

(1)在packages/apps目录下新建存放APK的文件夹

bash 复制代码
cd aosp/packages/apps
mkdir ZxxTest

(2)创建Android.mk文件,编写编译配置,touch Android.mk然后编写Android.mk文件:

makefile 复制代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#编译模块的名称
LOCAL_MODULE := ZxxTest
#可以为user、eng、tests、optional,optional代表在任何版本下都编译
LOCAL_MODULE_TAGS := optional
# 设置源文件。如果上面的LOCAL_MODULE对应文件名,可使用$(LOCAL_MODULE).apk
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
# 生成的模块类型
LOCAL_MODULE_CLASS := APPS
#module的后缀,可不设置
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#不进行预先优化,一般第三方应用会避免优化,而导致APP各种异常
LOCAL_DEX_PREOPT := false 
#获得apk中 armeabi-v7a 下所有的so
define get-all-libraries-module-name-in-subdirs
$(sort $(shell cd $(LOCAL_PATH) ; rm -rf lib >/dev/null ; unzip $(LOCAL_MODULE).apk 'lib/armeabi-v7a/*.so' -d . >/dev/null ; find -L $(1) -name "*.so"))
endef
ALL_LIBRARIES_MODULE_NAME := $(call get-all-libraries-module-name-in-subdirs, lib/armeabi-v7a)
LOCAL_PREBUILT_JNI_LIBS := $(ALL_LIBRARIES_MODULE_NAME)
LOCAL_PRIVILEGED_MODULE := true
#签名,platform表示系统签名,PRESIGNED表示保持原签名
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

(3)在/build/make/target/product/handheld_product.mk文件加入对APK的编译

csharp 复制代码
# /product packages
PRODUCT_PACKAGES += \
    Browser2 \
    Calendar \
    Camera2 \
    Contacts \
    ....
    SettingsIntelligence \
    frameworks-base-overlays \
    ZxxTest

(4)编译

bash 复制代码
cd aosp/
source build/envsetup.sh # 导入环境
lunch 72  # 选择系统
m -j4  # 编译

adb logcat 命令

adb logcat [选项] [过滤项], 其中 选项 和 过滤项 在 中括号 [] 中, 说明这是可选的; 选项解析: 1."-s"选项 : 只显示指定标签的日志; ------>adb logcat -s SWVDEC 显示SWVDEC标签的日志 2."-v"选项 : 设置日志的输出格式;----->adb logcat -v threadtime 查看日志输出时间和线程信息 3."-c"选项 : 清空所有的日志缓存信息;---->adb logcat -c 4."-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;------->adb logcat -d 5."-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;------>adb logcat -t 5 输出日志缓冲区的最近5行 6."-g"选项 : 查看日志缓冲区信息; ------>adb logcat -g 7."-B"选项 : 以二进制形式输出日志; ----> adb logcat -B

相关推荐
front_几秒前
React Hook介绍
前端
HashTang11 分钟前
【AI 编程实战】第 12 篇:从 0 到 1 的回顾 - 项目总结与 AI 协作心得
前端·uni-app·ai编程
狂炫冰美式11 分钟前
把手从键盘上抬起来:AI 编程的 3 个不可逆阶段
前端·后端·ai编程
codingWhat1 小时前
uniapp 多地区、多平台、多环境打包方案
前端·架构·node.js
HelloReader1 小时前
从 Tauri 2.0 Beta 升级到 2.0 Release Candidate Capabilities 权限前缀与内置 Dev Server 网络策略变
前端
只与明月听1 小时前
RAG深入学习之Chunk
前端·人工智能·python
一枚前端小姐姐2 小时前
低代码平台表单设计系统架构分析(实战一)
前端·低代码·架构
HelloReader2 小时前
Tauri 1.0 升级到 Tauri 2.0从“能跑”到“跑得稳”的迁移实战指南(含移动端准备、配置重构、插件化 API、权限系统)
前端
JunjunZ2 小时前
uniapp 文件预览:从文件流到多格式预览的完整实现
前端·uni-app
_Eleven2 小时前
React 19 深度解析:Actions 与 use API 源码揭秘
前端