SystemUI像Launcher3一样导入到AndroidStudio

2,188 阅读2分钟

一、疑惑

目前在做Android的SystemUI、Settings、Launcher3的开发,其中发现Launcehr3的源码中带有build.gradle文件,自然Launcher3能很方便的导入到AndroidStudio中,但是SystemUI跟Settings的源码中却没有这个文件,SystemUI的源码目录结构与标准的Android项目代码差异也比较大,我一直在想能不能尽量小的改动SystemUI的代码目录结构,把SystemUI像Launcher3一样导入到AndroidStudio当中,最终我还是实现了,提前说明下,我目前的工作方式是在AndroidStudio上面修改代码,再同步到服务器上,在服务器上编译SystemUI,所以这边文章最终结果是将SystemUI的代码导入到AS中,并不涉及AS编译,感兴趣的朋友们可以自行尝试...

二、导入main

首先,我们先通过AS创建一个本地项目,名字可以取SystemUI,我是本地有一个了,所以改成了SystemUI_AS

image.png

注意语言选择Java,构建语言选择Groovy DSL

image.png

这样我们就将一个项目创建好了,接着我们将AS中的app目录给删掉(删不掉的话去文件管理器删)

image.png

接着我们将SystemUI的全部代码拷贝进去,结构目录如下:

image.png

然后在根目录修改build.gradle,没有的话创建一个,内容如下:

plugins {
    alias(libs.plugins.androidApplication)
}

android {
    namespace 'com.android.systemui'
    compileSdk 34

    defaultConfig {
        applicationId "com.android.systemui"
        minSdk 24
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    sourceSets {
        main {
            //指定资源文件
            res.srcDirs = ['res','res-keyguard','res-product']
            java.srcDirs = ['src']
            manifest.srcFile "AndroidManifest.xml"
        }

    }
}


dependencies {
    //导入相关依赖
}

其中sourceSets中去指定我们要引用的主模块资源,这时候res跟src就已经导入进来了

image.png

三、导入library

接着SystemUI中有很多的代码库,要把它们给导入进来,以shared库为例

在shared目录下下编写一个build.gradle

plugins {
    alias(libs.plugins.androidLibrary)
}

android {
    namespace 'com.android.systemui.shared'
    compileSdk 34

    defaultConfig {
        minSdk 26

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    sourceSets {
        main {
            res.srcDirs = ['res']
            java.srcDirs = ['src']
            manifest.srcFile "AndroidManifest.xml"
        }
    }
}

dependencies {

}

在根目录下的settigns.gradle里面将库include

注意名字要跟文件名相对应

image.png

此时Sync一下,可能会报错

此时骚操作来了,创建一个新module,下载相关资源后,将moudle删掉,此时再sync就不会报错了

image.png

image.png

进度条走完,可以将这个module删掉,此时shared库的代码就已经生效了

image.png

此时主工程就可以将shared库进行依赖,其他的库也是如此操作

image.png

四、导入libs

SystemUI中有用到一些系统资源,比如framework,settingslib等,我们需要将其引入进来

在项目中新建libs文件夹,将jar包放进去,以framework.jar为例

image.png

  • 在主工程中导入
implementation files('libs\framework.jar')

image.png

  • 在module中导入
implementation files('..\libs\framework.jar')

image.png

五、总结

至此SystemUI的导入就差不多完成了,也最大可能的保留了SystemUI目录的完整性