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();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40855673/article/details/127014805