使用Android Studio 开发 SystemUI

本文分享如何在Android Studio中顺利开发SystemUI,解决资源冲突、依赖问题和编译错误。通过调整gradle配置、处理产品资源、创建独立库、管理第三方jar依赖等步骤,实现如同普通应用一样的开发体验。最终,通过脚本自动化编译和安装过程,实现一键编译运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于用sublime或没有完整依赖的Studio来开发SystemUI非常难受,所以有了这篇分享,目标是做到像普通应用一样在Android Studio里开发SystemUI,可以正常跳转,正常依赖,正常编译,一键安装。

1.  将源码放置到成正常gradle项目的结构

 

2. 将资源目录分类存放
 

 sourceSets {
        main {
            res.srcDirs += "src/main/res-flyaudio"
            res.srcDirs += "src/main/res-keyguard"
        }
    }

3. 删除重复定义的资源
系统源码环境下的编译方式和 AS 的编译还是有区别的,系统环境下能使用PRODUCT_CHARACTERISTICS := tv来控制打包的平台资源,而AS无法处理


<string name="keyguard_missing_sim_message" product="tablet">No SIM card in tablet.</string>
<!-- Shown when there is no SIM card. -->
<string name="keyguard_missing_sim_message" product="default">No SIM card in phone.</string>
 
 
error : Found item String/keyguard_missing_sim_message more than one time

可以用脚本仅留下product = "default" 的标签

4. 由于SystemUI需要依赖settingslib和keyguard的内容,可以单独创建library,在主模块app中依赖

5. 找不到android.support.v7.preference.Preference
    implementation 'com.android.support:preference-v7:26.1.0'
    implementation 'com.android.support:preference-v14:26.1.0'

6. 找不到 libcore.util.TimeZoneFinder;
AS的SDK和源码不一致,需要找到TimeZoneFinder所在的jar引用,可以在out/target/common/obj/JAVA_LIBRARIES中找到core-libart_intermediates中对应的jar引用

7. 找不到 com.android.internal.telephony.cdma.EriInfo
同理 找到telephony-common_intermediates中对应的jar引用

8. 当第三方 jar 和 AS 默认的常规 SDK 发生冲突的时候,会优先使用常规 SDK,需要提升这个 jar 的优先级


    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            // 如果有多个jar需要提升优先级,用分号隔开,比如:jar/framework.jar;jar/core-all.jar;
            options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
            options.compilerArgs.add('-Xbootclasspath/p:baselib/libs/telephony.jar')
        }
    }
9. 源码中动态编译的jar包如framework.jar一定要使用compileOnly只在编译的时候引用该jar

10. 找不到com.android.internal.R
新建internal library,将frameworks/base/core/res的部分资源拷进去,attrs_manifest.xml  public.xml symbols.xml attrs.xml等内容与AS编译无关需要删掉

end. 编译运行
经过重重困难后终于可以在AS中正常编译了,能够正常编辑代码,但是把编译好的apk push进去还是有很多问题,所以这里换个思路去编译apk和安装

由于我用windows的电脑连接服务器来单独编译模块,所以我这边编译安装的思路是本机以AS编辑代码,通过git同步给服务器,然后mm编译,编译完成过后经过smb把编译产物push到机器中,然后发送一条广播让应用挂掉重新加载,达到安装的目的

这里涉及的命令有点多,所以我用go把代码同步 -> 编译 -> 安装的命令串成一个脚本,做到一键编译安装运行

用AS开发SystemUI的坑就排到这里,谢谢。
 

### 配置和运行 SystemUI 服务 在 Android Studio 中配置和运行 SystemUI 服务需要对项目的构建环境进行一系列调整,以下内容详细描述了如何实现这一目标。 #### 1. 创建 Android 工程 首先,在 Android Studio 中创建一个新的工程,命名为 `SystemUIQ`,并设置包名为 `com.android.systemui`。选择 `No Activity` 模板,确保项目不包含默认的活动组件[^1]。 #### 2. 配置 `build.gradle` 为了支持 SystemUI 的构建需求,需要修改 `build.gradle` 文件,替换默认的 Maven 仓库为阿里云提供的镜像地址。具体配置如下: ```gradle repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'http://maven.aliyun.com/nexus/content/groups/public' } } ``` 上述代码片段替换了默认的 `google()` 和 `jcenter()` 仓库,以提高依赖下载速度。 #### 3. 添加必要的依赖项 SystemUIAndroid 系统中的核心组件,依赖于许多系统级库。需要在 `build.gradle` 中添加以下依赖项: ```gradle dependencies { implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' // 根据实际需求添加其他依赖 } ``` #### 4. 配置 AOSP 环境 由于 SystemUI 是 AOSP(Android Open Source Project)的一部分,直接从源码中提取并运行可能需要额外的配置。建议从 AOSP 源码中复制 SystemUI 源码到项目中,并调整其结构以适应 Android Studio 的构建系统。 #### 5. 修改 `AndroidManifest.xml` SystemUI 作为一个系统服务,需要在 `AndroidManifest.xml` 中声明权限和服务。例如: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.systemui"> <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <application android:allowBackup="true" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:theme="@style/Theme.AppCompat.Light.DarkActionBar"> <service android:name=".YourSystemService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:exported="false" /> </application> </manifest> ``` 上述代码示例中,`YourSystemService` 是一个占位符,需替换为实际的服务类名。 #### 6. 编译和运行 完成上述配置后,使用 Android Studio编译工具构建项目。如果一切正常,生成的 APK 可以安装到具有 root 权限的设备上,或者通过模拟器运行。 --- ### 注意事项 - SystemUI 是一个高度定制化的系统组件,可能需要额外的 AOSP 支持才能完全运行。 - 在非 root 设备上运行 SystemUI 可能会导致权限问题或功能缺失。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值