AndroidQ(10.0) SystemUI 修改踩坑汇总

简介: AndroidQ(10.0) SystemUI 修改踩坑汇总

上来先吐槽下,Q 的 SystemUI真的太奇葩了,搞了好几天jar包还没成功导入,同样jar包在其它模块下导入是没问题

的,唉,真是太难了。总结下这几天尝试的各种方法,也算是填坑了。


坑一、采用 Android.bp 方式编译


Android.bp 是从 7.0 之后引入的,但在10.0之前源码中大多模块都还是采用 Android.mk 配置编译,到了Q中几乎全都是。虽然有 androidmk 工具可将 mk 转为 bp,但复杂的mk转换后大概率是错的。


androidmk 工具路径 out/soong/host/linux-x86/bin/androidmk


为了方便使用,可以将其复制到工作目录根下,新建 soog文件夹扔进去,转换命令为


androidmk android.mk > android.bp


其中转换关系对应的字段定义在 android.go 中


build\soong\androidmk\cmd\androidmk\android.go


简单列几个常见的

  "LOCAL_JAVA_RESOURCE_DIRS":    "java_resource_dirs",
      "LOCAL_JAVACFLAGS":            "javacflags",
      "LOCAL_ERROR_PRONE_FLAGS":     "errorprone.javacflags",
      "LOCAL_DX_FLAGS":              "dxflags",
      "LOCAL_JAVA_LIBRARIES":        "libs",
      "LOCAL_STATIC_JAVA_LIBRARIES": "static_libs",
      "LOCAL_JNI_SHARED_LIBRARIES":  "jni_libs",
      "LOCAL_AAPT_FLAGS":            "aaptflags",
      "LOCAL_PACKAGE_SPLITS":        "package_splits",
      "LOCAL_COMPATIBILITY_SUITE":   "test_suites",
      "LOCAL_OVERRIDES_PACKAGES":    "overrides",
      "LOCAL_ANNOTATION_PROCESSORS": "plugins",
      "LOCAL_PROGUARD_FLAGS":      "optimize.proguard_flags",
      "LOCAL_PROGUARD_FLAG_FILES": "optimize.proguard_flags_files",
      // These will be rewritten to libs/static_libs by bpfix, after their presence is used to convert
      // java_library_static to android_library.
      "LOCAL_SHARED_ANDROID_LIBRARIES": "android_libs",
      "LOCAL_STATIC_ANDROID_LIBRARIES": "android_static_libs",
      "LOCAL_ADDITIONAL_CERTIFICATES":  "additional_certificates",
      // Jacoco filters:
      "LOCAL_JACK_COVERAGE_INCLUDE_FILTER": "jacoco.include_filter",
      "LOCAL_JACK_COVERAGE_EXCLUDE_FILTER": "jacoco.exclude_filter",
    })


经过一天的捣腾,我整出了通过Android.bp 方式导入jar包方法, but 那是在其它模块我成功引入没问题,在 SystemUI 中按照同样操作,总是会有奇奇怪怪的问题

Warning: Missing class: javax.swing.JFrame
Warning: Missing class: java.awt.event.KeyListener
Warning: Missing class: javafx.scene.image.PixelReader
Warning: Missing class: java.beans.PropertyEditorSupport
Warning: Missing class: java.awt.event.ComponentAdapter
Warning: Missing class: com.jogamp.opengl.GLEventListener
Warning: Missing class: java.beans.beancontext.BeanContextSupport
Warning: Missing class: org.apache.maven.plugin.AbstractMojo
Warning: Missing class: java.awt.Canvas
Warning: Missing class: java.awt.event.WindowAdapter
Warning: Missing class: java.awt.KeyEventDispatcher
Warning: Missing class: java.beans.beancontext.BeanContextChildSupport
Warning: Missing class: java.beans.PropertyVetoException
Error: Compilation can't be completed because some library classes are missing.
Compilation failed

各种找不到 some library,一开始我想到的是,去把这些少的 library 挨个补上,最终这条路卒

当我把相关 library 都集齐了,再次编译的时候,我踏马又出来几十个其它的,心累啊。

于是转换思路,将 bp 改为 mk方式进行编译,那么坑二就来了。


坑二、Android.mk 方式无法编译 kotlin代码


是的你没看错,SystemUI 中有 kotlin 代码,这又是一个巨坑,在源码中通过mk方式编译 kotlin,这问题最早在2017年知乎上就有人问过,目前为止网上也没有相关的解决办法。唉,google 把所有的路都给你堵死了。


来康康 Android.bp 中是怎么编译 kotlin的呢?

srcs: [
        "src/**/*.kt",
        "src/**/*.java",
        "src/**/I*.aidl",
    ],


srcs 对应 mk 中的 LOCAL_SRC_FILES,是的就这样就引入了 kotlin 代码。对应转换嘛,想着就在 mk 中直接写成


LOCAL_SRC_FILES += src/com/android/systemui/DumpController.kt


然鹅并没有用,编译全报 kotlin 对应类引用不到。当我看到 aidl 对应转换可以写成 $(call all-Iaidl-files-under, src)


等等莫非还有隐藏光卡,找到 call all-Iaidl-files-under 定义类,definitions.mk


build\make\core\definitions.mk

###########################################################
## Find all files named "I*.aidl" under the named directories,
## which must be relative to $(LOCAL_PATH).  The returned list
## is relative to $(LOCAL_PATH).
###########################################################
define all-Iaidl-files-under
$(call all-named-files-under,I*.aidl,$(1))
endef
###########################################################
## Find all of the "I*.aidl" files under $(LOCAL_PATH).
###########################################################
define all-subdir-Iaidl-files
$(call all-Iaidl-files-under,.)
endef
###########################################################
## Find all of the java files under the named directories.
## Meant to be used like:
##    SRC_FILES := $(call all-java-files-under,src tests)
###########################################################
define all-java-files-under
$(call all-named-files-under,*.java,$(1))
endef

一顿搜索并没有 kt 相关的定义,但看这规则,是不是可以模仿写一个,于是乎 我整了个


LOCAL_SRC_FILES := $(call all-named-files-under,*.kt, src) 再次编译,依旧找不到 kotlin类,此路也不行,卒。


醉了醉了,到现在也没找到可行的办法…

目录
相关文章
|
4月前
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
189 0
我的Android 进阶修炼(1): AOSP源码根目录结构
|
4月前
|
XML Android开发 数据格式
Android实战经验之Kotlin中快速实现动态更改应用图标和名称
本文介绍在Android中通过设置多个活动别名动态更改应用图标和名称的方法,涉及XML配置及Kotlin代码示例。
163 10
|
7月前
|
Java 测试技术 Android开发
Android Gradle 干货,看这篇文章就行了
Android Gradle 干货,看这篇文章就行了
|
XML Java 开发工具
Android9.0 Settings 修改踩坑记录
Android9.0 Settings 修改踩坑记录
189 0
|
Android开发
❤️Android 从源码解读 Apk 的安装过程 ❤️(下)
prepareAppDataLeafLIF() Installer 流程图 相关推荐 Android Gradle 详解 Android apk 包体积优化
728 0
❤️Android 从源码解读 Apk 的安装过程 ❤️(下)
|
Java Android开发 容器
❤️Android 从源码解读 Apk 的安装过程 ❤️(中)
PackageManagerService installStage() mHandler() HandlerParams.startCopy() InstallParams FileInstallArgs.copyApk() PackageManagerServiceUtils.copyPackage()
354 0
|
Java 开发工具 Android开发
❤️Android 从源码解读 Apk 的安装过程 ❤️(上)
目录 App安装过程 PackageInstallerActivity onCreat() onResume() bindUi() startInstall() InstallInstalling onCreat() onStart() onResume() InstallingAsyncTask PackageInstaller.commit() PackageInstallerSession commit() dispatchStreamValidateAndCommit() mHandler() handleStreamValidateAndCommit()
648 0
|
Android开发
动手开发Android:Xposed插件完整过程
如何动手开发Xposed插件,本文为您介绍
1175 0
动手开发Android:Xposed插件完整过程
|
Java Android开发 安全
Android八门神器(一):OkHttp框架源码解析
HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端。
1446 0
|
Java Android开发 容器
Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)
原文:Android项目实战(四):ViewPager切换动画(3.0版本以上有效果) 学习内容来自“慕课网” 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果 先看布局文件 activity_main.
985 0