上来先吐槽下,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类,此路也不行,卒。
醉了醉了,到现在也没找到可行的办法…