Android 组件化实践——自动发布组件、根据编译环境自动依赖远程组件

概览

前言

最近在内网为Android项目配置了maven私服仓,想要把组件化的使用更进一步,即各组件发布到远端私服仓库,项目内从私服仓库依赖组件。
远端依赖组件的好处,就是提高编译效率。随着组件越来越多,每次发版时需要同时编译20+个组件,非常耗时。而有些组件是没有改动的,没必要参与编译增加编译时间,这时候使用远程依赖,可以极大的提高编译效率。
用远程依赖组件来提高编译效率,实际上是把各组件的编译流程尽量提前,放在其他合适的时机去编译发布到私服仓,待发版时直接远程依赖编译好的输出文件即可。
本文的主要目的是根据gitlab-ci持续集成流程、项目内部发版流程,设计出一套合适的自动发布/依赖远程组件的流程, 其中涉及到持续集成相关的知识,可以参考之前发布的Android持续集成实践系列文章

系列文章

为Android组件化项目搭建Maven私服

Android 组件化实践——自动发布组件、根据编译环境自动依赖远程组件

正文开始

要做什么?

首先看标题就很清晰,我们要做两件事,自动发布组件到私服仓、自动从私服仓依赖远程组件。
先说结论:

  1. 发布组件和依赖远程组件,需要发布release和debug两个版本的组件。
    想象一下,假如现在有个base组件,放着所有的基础库封装,所有业务组件都依赖它。base中有这么个逻辑,根据BuildConfig#DEBUG字段的值来使用测试环境/正式环境的base_url。这时候如果只发布release的base组件,你在测试环境远程依赖base组件时,base_url就错误的使用了正式环境的url。
  2. 分别在合适的时机发布release或debug版本的组件
    首先明确一点,执行发布命令,会编译+发布,所以发布时的编译也是耗时的;另外一个APP版本的完整开发流程,可能是发布N多个debug版本+发布1~3个发布候选版+发布一个正式版,debug和release的发布频率是不一样的,debug更多,所以如果同时发布release和debug,必然造成其中一个版本的编译浪费。
自动发布组件到私服仓

项目里使用了gitlab持续集成流程,可以在持续集成流程再加入一个发布组件的stage,在合适的条件下分别触发debug/release组件发布

自动发布 debug 组件

debug发布的是最频繁的,通常的做法是发布快照-SNAPSHOT版本,但是这样处理又有弊端,之前的代码管理相当于是失效了。之前合作开发,其他同事提交代码后,我需要从远端仓库拉取后,新的代码才会在我本地生效,而直接使用快照版本,不用拉取最新代码,我本地编译时就会从远端获取最新代码的组件来引用,这样使开发环境管理起来很混乱。
基于以上,合适的时机为:当提交的代码中组件版本号更改,且当前分支在开发分支,触发自动发布debug组件

  1. gitlab-ci配置发布组件阶段
    gitlab-ci.yml:

    image: inovex/gitlab-ci-android
    
    #######################
    #gitlab-runner 配置文件#
    #######################
    
    variables:
      GRADLE_OPTS: "-Dorg.gradle.daemon=false"
    before_script:
      #  配置 jdk 17/11/8
      - export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
      ...
      #  获取权限
      ...
      - chmod +x ./publish-module
      
    stages:
      - publishModule #定义发布组件阶段,在所有阶段之前
      - build
      - reinforceAndChannel
      - deploy
      
    # gradle.properties文件变动时,编译前自动发布debug module
    publish_debug_module:
      stage: publishModule
      only:
        changes:
          - gradle.properties #组件版本号在此文件定义,此文件更改就触发发布组件stage
        refs:
          - /^develop(_[A-Za-z0-9]+)?$/ #只在开发分支
      script:
        - echo "gradle.properties文件变动,执行发布debug module逻辑"
        - export publishMode="debug"
        - ./publish-module
      tags:
        - android
    ...
    

    publish-module文件:

    #!/usr/bin/env bash
    
    ############################
    #自动编译时自动发布debug module #
    ############################
    
    #任何命令失败时停止执行
    set -e
    
    # 修改 FORCE_USE_DEPENDENCY_MODE 为 local
    echo 'start exec publish-module.sh ...'
    
    echo "publishMode is ${publishMode} ..."
    publishExec='publishDebugPublicationToMavenRepository'
    if [ "$publishMode" = "release" ]; then
      publishExec=publishReleasePublicationToMavenRepository
    fi
    echo "publishExec is ${publishExec} ..."
    
    echo '修改 gradle.properties 中 FORCE_USE_DEPENDENCY_MODE 为 local ...'
    sed -i "s/FORCE_USE_DEPENDENCY_MODE=.*$/FORCE_USE_DEPENDENCY_MODE=local/;" gradle.properties
    
    echo '修改成功,发布 module ...'
    ./gradlew $publishExec
    
    echo '发布成功,修改 gradle.properties 中 FORCE_USE_DEPENDENCY_MODE 为 remote ...'
    sed -i "s/FORCE_USE_DEPENDENCY_MODE=.*$/FORCE_USE_DEPENDENCY_MODE=remote/;" gradle.properties
    echo '修改成功'
    
    echo 'end exec publish-module.sh ...'
    

    发布代码maven-publish.gradle:

    apply plugin: "maven-publish"
    apply from: "$rootDir/gradle/maven-utils.gradle"
    
    afterE
### 如何通过 Android Studio 实现远程更新 #### 一、基础知识概述 在开发过程中,有时需要对已经部署的应用程序进行远程更新。这种功能可以通过多种方式实现,比如动态加载 APK 文件或者利用服务器推送新版本资源文件并重新构建应用逻辑。以下是基于 Android Studio 的一种常见解决方案。 为了支持远程更新,通常需要完成以下几个核心部分: 1. **配置 Gradle 构建脚本**:确保项目能够正确编译打包新的应用程序版本。 2. **搭建远程仓库**:用于存储最新的依赖库或二进制文件。 3. **启用设备的无线调试模式**:方便测试阶段快速验证更新效果。 4. **调整调试配置**:适配不同的网络环境以及目标设备特性。 --- #### 二、具体操作流程 ##### 1. 修改 `build.gradle` 文件以适应远程需求 如果遇到编译错误,可以在 `build.gradle (Module)` 中添加必要的插件支持项。例如,在某些场景下可能需要用到 Maven 插件来管理外部依赖关系: ```groovy plugins { id 'com.android.application' } dependencies { classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // 添加此行以便更好地处理远程依赖 [^2] } ``` 上述代码片段展示了如何引入第三方工具链至项目的构建环境中,从而增强其灵活性与扩展能力。 ##### 2. 设置远程仓库地址 为了让项目可以从指定位置拉取最新组件,需定义清晰有效的远程源路径。假设当前正在使用的是一套公开可用的服务,则只需简单声明如下字段即可满足基本要求: ```groovy repositories { mavenCentral() google() // 默认包含Google官方资料库 [^2] // 自定义私有镜像站点(如果有) maven { url "https://your-private-repo.com/artifactory/libs-release-local/" } } ``` 此处强调了多渠道供应的重要性——既保留标准选项又兼顾特殊定制化诉求。 ##### 3. 开启终端用户的无线调试权限 针对实际运行时所处的不同物理条件,有必要提前做好充分准备。特别是当希望摆脱实体连线束缚而单纯依靠 Wi-Fi 来达成交互目的时候,“开启无线调试”成为不可或缺的一环。按照指引逐步执行以下动作序列直至最终确认消息显示无误为止[^4]: - 前往系统设定界面找到“开发者选项” - 查找名为“无线调试”的开关按钮并激活它 - 访问对应子菜单进一步细化参数调节 - 利用图形码扫描机制建立初始链接认证过程 - 接收来自客户端的通知反馈表明状态切换已完成 一旦以上步骤顺利完成之后,就可以放心大胆地断开端口关联仅靠空中接口维持正常作业秩序啦! ##### 4. 调整 Run/Debug Configurations 参数 最后一步涉及微调那些影响到整个工作流效率的关键因子们。一般来说只需要关注三个主要方面就足够应付大多数情况了[^5]: - 应用名称标签(可选,默认值亦适用) - 网络通信端口号分配策略(防止冲突发生) - 明确指派待测单元所属类别归属 这些改动虽然看似不起眼但却能显著提升整体体验质量哦~ --- #### 三、注意事项 尽管上面介绍的方法相对简便易懂但仍存在一些潜在风险需要注意规避才行呢。比如说务必保证所有参与方之间保持良好同步;另外也要时刻警惕网络安全威胁以免造成不必要的损失哟~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值