Android 自定义Gradle插件(六):打包时修改assets中的文件

语言: CN / TW / HK

最近项目中针对SDK有一个优化需求,SDK中会根据配置文件来初始化各种功能,希望在打包时可以根据接入的项目从后台获取对应的配置文件覆盖SDK内部的默认配置文件。

这个优化需求同样通过gradle插件来实现,实现思路如下: 1. 从后台获取配置文件。 2. 在打包过程中复写SDK内部的配置文件。

如何在gradle插件中进行网络请求,在之前的文章Android 自定义Gradle插件(三):动态添加依赖中已经有介绍过了,这里不再赘述。

打包时修改assets中的文件

在之前的文章中,有在打包流程中对Manifest进行操作。基于此,我观察了打包过程中会执行的其余Task并找到了对assets进行操作的Task,如下图:

企业微信截图_dc44d0f6-7041-42ec-871b-4973006840de.png

我这边是选择mergeDebugAssetsTask来实现需求,这个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 {

@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
            }
        }
    }
}

} ```

接入后执行打包命令输出日志如图:

企业微信截图_7fe0956c-3b0b-4519-8b04-951529ca82a5.png