Android 自定义Gradle插件(九):上传文件到云存储

296 阅读3分钟

在SDK的项目中,使用了配置文件来管理功能,为了方便管理以及使用,我建了个单独的项目来放配置文件。

最开始,需要调整配置时,都是手动从云存储管理后台下载当前最新的配置文件,调整完再手动上传到云存储管理后台,配置文件少时没啥问题,但是多了之后就很麻烦,所以决定做个插件来实现下载和上传。

公司一开始用的是MinIO,最近迁移到了AliOSS,这边分别介绍下。

添加SDK

在插件项目的build.gradle中添加MinIO和AliOSS的SDK。

dependencies {
    implementation(gradleApi())
    implementation("io.minio:minio:8.4.2")
    implementation("com.aliyun.oss:aliyun-sdk-oss:3.15.0")
}

通用配置

我在项目中是使用包名来管理配置,有需要可以根据实际需求进行调整。

自定义extensions来配置使用的云存储类型和需要上传以及下载的包名。

public class CheckConfigExtension {

    public static final String MINIO = "MinIO";
    public static final String ALIOSS = "AliOss";

    public String clientType = ALIOSS;

    public ArrayList<String> packageName;
}

创建插件和Task(上传和下载)

//DownloadTask
public class ConfigDownloadTask extends DefaultTask {

    @TaskAction
    void doTaskAction() {
        if (MinIoHelper.enable()) {
            MinIoHelper.downloadConfig();
        }
        if (AliOssHelper.enable()) {
            AliOssHelper.downloadConfig();
        }
    }
}

//UploadTask
public class ConfigUploadTask extends DefaultTask {

    @TaskAction
    void doTaskAction() {
        if (MinIoHelper.enable()) {
            MinIoHelper.uploadConfig();
        }
        if (AliOssHelper.enable()) {
            AliOssHelper.uploadConfig();
        }
    }
}

//插件类
class CheckConfigPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        //注册Extension类
        CheckConfigExtension checkConfigExtension = project.extensions.create("CheckConfigExtension", CheckConfigExtension)
        project.afterEvaluate {
            def downloadTask = project.getTasks().create("ConfigDownloadTask", ConfigDownloadTask)
            def uploadTask = project.getTasks().create("ConfigUploadTask", ConfigUploadTask)
            downloadTask.group = "CheckConfig"
            uploadTask.group = "CheckConfig"

            //下载文件保存的路径
            def localConfigPath = project.projectDir.absolutePath + "/src/main/java/com/aaa/bbb/"
            if (checkConfigExtension.clientType == CheckConfigExtension.MINIO) {
                MinIoHelper.init(localConfigPath, checkConfigExtension.packageName)
            }
            if (checkConfigExtension.clientType == CheckConfigExtension.ALIOSS) {
                AliOssHelper.init(localConfigPath, checkConfigExtension.packageName)
            }
        }
    }
}

MinIO

public class MinIoHelper {

    //云存储中的Bucket名称
    private static final String sdkBucket = "bucketName";

    //Bucket中要下载文件的全路径(不用包含Bucket的名称)
    private static final String downloadConfigFilePath = "a/b/file.文件类型";

    //Bucket中要上传文件的全路径(不用包含Bucket的名称)
    private static final String uploadConfigFilePath = "a/b/file.文件类型";

    private String localConfigPath;

    private ArrayList<String> configPackageNames;

    private MinioClient minioClient;

    private MinIoHelper() {
    }

    private static final class MinIoHelperHolder {
        static final MinIoHelper minIoHelper = new MinIoHelper();
    }

    public static boolean enable() {
        return MinIoHelperHolder.minIoHelper.minioClient != null;
    }

    public static void init(String localConfigPath, ArrayList<String> configPackageNames) {
        MinIoHelperHolder.minIoHelper.minioClient = new MinioClient.Builder()
                .endpoint("endpoint", port, false)
                .credentials("accessKey", "secretKey")
                .build();
        MinIoHelperHolder.minIoHelper.localConfigPath = localConfigPath;
        MinIoHelperHolder.minIoHelper.configPackageNames = configPackageNames;
    }

    public static void downloadConfig() {
        if (MinIoHelperHolder.minIoHelper.configPackageNames != null && !MinIoHelperHolder.minIoHelper.configPackageNames.isEmpty()) {
            for (String packageName : MinIoHelperHolder.minIoHelper.configPackageNames) {
                MinIoHelperHolder.minIoHelper.downloadConfig(packageName);
            }
        }
    }

    public static void uploadConfig() {
        if (MinIoHelperHolder.minIoHelper.configPackageNames != null && !MinIoHelperHolder.minIoHelper.configPackageNames.isEmpty()) {
            for (String packageName : MinIoHelperHolder.minIoHelper.configPackageNames) {
                MinIoHelperHolder.minIoHelper.uploadConfig(packageName);
            }
        }
    }

    private void downloadConfig(String configPackageName) {
        if (MinIoHelperHolder.minIoHelper.bucketExits()) {
            String finalDownloadPath = String.format(downloadConfigFilePath, configPackageName);
            try {
                StatObjectResponse objectStat = MinIoHelperHolder.minIoHelper.minioClient.statObject(StatObjectArgs.builder()
                        .bucket(sdkBucket)
                        .object(finalDownloadPath)
                        .build());

                if (objectStat != null) {
                    InputStream inputStream = MinIoHelperHolder.minIoHelper.minioClient.getObject(GetObjectArgs.builder()
                            .bucket(sdkBucket)
                            .object(finalDownloadPath)
                            .build());
                    saveFile(inputStream, configPackageName);
                }
            } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
                e.printStackTrace();
            }
        }
    }

    private void uploadConfig(String configPackageName) {
        if (MinIoHelperHolder.minIoHelper.bucketExits()) {
            String finalUploadPath = String.format(uploadConfigFilePath, configPackageName);
            File configFile = new File(localConfigPath + "/" + configPackageName.replace(".", "_") + "/", "config.json");
            if (configFile.exists()) {
                try {
                    minioClient.putObject(PutObjectArgs.builder()
                            .bucket(sdkBucket)
                            .object(finalUploadPath)
                            .stream(new FileInputStream(configFile), configFile.length(), -1)
                            .build());
                } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private boolean bucketExits() {
        boolean sdkBucketExists = false;
        try {
            sdkBucketExists = minioClient.bucketExists(BucketExistsArgs.builder()
                    .bucket(sdkBucket)
                    .build());
        } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
            e.printStackTrace();
        }
        return sdkBucketExists;
    }

    private void saveFile(InputStream inputStream, String packageName) {
        File parentFile = new File(localConfigPath, packageName.replace(".", "_"));
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        File configFile = new File(parentFile, "config.json");
        if (configFile.exists()) {
            configFile.delete();
        }
        try {
            boolean create = configFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (configFile.exists() && inputStream != null) {
            FileOutputStream outputStream = null;
            try {
                outputStream = new FileOutputStream(configFile);
                int read;
                byte[] bytes = new byte[1024];
                while ((read = inputStream.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, read);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    inputStream.close();
                    if (outputStream != null) {
                        outputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

AliOSS

public class AliOssHelper {

    //云存储中的Bucket名称
    private static final String sdkBucket = "bucketName";

    //Bucket中要下载文件的全路径(不用包含Bucket的名称)
    private static final String downloadConfigFilePath = "a/b/file.文件类型";

    //Bucket中要上传文件的全路径(不用包含Bucket的名称)
    private static final String uploadConfigFilePath = "a/b/file.文件类型";

    private String localConfigPath;

    private ArrayList<String> configPackageNames;

    private OSS ossClient;

    private AliOssHelper() {
    }

    private static final class AliOssHelperHolder {
        static final AliOssHelper aliOssHelper = new AliOssHelper();
    }

    public static boolean enable() {
        return AliOssHelperHolder.aliOssHelper.ossClient != null;
    }

    public static void init(String localConfigPath, boolean formal, ArrayList<String> configPackageNames) {
        AliOssHelperHolder.aliOssHelper.localConfigPath = localConfigPath;
        AliOssHelperHolder.aliOssHelper.formal = formal;
        AliOssHelperHolder.aliOssHelper.configPackageNames = configPackageNames;
        String endpoint = "****";
        String accessKeyID = "****";
        String accessKeySecret = "****";
        AliOssHelperHolder.aliOssHelper.ossClient = new OSSClientBuilder().build(endpoint, accessKeyID, accessKeySecret);
    }

    public static void downloadConfig() {
        if (AliOssHelperHolder.aliOssHelper.configPackageNames != null && !AliOssHelperHolder.aliOssHelper.configPackageNames.isEmpty()) {
            for (String packageName : AliOssHelperHolder.aliOssHelper.configPackageNames) {
                AliOssHelperHolder.aliOssHelper.downloadConfig(packageName);
            }
        }
    }

    public static void uploadConfig() {
        if (AliOssHelperHolder.aliOssHelper.configPackageNames != null && !AliOssHelperHolder.aliOssHelper.configPackageNames.isEmpty()) {
            for (String packageName : AliOssHelperHolder.aliOssHelper.configPackageNames) {
                AliOssHelperHolder.aliOssHelper.uploadConfig(packageName);
            }
        }
    }

    private void downloadConfig(String configPackageName) {
        String finalDownloadPath = String.format(downloadConfigFilePath, configPackageName);
        File localConfigFile = new File(localConfigPath + "/" + configPackageName.replace(".", "_") + "/", "config.json");
        createFile(configPackageName);
        try {
            ossClient.getObject(new GetObjectRequest(sdkBucket, finalDownloadPath), localConfigFile);
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
          
        }
    }

    private void uploadConfig(String configPackageName) {
        String finalUploadPath = String.format(uploadConfigFilePath, configPackageName);
        File localConfigFile = new File(localConfigPath + "/" + configPackageName.replace(".", "_") + "/", "config.json");
        if (localConfigFile.exists()) {
            try {
                ossClient.putObject(new PutObjectRequest(sdkBucket, finalUploadPath, localConfigFile));
            } catch (OSSException | ClientException e) {
                e.printStackTrace();
            }
        }
    }
    
    private void createFile(String configPackageName) {
        File parentFile = new File(localConfigPath, configPackageName.replace(".", "_"));
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        File configFile = new File(parentFile, "config.json");
        if (configFile.exists()) {
            configFile.delete();
        }
        try {
            configFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在项目中使用

plugins {
    id("插件名称")
}

CheckConfigExtension {

    //配置云存储类型
    clientType = ALIOSS

    packageName = [
            "com.aaa.bbb"
    ]
}