背景
- 项目想用dex动态加载,而androidstudio java模块构建完成后会生成jar,需要手动转成dex文件,比较麻烦,因此可以自定义gradle task用于生成dex文件
- 项目需求要在打包apk前修改assets目录下的文件
本文记录以上两个步骤的实现过程,以备日后快速翻阅
自定义Task生成dex文件步骤
- 在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
}
- 在模块目录下新建dxTool目录,将dx和dx.jar文件放入
dx和dx.jar文件可以在android sdk工具包的build-tools/30.0.3下找到 - 双击该task即可在模块目录下生成xxx.dex
效果
修改assets目录下的文件步骤
- 在项目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();
}
}
}
}