我是怎么一步步将SystemUI导入到AndroidStudio的
这篇文件可能是你看过的写的最详细的关于SystemUI如何导入AS的文章了~
下面要讲的,是我如果一步步将SystemUI导入到AndroidStudio的。
(备注:本文所讲内容的开发环境 -> Android版本9.0 AndroidStudio 3.4 gradle插件版本 3.5)
修改系统相关模块的代码,如果是小的修改还好,如果是需要改动比较多,那能将源码导入到AndroidStudio来修改是最好不过的了,修改效率会提高很多。
这篇文件针对下面几点展开:
一、下载SystemUI源码; 二、将SystemUI代码导入Eclipse,在Eclipse中导出工程gradle文件; 三、将SystemUI代码导入AndroidStudio; 四、导入过程遇到的问题及解决;
讲述重点会放在第四部分,遇到的问题及解决。
一、下载SystemUI源码
SystemUI的代码,直接在Android源码中下载到本地来即可,在framewrok/bace/packages/目录下。
二、将SystemUI代码导入Eclipse,在Eclipse中导出工程gradle文件
我们的终极目标是把SystemUI的代码导入到AndroidStudio,之所以先把工程导入到Eclipse,是借助eclipse帮我们生成工程需要的gradle文件,AndroidStudio的工程是依靠gradle来构建,有了这个gradle文件,下一步就可以导入AndroidStudio了。
导出gradle文件也很简单,选择我们的工程,右击,选择Export,选择Generate Gralde build files,然后一直next即可。
三、将SystemUI代码导入AndroidStudio
有了上面第二部分的导出的gralde文件,就可以打开AndroidStuido,找到工程目录,导入工程即可。
导入工程后,会有报错,那肯定是正常的,不然就不会有第四部分的内容了。这里注意下gradle的版本,eclipse中导出的gradle版本可能会是比较旧的,这个需要根据自己的需要和提示的错误修改下。我是把gradle插件版本修改成了3.5.0
四、导入过程遇到的问题及解决
将Android源码模块的代码导入到AndroidStudio之所以麻烦,就是源码模块的代码可能会涉及到引用的相关资源比较多,所谓的资源,就是jar或者系统其它的一些类。
1)查看Android.mk涉及用到哪些资源
源码的编译,是依靠.mk来进行编译,查看Android.mk,能帮我们大致了解下这个项目会用到哪些外部资源。
LOCAL_STATIC_ANDROID_LIBRARIES 里面的,就是需要打包编译进apk的jar包 ---------------- LOCAL_STATIC_ANDROID_LIBRARIES := \ SystemUIPluginLib \ SystemUISharedLib \ android-support-car \ android-support-v4 \ android-support-v7-recyclerview \ android-support-v7-preference \ android-support-v7-appcompat \ android-support-v7-mediarouter \ android-support-v7-palette \ android-support-v14-preference \ android-support-v17-leanback \ android-slices-core \ android-slices-view \ android-slices-builders \ android-arch-core-runtime \ android-arch-lifecycle-extensions \
LOCAL_JAVA_LIBRARIES 里面的jar,是只在编译的时候引用即可,不需要打包进apk,这些jar是系统本身的jar ----------------- LOCAL_JAVA_LIBRARIES := telephony-ext \ telephony-common \ android.car \ ims-common
2) 将需要的jar包导入到工程
查看了Android.mk的内容,我们接下来就需要把相关的jar包导入到工程。好了,那这些jar包如何找呢。
从Android.mk的内容我们看到,有2类jar包,一类是需要打包进apk的,一类是只需要编译阶段引用的。那我们找包的时候,也分2种情况来。
LOCAL_STATIC_ANDROID_LIBRARIES 里面引用到的jar,可以在这个路径下找到对应的jar包:
这里列出的是androidx.annotation_annotation.jar的路径, 其它jar包也是类似方式查找,在./out/soong/.intermediates/prebuilts/sdk/current目录下
./out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.annotation_annotation/ android_common/turbine-combined/androidx.annotation_annotation.jar
LOCAL_JAVA_LIBRARIES 里面引用到的jar,是在out/target/project/......./system/framework/目录下可以找到。
3) 问题:导入的不同jar包,包含了相同的内容
通过上面的方式找到的jar,发现有个问题,就是不同的jar包,基本都包含了相同的内容。编译的时候会报Duplicate class 的错误。
从下面这张图,我们可以看到,导入的3个不同的jar,都包含了相同的android.arch.*、android.support.*等等这些类,这个就导致编译直接报类重复了。 这个问题,在网上找了很多的解决方法,基本都是说导入jar包的时候,采用exclude字段,把重复的group或者module移除掉,不过我试的时候,直接提示gradle DSL 没有exclude。
我一直觉的可能是我找的jar包不对,不应该都包含有相同内容的,如果有知道原因的,可以和我说下,非常感谢!
######4)修改jar包,将jar包重复内容删除,再重新生成jar包
后面是没其它头绪了,就试着把jar包重复的内容删除,再重新合成jar包。
具体做法就是,把jar包后缀修改成zip,然后解压,删除重复的内容(这里删除内容,我只是删除了相关的重复类,本来的META-INF文件夹没有动)后,再通过jar cvf 命令,重新生成jar。
这个过程,就是不停的删除重复内容,然后再导出,再编译。
5)问题: More than one file was found异常
编译的时候,还遇到了下面的问题,说是META-INF/*** 内容有多个地方都有, 这个问题,我觉得的可能和上面第4点的内容有关, 删除重复包的时候,我还是保留原来的META-INF文件夹没有动。
More than one file was found with OS independent path 'META-INF/androidx.legacy_legacy-support-core-ui.version'
这个问题可以通过添加 packagingOptions {...}来进行解决,在工程的build.gradle 文件中添加,下面就是我添加的,提示那个有多的,就加下。
android { compileSdkVersion 28 defaultConfig { applicationId "com.android.systemui" minSdkVersion 28 targetSdkVersion 28 versionCode 29 } packagingOptions { exclude 'META-INF/androidx.mediarouter_mediarouter.version' exclude 'META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version' exclude 'META-INF/androidx.lifecycle_lifecycle-livedata-core.version' exclude 'META-INF/androidx.appcompat_appcompat.version' exclude 'META-INF/androidx.swiperefreshlayout_swiperefreshlayout.version' exclude 'META-INF/androidx.cursoradapter_cursoradapter.version' exclude 'META-INF/androidx.media_media.version' exclude 'META-INF/androidx.drawerlayout_drawerlayout.version' exclude 'META-INF/androidx.print_print.version' exclude 'META-INF/androidx.versionedparcelable_versionedparcelable.version' exclude 'META-INF/androidx.interpolator_interpolator.version' exclude 'META-INF/androidx.palette_palette.version' exclude 'META-INF/androidx.fragment_fragment.version' exclude 'META-INF/androidx.customview_customview.version' exclude 'META-INF/androidx.documentfile_documentfile.version' exclude 'META-INF/androidx.vectordrawable_vectordrawable.version' exclude 'META-INF/androidx.legacy_legacy-support-core-utils.version' exclude 'META-INF/androidx.loader_loader.version' exclude 'META-INF/androidx.lifecycle_lifecycle-runtime.version' exclude 'META-INF/androidx.viewpager_viewpager.version' exclude 'META-INF/androidx.asynclayoutinflater_asynclayoutinflater.version' exclude 'META-INF/androidx.lifecycle_lifecycle-viewmodel.version' exclude 'META-INF/androidx.recyclerview_recyclerview.version' exclude 'META-INF/androidx.core_core.version' exclude 'META-INF/androidx.arch.core_core-runtime.version' exclude 'META-INF/androidx.vectordrawable_vectordrawable-animated.version' exclude 'META-INF/androidx.slidingpanelayout_slidingpanelayout.version' exclude 'META-INF/androidx.slice_slice-core.version' exclude 'META-INF/androidx.coordinatorlayout_coordinatorlayout.version' exclude 'META-INF/androidx.legacy_legacy-support-core-ui.version' } }
6) 问题:Duplicate class,support包合androidx包引用有冲突 错误提示:
Duplicate class android.support.v4.app.INotificationSideChannel found in modules android-arch-lifecycle-extensions.jar (android-arch-lifecycle-extensions.jar) and classes.jar (androidx.core:core:1.1.0-beta01)
解决方法: 在gradle.properties中添加启用androidx支持,gradle.proerties文件本来是没有的,没有的话,就自己创建个
android.useAndroidX=true
7) 问题:adb push apk进入,重启,提示权限错误
android.view.InflateException: Binary XML file line #87: uid=10014 needs permission android.permission.READ_CONTACTS to read lock_screen_owner_info_enabled for user 0
错误提示,需要android.permission.READ_CONTACTS 权限,这个权限在manifest中是有申请的了。后面参考了https://blog.csdn.net/grindstone_fos/article/details/53924295 提供的方法解决了。
方法就是:执行adb命名,给与相应权限。我是遇到有2个权限需要通过下面方式来执行下才行。
adb shell pm grant "com.android.systemui" "android.permission.READ_CONTACTS" adb shell pm grant "com.android.systemui" "android.permission.READ_EXTERNAL_STORAGE"
8)问题: 提示资源找不到
好不容易解决了上面的一堆的问题,下面是接着报了个资源找不到的问题。这个没查到是啥原因,后面是把调用到的代码暂时屏蔽了。
Line 1145: 12-28 14:27:52.209 E/AndroidRuntime( 2422): FATAL EXCEPTION: main Line 1146: 12-28 14:27:52.209 E/AndroidRuntime( 2422): Process: com.android.systemui, PID: 2422 Line 1147: 12-28 14:27:52.209 E/AndroidRuntime( 2422): android.content.res.Resources$NotFoundException: Resource ID #0x0 Line 1148: 12-28 14:27:52.209 E/AndroidRuntime( 2422): at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:216) Line 1149: 12-28 14:27:52.209 E/AndroidRuntime( 2422): at android.content.res.Resources.getDimensionPixelSize(Resources.java:727) Line 1150: 12-28 14:27:52.209 E/AndroidRuntime( 2422): at androidx.slice.widget.ListContent.<init>(ListContent.java:103) Line 1151: 12-28 14:27:52.209 E/AndroidRuntime( 2422): at androidx.slice.widget.ListContent.<init>(ListContent.java:88) Line 1152: 12-28 14:27:52.209 E/AndroidRuntime( 2422): at com.android.keyguard.KeyguardSliceView.showSlice(KeyguardSliceView.java:161) Line 1153: 12-28 14:27:52.209 E/AndroidRuntime( 2422): at com.android.keyguard.KeyguardSliceView.onChanged(KeyguardSliceView.java:343)
9)问题:AndroidRunTime 空指针异常
OverviewProxyService.java 中报了个空指针异常,获取到的 mRecentsComponentName 为空,也就是通过mContext.getString(com.android.internal.R.string.config_recentsComponentName)没法获取到对应的资源,后面是直接改成将string的内容写进去了。
写在后面
导这个工程花了比较多的时间,还好没有放弃~~
本人从事Android Camera相关开发已有5年
目前在深圳上班
欢迎大家关注我的微信公众号“小驰笔记”
大家一起学习交流
------- 2020.02.04 21:31 立春
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MySql数据库列表数据分页查询、全文检索API在crudapi系统中零代码实现
数据条件查询和分页 前面文档主要介绍了元数据配置,包括表单定义和表关系管理,以及表单数据的录入,本文主要介绍数据查询和分页在crudapi中的实现。 概要 数据查询API 数据查询主要是指按照输入条件检索出符合要求的数据列表,如果数据量大的情况下,需要考虑分页。API为/api/business/{name},其中name为对象名称复数形式(兼容对象名称),查询参数如下: 参数 类型 描述 select string 选择查询需要的字段和关联子表,默认查询全部字段和关联子表 expand string 选择需要展开的关联主表,默认关联主表字段只查询id和name search string 全文检索关键字,通过内置的系统字段全文索引fullTextBody实现 filter string 智能查询条件,格式为Condition对象JSON序列化后的字符串 orderby string 排序方式,ASC和DESC offset int32 分页开始位置 limit int32 每页数量 字段1 Object 最终转换成mysql中=操作符 字段2 Object 最终转换成mysql中=操...
- 下一篇
Martian 3.3.3 发布,最低支持 JDK11
Martian,一个JavaWeb开发框架,自2019年开始写下第一行代码,至今已有2年1个月,在各种 小框架的 围攻竞争下,艰难的生存着。 因为定位是一个 极简的框架,这跟很多框架产生了冲突,尤其是刚刚问世的时候,经常收到 一些吐槽,例如:没有新意。 但这并不影响我对这件事的热爱,我一直都在不断地做着维护,从一开始的一个微型项目,渐渐的发展成今天这样,期间集成过netty,tomcat,httpServer,但最终都因为 跟我一直坚持的 最小化原则 相违背 而放弃了。 最终选择了基于NIO自己实现http服务。 后来,因为NIO是 同步的,为了使其不被业务阻塞,故而加入了线程池,但是效果不是很理想。经过了再三的考虑,最终选择了AIO。也就是今天发布的这个版本。 本次的更新点如下 改用AIO,全面实现异步非阻塞 最低支持JDK11 这次更新有哪些影响 升级为AIO,只是内部变更,增加了一定的吞吐量,从使用者的角度来看,并没什么改变,所以不会产生什么负面影响 最低支持JDK11,这是一个很艰难的决定,因为可能会丢失一批潜在用户,甚至是正在使用的用户,但是我觉得,作为一名开发者 需要对新东...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境