一.修改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);
}
}