美文网首页Android
Intellij IDEA 插件开发——修改AS工程中的配置文件

Intellij IDEA 插件开发——修改AS工程中的配置文件

作者: 索隆的南南鸟 | 来源:发表于2020-05-26 18:42 被阅读0次

一.修改settings.gradle文件

修改Android Studio工程目录下的settings.gradle中文件,一般情况下,内容基本都长这样:

rootProject.name='ProjectName'
include ':app'
include ':module1'
include ':module2'

代码中有使用 VirtualFile:虚拟文件系统,具体可以参考:(PSI里面也有)

https://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/virtual_file.html

public class FileUtils {
    /**
     * 添加Module后修改settings.gradle文件内容
     * createProjectSubFile("settings.gradle", "rootProject.name = 'multiproject'\n" + "include ':app'");
     *
     * @param project      工程对象
     * @param relativePath 文件名字:settings.gradle
     * @param content      要添加的内容 例如:include ':app'
     * @return
     * @throws IOException
     */
    public static VirtualFile createProjectSubFile(Project project, String relativePath, String content) throws IOException {
        VirtualFile file = createProjectSubFile(project.getBasePath(), relativePath);
        StringJoiner builder = new StringJoiner("").add(content);
        String newText = FileUtil.loadTextAndClose(file.getInputStream());
        if (!newText.contains(builder.toString())) {
            setFileContent(file, newText + builder.toString(), false);
            GradleSyncInvoker.getInstance().requestProjectSync(project, TRIGGER_USER_STALE_CHANGES);//相当于修改了配置文件后,自动进行Sync Now的操作
        }
        return file;
    }
   
    protected static VirtualFile createProjectSubFile(String projectPath, String relativePath) throws IOException {
        File f = new File(projectPath, relativePath);
        FileUtil.ensureExists(f.getParentFile()); // import com.intellij.openapi.util.io.FileUtil; 
        FileUtil.ensureCanCreateFile(f);
        final boolean created = f.createNewFile();
        if (!created && !f.exists()) {
            throw new AssertionError("Unable to create the project sub file: " + f.getAbsolutePath());
        }
        return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(f);
    }
    
    /*修改文件内容*/
    protected static void setFileContent(final VirtualFile file, final String content, final boolean advanceStamps) {
        try {
            WriteAction.runAndWait(() -> {
                if (advanceStamps) {
                    file.setBinaryContent(content.getBytes(StandardCharsets.UTF_8), -1, file.getTimeStamp() + 4000);
                } else {
                    file.setBinaryContent(content.getBytes(StandardCharsets.UTF_8), file.getModificationStamp(), file.getTimeStamp());
                }
            });
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

调用的代码:

//mProject当前工程的对象
FileUtils.createProjectSubFile(mProject, "settings.gradle",
        "\ninclude ':" + Module名字 + "'");

二.修改build.gradle文件

修改build.gradle文件中dependencies括号内的内容

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}

调用的代码

FileUtils.changeGradleFile(mProject, directory, "build.gradle", string);
public class FileUtils {
    /**
     * 修改build.gradle文件的dependents内容
     *
     * @param project        工程对象
     * @param selectFilePath 选中的目录
     * @param fileName       选中目录下的名字: build.gradle
     * @param content        要添加的内容
     */
    public static void changeGradleFile(Project project, String selectFilePath, String fileName, String content) {
        Runnable runnable = () -> {
            File ioFile = new File(selectFilePath, fileName);
            VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(ioFile);
            if (virtualFile != null) {
                PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
                if (psiFile != null) {
                    Document document = psiFile.getViewProvider().getDocument();
                    assert document != null;
                    CharSequence sequence = document.getCharsSequence();
                    StringBuilder fileContentWithSemicolon = new StringBuilder(sequence);
                    String nameStr = interceptString(content, "'", ":");
                    if (!ReadonlyStatusHandler.getInstance(project).ensureFilesWritable().hasReadonlyFiles()) {
                        int myOffset = fileContentWithSemicolon.indexOf("dependencies");
                        String dependentString = fileContentWithSemicolon.toString().substring(myOffset);
                        if (dependentString.contains(content)) {
                            return;
                        }
                       if (!dependentString.contains(nameStr + ":")) {
                            //获取dependents两个括号符号的index,获取到要插入的位置
                            int openingBrace = fileContentWithSemicolon.indexOf("{", myOffset);
                            int closingBrace = (openingBrace < 0) ? -1 : fileContentWithSemicolon.indexOf("}", openingBrace);
                            document.insertString(closingBrace, "    " + content + "\n");
                        } else {
                            //要下载的版本号
                            String versionString = interceptString(content, ":", "'");
                            //获取本地的版本号的index
                            int localOffset = fileContentWithSemicolon.indexOf(nameStr, myOffset);
                            int openingBrace = fileContentWithSemicolon.indexOf(":", localOffset);
                            int closingBrace = (openingBrace < 0) ? -1 : fileContentWithSemicolon.indexOf("'", openingBrace);
                            //替换本地版本号
                            document.replaceString(openingBrace + 1, closingBrace, versionString);
                        }
                        PsiDocumentManager.getInstance(project).commitAllDocuments();
                        GradleSyncInvoker.getInstance().requestProjectSync(project, TRIGGER_USER_STALE_CHANGES);
                    }
                }
            }
        };
        WriteCommandAction.runWriteCommandAction(project, runnable);
    }

    public static String interceptString(String srcString, String startSeparator, String endSeparator) {
        int start = srcString.indexOf(startSeparator);
        int end = srcString.lastIndexOf(endSeparator);
        return srcString.substring(start + 1, end);
    }
}

相关文章

网友评论

    本文标题:Intellij IDEA 插件开发——修改AS工程中的配置文件

    本文链接:https://www.haomeiwen.com/subject/bhfcahtx.html