使用Android Studio 开发 SystemUI

start.

由于用sublime或没有完整依赖的Studio来开发SystemUI非常难受,所以有了这篇分享,

目标是做到像普通应用一样在Android Studio里开发SystemUI,可以正常跳转,正常依赖,正常编译,一键安装。

 

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

使用Android Studio 开发 SystemUI_第1张图片

 

2. 将资源目录分类存放

    sourceSets {

        main {

            res.srcDirs += "src/main/res-flyaudio"

            res.srcDirs += "src/main/res-keyguard"

        }

    }

 

3. 删除重复定义的资源

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

No SIM card in tablet.

No SIM card in phone.


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中grep  -nr "TimeZoneFinder.class"

找到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的坑就排到这里,谢谢。

你可能感兴趣的:(android)