2024年安卓最全细究Android开发代码中心化所带来的问题,附带学习经验

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}

假如user组件的用户信息需要给支付组件使用,那我们怎么处理?

ARouter可以通过上面的IProvider注入服务的方式通信,或者使用EventBus这种方式。

data class UserInfo(val uid: Int, val name: String)

/**

*@author kpa

*@date 2021/7/21 2:15 下午

*@email billkp@yeah.net

*@description 用户登录、获取信息等

*/

interface IAccountService : IProvider {

//获取账号信息 提供信息*

fun getUserEntity(): UserInfo?

}

//注入服务

@Route(path = “/user/user-service”)

class UserServiceImpl : IAccountService {

//…

}

在支付组件中

问题就暴露在了我们眼前,支付组件中的IAccountService和UserInfo从哪里来?

这也就是module-api 需要解决的问题,在原理方面:

将需要共享的数据和初始化数据的类文件设计为.api文件

打开AS-> Prefernces -> File Types找到kotlin(Java)选中在File name patterns 里面添加".api"(注意这个后缀随意开心的话都可以设置成.kpa)

举例:

data class UserInfo(val userName: String, val uid: Int)

interface UserService {

fun getUserInfo(): UserInfo

}

生成包含共享的数据和初始化数据的类文件的module-api组件

这步操作有以下实现方式。

  • 自己手动创建一个module-api 组件 显然这是不可取但是可行的

  • 使用脚本语言shell 、python 等扫描指定路径生成对应module-api

  • 利用Android 编译环境及语言groovy,编写gradle脚本,优势在于不用考虑何时编译,不打破编译环境,书写也简单

module-api 脚本

=========================================================================

找到这些问题出现的原理及怎么去实现之后,从github上找到了优秀的人提供的脚本,完全符合我们的使用预期。

def includeWithApi(String moduleName) {

def packageName = “com/xxx/xxx”

//先正常加载这个模块

include(moduleName)

//找到这个模块的路径

String originDir = project(moduleName).projectDir

//这个是新的路径

String targetDir = “${originDir}-api”

//原模块的名字

String originName = project(moduleName).name

//新模块的名字

def sdkName = “${originName}-api”

//这个是公共模块的位置,我预先放了一个 新建的api.gradle 文件进去

String apiGradle = project(“:apilibrary”).projectDir

// 每次编译删除之前的文件

deleteDir(targetDir)

//复制.api文件到新的路径

copy() {

from originDir

into targetDir

exclude ‘**/build/’

exclude ‘**/res/’

include ‘**/*.api’

}

//直接复制公共模块的AndroidManifest文件到新的路径,作为该模块的文件

copy() {

from “${apiGradle}/src/main/AndroidManifest.xml”

into “${targetDir}/src/main/”

}

//复制 gradle文件到新的路径,作为该模块的gradle

copy() {

from “${apiGradle}/api.gradle”

into “${targetDir}/”

}

//删除空文件夹

deleteEmptyDir(new File(targetDir))

//todo 替换成自己的包名

//为AndroidManifest新建路径,路径就是在原来的包下面新建一个api包,作为AndroidManifest里面的包名

String packagePath = “ t a r g e t D i r / s r c / m a i n / j a v a / " + p a c k a g e N a m e + " {targetDir}/src/main/java/" + packageName + " targetDir/src/main/java/"+packageName+"{originName}/api”

//todo 替换成自己的包名,这里是apilibrary模块拷贝的AndroidManifest,替换里面的包名

//修改AndroidManifest文件包路径

fileReader(“ t a r g e t D i r / s r c / m a i n / A n d r o i d M a n i f e s t . x m l " , " c o m m o n l i b r a r y " , " {targetDir}/src/main/AndroidManifest.xml", "commonlibrary", " targetDir/src/main/AndroidManifest.xml","commonlibrary","{originName}.api”)

new File(packagePath).mkdirs()

//重命名一下gradle

def build = new* File(targetDir + “/api.gradle”)

if(build.exists()) {

build.renameTo(new File(targetDir + “/build.gradle”))

}

// 重命名.api文件,生成正常的.java文件

renameApiFiles(targetDir, ‘.api’, ‘.java’)

//正常加载新的模块

include “:$sdkName”

}

private void deleteEmptyDir(File dir) {

if(dir.isDirectory()) {

File[] fs = dir.listFiles()

if(fs != null && fs.length > 0) {

for (int i = 0; i < fs.length; i++) {

File tmpFile = fs[i]

if (tmpFile.isDirectory() {

deleteEmptyDir(tmpFile)

}

if (tmpFile.isDirectory() && tmpFile.listFiles().length <= 0){

tmpFile.delete()

}

}

}

if (dir.isDirectory() && dir.listFiles().length == 0) {

dir.delete()

}

}

private void deleteDir(String targetDir) {

FileTree targetFiles = fileTree(targetDir)

targetFiles.exclude “*.iml”

targetFiles.each { File file ->

file.delete()

}

}

/**

  • rename api files(java, kotlin…)

**/

private def renameApiFiles(root_dir, String suffix, String replace) {

FileTree* files = fileTree(root_dir).include(“**/*$suffix”)

files.each {

File file ->

file.renameTo(new File(file.absolutePath.replace(suffix, replace)))

}

}

//替换AndroidManifest里面的字段*

def fileReader(path, name, sdkName) {

def readerString = “”

def hasReplace = false

file(path).withReader(‘UTF-8’) { reader ->

reader.eachLine {

if (it.find(name)) {

it = it.replace(name, sdkName)

hasReplace = true

}

readerString <<= it

readerString << ‘\n’

}

if (hasReplace) {

file(path).withWriter(‘UTF-8’) {

within ->

within.append(readerString)

}

}

return readerString

}

}

使用

最后

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

(img-8L1XyCgF-1715762270370)]

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

[外链图片转存中…(img-i4p0li8y-1715762270370)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值