最近项目中针对SDK有一个优化需求,SDK中会根据配置文件来初始化各种功能,希望在打包时可以根据接入的项目从后台获取对应的配置文件覆盖SDK内部的默认配置文件。
这个优化需求同样通过gradle插件来实现,实现思路如下:
- 从后台获取配置文件。
- 在打包过程中复写SDK内部的配置文件。
如何在gradle插件中进行网络请求,在之前的文章Android 自定义Gradle插件(三):动态添加依赖中已经有介绍过了,这里不再赘述。
打包时修改assets中的文件
在之前的文章中,有在打包流程中对Manifest进行操作。基于此,我观察了打包过程中会执行的其余Task并找到了对assets进行操作的Task,如下图:
我这边是选择mergeDebugAssets
Task来实现需求,这个Task根据字面意思就是合并assets文件,因此在这个task执行完后找到此时SDK内部配置文件的路径,即可对其进行操作,代码如下:
public class FileUtils {
/**
* 向文件夹保存文件
*
* @param floderFile 要保存文件的文件夹
* @param fileName 文件名
* @param fileContentData 文件内容
*/
public static void saveFileToFolder(File floderFile, String fileName, String fileContentData) {
File createFile = new File(floderFile, fileName);
LogUtils.println("create file path :" + createFile.getPath());
//先删除旧的file
if (createFile.exists()) {
boolean delete = createFile.delete();
LogUtils.println("delete old file success :" + delete);
}
try {
boolean create = createFile.createNewFile();
LogUtils.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();
}
}
}
}
}
class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.afterEvaluate {
//这里以mergeDebugAssets为例,mergeReleaseAssets也一样。
Task mergeAssetsTask = project.getTasks().getByName("mergeDebugAssets")
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("mini_game_config.json")
if (findTargetFile) {
LogUtils.println("writeNetConfigToAssets")
FileUtils.saveFileToAppFolder(it, "", ”netConfigContent“)
}
return findTargetFile
}
return findTargetFile
}
}
}
}
}
复制代码
接入后执行打包命令输出日志如图: