Android笔记(二十一):Gradle小技巧——自定义Task生成dex文件/修改assets目录下的文件

背景

  1. 项目想用dex动态加载,而androidstudio java模块构建完成后会生成jar,需要手动转成dex文件,比较麻烦,因此可以自定义gradle task用于生成dex文件
  2. 项目需求要在打包apk前修改assets目录下的文件

本文记录以上两个步骤的实现过程,以备日后快速翻阅

自定义Task生成dex文件步骤

  1. 在build.gradle创建task,生成dex
plugins {
    id 'java-library'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

//复制生成的jar到新的目录内待用,依赖assemble任务完成
task copyJar(type: Copy, dependsOn: [assemble]){
    from('build/libs/')
    into('build/gen/')
    include('xxx.jar')

}

//将jar转为dex,依赖copyJar任务完成
task makeDex(type: Exec, dependsOn: [copyJar]){
    def a1, a2
	//注意要判断gradle运行在哪个操作系统,使用对应的控制台命令执行dx
    if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
        a1 = 'cmd'
        a2 = '/c'
    } else {
        a1 = 'sh'
        a2 = '-c'
    }
    def list = []
    list.add(a1)
    list.add(a2)
    list.add("$projectDir/dxTool/dx --dex --output=xxx.dex $projectDir/build/gen/xxx.jar")
    commandLine list
}
  1. 在模块目录下新建dxTool目录,将dx和dx.jar文件放入
    dx和dx.jar文件可以在android sdk工具包的build-tools/30.0.3下找到
  2. 双击该task即可在模块目录下生成xxx.dex
    在这里插入图片描述

效果

在这里插入图片描述

修改assets目录下的文件步骤

  1. 在项目build.gradle添加以下代码
    原理:gradle打包apk执行mergeDebugAssets/mergeReleaseAssets任务后,可以通过getOutputs().getFiles()获取到合并后的assets目录内的文件
project.afterEvaluate {
    List variantNames = new ArrayList()
    variantNames.add("debug")
    variantNames.add("release")

    variantNames.each {
        try {
            def variantName = it.capitalize()
            Task mergeAssetsTask = project.getTasks().getByName(String.format("merge%sAssets", variantName))
            mergeAssetsTask.doLast {
                def outputs = mergeAssetsTask.getOutputs()
                def files = outputs.files.getFiles()
                boolean findTargetFile = false
                files.find {
                    def childFile = it.listFiles()
                    childFile.find {
                        findTargetFile = it.toString().contains("要修改的文件名称")
                        if (findTargetFile) {
                            
                           	//修改完调用writeToLocalFile(it, newContent)保存
                        }
                        return findTargetFile
                    }
                    return findTargetFile
                }
            }
        }catch(Exception e1){
            println("handle assets---error:" + e1)
        }
    }
}

保存新内容到指定文件

def writeToLocalFile(File createFile, String fileContentData) {
    println("create file path :" + createFile.getPath());

    if (createFile.exists()) {
        boolean delete = createFile.delete();
        println("delete old file success :" + delete);
    }

    try {
        boolean create = createFile.createNewFile();
        println("create new file success :" + create);
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (createFile.exists()) {
        FileOutputStream outputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        BufferedWriter writer = null;
        try {
            outputStream = new FileOutputStream(createFile);
            outputStreamWriter = new OutputStreamWriter(outputStream);
            writer = new BufferedWriter(outputStreamWriter);
            writer.write(fileContentData);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
                if (outputStreamWriter != null) {
                    outputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌面小侠Plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值