IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Gradle案例:apk构建、安装、启动一体化 -> 正文阅读

[移动开发]Gradle案例:apk构建、安装、启动一体化

背景

我们知道在调试时,只需要点击一下运行按钮就会自动为我们执行build->install->launch三个动作,非常方便,然而到了release阶段,AS就没有为我们提供类似的快捷操作了。本文的初衷就是希望在release阶段实现与AS run App类似的一键操作,提高自测阶段的工作效率。

技术点

首先需要了解build->install->launch这三个动作是如何实现的:

  • build:就是构建apk,相关的task为assemble<VariantName>
  • install:借助adb,也就是我们熟知的adb install命令;
  • launch:借助adb,即adb shell am start命令;

第一点我们只需要去hook对应的Task就好了,而且applicationVariant还提供了apk产物的具体文件路径,可以直接用到install流程中。然后是启动,在安装成功后,启动apk需要知道apk的包名和启动activity,包名也可以从applicationVariant.applicationId获取到,但是这个启动activity就比较麻烦了,有两种解决办法:

  1. 直接写死
    这个最简单直观,由于我们的启动activity一般不会轻易去改,所以如果是通过修改module的build.gradle方式添加task,直接写死是可以接受的。但是如果是通过gradle插件的方式添加task很明显就不合适了。
  2. 通过解析manifest获取
    直接贴代码了:
String getLauncherActivityName(){
    def file = android.sourceSets.main.manifest.srcFile
    def root = new XmlParser().parse(file)
    List<Node> activities = root.children().find {it.name()=='application'}.children().findAll{it.name()=='activity'}
    def nameAttr = {Node node->node.attributes().keySet().find{it.localPart=='name'}}
    Node main = activities.find {
        def ifs = it.children()
        if (ifs.isEmpty()) return false
        return ifs.any {Node intentFilter->
            def items = intentFilter.children()
            def hasMainAction = items.any {
                def attr = nameAttr(it)
                return it.name()=='action'&&attr!=null&&it.attributes().get(attr)=='android.intent.action.MAIN'
            }
            def hasLauncherCategory = items.any {
                def attr = nameAttr(it)
                return it.name()=='category'&&attr!=null&&it.attributes().get(attr)=='android.intent.category.LAUNCHER'
            }
            return hasMainAction&&hasLauncherCategory
        }
    }
    if (main==null) return null
    return main.attributes().get(nameAttr(main))
}

特别需要注意这里返回的activity名称可能是相对包名,建议转成完整包名,上述代码是没有转换的

实现代码

至此实现相关功能的核心点都已罗列,这里给出最终实现代码:

afterEvaluate {
    android.applicationVariants.each{ variant->
        def at = tasks.findByName("assemble${variant.name.capitalize()}")
        def outs = variant.outputs.matching {
            it.outputFile != null && it.outputFile.name.endsWith('.apk')
        }
        if (outs.isEmpty()) return
        println "variant.applicationId = ${variant.applicationId}"
        def out = outs.first().outputFile
        def runTask = task("${at.name}AndRun"){
            group 'highway'
            doFirst {
                def startTime = System.currentTimeMillis()
                def code = "adb install ${out.absolutePath}".execute().onExit().get().exitValue()
                println "install result = $code, cost = ${(System.currentTimeMillis() - startTime)} ms."
                if (code == 0) {
                    code = "adb shell am start ${variant.applicationId}/your.launch.Activity".execute().waitFor()
                    println "launch result = $code"
                }
            }
        }
        runTask.dependsOn at.taskDependencies.getDependencies(at)
        //        at.dependsOn runTask  // 我们不需要改变原task的行为,所以这里注掉
    }
}

OK,以后就可以运行:gradlew app:assemebleXXXReleaseAndrRun来打包并直接安装启动啦!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:52:02  更:2022-04-26 11:53:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:49:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码