Android 如何从自定义插件';安卓工作室的行动?
我需要为AndroidStudio创建一个自定义插件,并在Android 如何从自定义插件';安卓工作室的行动?,android,kotlin,android-gradle-plugin,android-studio-plugin,Android,Kotlin,Android Gradle Plugin,Android Studio Plugin,我需要为AndroidStudio创建一个自定义插件,并在build.gradle文件中添加依赖项 使用a操作,我已经重写了actionPerformed方法 现在我需要动态添加依赖项,在执行该操作之后,如何添加该依赖项?我已经得到解决方案并应用了相同的解决方案 class GradleManager(private val project: Project) { companion object { const val DEFAULT_MODULE_NAME = "a
build.gradle
文件中添加依赖项
使用a操作
,我已经重写了actionPerformed
方法
现在我需要动态添加依赖项,在执行该操作之后,如何添加该依赖项?我已经得到解决方案并应用了相同的解决方案
class GradleManager(private val project: Project) {
companion object {
const val DEFAULT_MODULE_NAME = "app"
const val IMPLEMENTATION = "implementation"
const val COMPILE = "compile"
const val DEPENDENCIES = "dependencies"
}
private var buildGradle: Document? = null
private var modules = arrayOf<Any>()
private var projectBaseDir: VirtualFile? = null
@Throws(FileNotFoundException::class)
fun initBuildGradle(): Boolean {
getModulesExist()
val gradleVirtualFile: VirtualFile?
gradleVirtualFile = if (modules.size > 1) {
val isHaveAppModule: String? = modules.find { it == DEFAULT_MODULE_NAME } as String
if (isHaveAppModule != null && isHaveAppModule != "") {
projectBaseDir!!
.findChild(isHaveAppModule)!!
.findChild("build.gradle")
} else {
return false
}
} else {
projectBaseDir!!
.findChild(modules[0] as String)!!
.findChild("build.gradle")
}
if (gradleVirtualFile != null) {
buildGradle = FileDocumentManager.getInstance().getDocument(gradleVirtualFile)
}
return true
}
@Throws(FileNotFoundException::class)
private fun getModulesExist() {
val basePath = project.basePath
if (StringUtils.isEmpty(basePath)) {
throw FileNotFoundException("Project base path not found.")
}
projectBaseDir = LocalFileSystem.getInstance().findFileByPath(basePath!!)
if (projectBaseDir == null) {
throw FileNotFoundException("Project base directory not found.")
}
val virtualSettingsGradle = projectBaseDir!!.findChild("settings.gradle")
if (virtualSettingsGradle != null) {
val settingsGradle = FileDocumentManager.getInstance().getDocument(virtualSettingsGradle)
if (settingsGradle != null) {
modules = readSettingsGradle(settingsGradle)
}
} else if (projectBaseDir!!.findChild("build.gradle") == null) {
throw FileNotFoundException("Project doesn't contain any gradle file.")
}
}
fun addDependency(repository: String, actionEvent: AnActionEvent) {
val documentText = buildGradle!!.text.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
val sb = StringBuilder()
var counter = 0
var canSearch = false
for (i in documentText.indices) {
val line = documentText[i]
if (canSearch) {
if (line.contains("{")) {
counter += 1
}
if (line.contains("}")) {
if (counter > 0) {
counter -= 1
} else {
canSearch = false
sb.append("\t$repository").append("\n")
}
}
}
if (line.contains(DEPENDENCIES)) {
val tempLine = line.replace(DEPENDENCIES, "")
if (tempLine.trim().equals("{", true)) {
canSearch = true
} else {
if (!tempLine.trim().isRequiredField()) {
counter = -1
canSearch = true
} else {
if (tempLine.trim().contains("{")
&& !tempLine.trim().contains("//")
&& (tempLine.trim().contains(IMPLEMENTATION) || tempLine.trim().contains(COMPILE))
) {
canSearch = true
}
}
}
}
sb.append(line).append("\n")
}
writeToGradle(sb, actionEvent)
}
private fun writeToGradle(stringBuilder: StringBuilder, actionEvent: AnActionEvent) {
val application = ApplicationManager.getApplication()
application.invokeLater {
application.runWriteAction { buildGradle!!.setText(stringBuilder) }
syncProject(actionEvent)
}
}
private fun syncProject(actionEvent: AnActionEvent) {
val androidSyncAction = getAction("Android.SyncProject")
val refreshAllProjectAction = getAction("ExternalSystem.RefreshAllProjects")
if (androidSyncAction != null && androidSyncAction !is EmptyAction) {
androidSyncAction.actionPerformed(actionEvent)
} else if (refreshAllProjectAction != null && refreshAllProjectAction !is EmptyAction) {
refreshAllProjectAction.actionPerformed(actionEvent)
} else {
SwingUtilities.invokeLater {
Messages.showInfoMessage(
"Project sync failed.",
"SYNC FAILED"
)
}
}
}
private fun getAction(actionId: String): AnAction? {
return ActionManager.getInstance().getAction(actionId)
}
private fun readSettingsGradle(settingsGradle: Document): Array<Any> {
return Stream.of(*settingsGradle.text.split("'".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray())
.filter { s -> s.startsWith(":") }
.map { s -> s.replace(":", "") }
.toArray()
}
private fun String?.isRequiredField(): Boolean {
return this != null && isNotEmpty() && isNotBlank()
}
}
class GradleManager(私人val项目:项目){
伴星{
const val DEFAULT_MODULE_NAME=“app”
const val IMPLEMENTATION=“IMPLEMENTATION”
const val COMPILE=“COMPILE”
const val DEPENDENCIES=“DEPENDENCIES”
}
私有变量buildGradle:文档?=null
private var modules=arrayOf供参考