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

最近项目中针对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<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
                }
            }
        }
    }
}
复制代码

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

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

おすすめ

転載: juejin.im/post/7074128257787887652