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

相关推荐
代码匠心39 分钟前
AI 自动编程:一句话设计高颜值博客
前端·ai·ai编程·claude
_AaronWong2 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode2 小时前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441942 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo2 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
恋猫de小郭3 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木3 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮3 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati3 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉3 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain