我是靠谱客的博主 活力火,最近开发中收集的这篇文章主要介绍AndroidQ(10.0) SystemUI 修改踩坑汇总坑一、采用 Android.bp 方式编译坑二、Android.mk 方式无法编译 kotlin代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上来先吐槽下,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 中

buildsoongandroidmkcmdandroidmkandroid.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

buildmakecoredefinitions.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类,此路也不行,卒。

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

最后

以上就是活力火为你收集整理的AndroidQ(10.0) SystemUI 修改踩坑汇总坑一、采用 Android.bp 方式编译坑二、Android.mk 方式无法编译 kotlin代码的全部内容,希望文章能够帮你解决AndroidQ(10.0) SystemUI 修改踩坑汇总坑一、采用 Android.bp 方式编译坑二、Android.mk 方式无法编译 kotlin代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部