一.開發環境
由于Android Studio是無法創建idea plugin 項目的,所以需要先安裝IDEA。
-
新建一個Intellij Platform Plugin Project,如果是第一次創建需要點擊new設置Project SDK。
- 在Project的resources/META-INF目錄下有一個plugin.xml文件,這個文件作用是保存插件的所有配置信息,相當于Android 的AndroidManifest.xml文件。
-
在src目錄下新建一個Action:src>右鍵>new>Action:
- Action ID :Action的唯一表示,建議以PluginName.ID的格式命名
- Class Name : Action的類名
- Name : Action顯示在工具欄的名字
- Description : Action的功能描述 不是必須填寫的
-
Groups : 將Action 添加的一個分組,可選的有很多,我這里選擇GenerateGroup,最后就可以在Generate這一組Action中看到:
- Keyboard Shortcuts : 觸發Action的快捷鍵
然后plugin中會自動生成配置信息:
<actions>
<!-- Add your actions here -->
<action id="Test.ID" class="TestAction" text="Test">
<add-to-group group-id="GenerateGroup" anchor="last"/>
<keyboard-shortcut keymap="$default" first-keystroke="shift alt V"/>
</action>
</actions>
4 .actionPerformed方法是程序的入口,從這里開始實現插件的功能,在這里先簡單的彈出一個對話框。
public class TestAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
Messages.showMessageDialog("Hello!", "Information", Messages.getInformationIcon());
}
}
5.點擊Run,然后會重新啟動一個Idea,在這里我們可以測試我們的程序
6.打包插件程序,右鍵工程目錄>Prepare Plugin Module 'Test' For Deployment,然后可以得到一個jar文件,這個jar就是插件的安裝包,idea可以通過Settings>Plugins>Install plugin from disk來安裝插件
7.發布到idea 插件倉庫:
- 首先需要注冊一個帳號https://account.jetbrains.com/login
- 上傳插件https://plugins.jetbrains.com/idea/plugin/add
然后在兩個工作日之后就可以在idea 的插件倉庫搜索到上傳的插件了
二.插件開發一些API
獲取當前編輯的文件
PsiFile psiFile = event.getData(LangDataKeys.PSI_FILE);
可以通過下面兩種方式對文件的進行操作:
new WriteCommandAction.Simple(event.getProject(), psiFile) {
@Override
protected void run() throws Throwable {
//do something
}
}.execute();
WriteCommandAction.runWriteCommandAction(event.getProject(), new Runnable() {
@Override
public void run() {
//do something
}
});
獲取當前編輯的class對象
PsiElement element = psiFile.findElementAt(editor.getCaretModel().getOffset());
PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
獲取類名
String className = psiClass.getNameIdentifier().getText();
獲得PsiElementFactory 對象 可以通過這個工廠類創建成員變量 方法 類等等
PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);
添加一個方法
String methodText = buildMethodText(className);
PsiMethod psiMethod = elementFactory.createMethodFromText(methodText, psiClass);
psiClass.add(psiMethod);
private String buildMethodText (String className){
return "public static " + className + " getInstance() {\n" +
" return " + buildFiledText() + ";\n" +
" }";
}
添加一個構造方法
PsiMethod constructor = elementFactory.createConstructor();
psiClass.add(constructor);
添加一個成員變量,PsiType表示變量的類型,PsiModifierList代表變量的修飾符,可以通過setInitializer設置變量初始化方式
PsiType psiType = PsiType.getTypeByName(className, project
, GlobalSearchScope.EMPTY_SCOPE);
PsiField psiField = elementFactory.createField("mInstance", psiType);
PsiExpression psiInitializer = elementFactory.createExpressionFromText("new " + className + "()", psiField);
psiField.setInitializer(psiInitializer);
PsiModifierList modifierList = psiField.getModifierList();
if (modifierList != null) {
modifierList.setModifierProperty(PsiModifier.STATIC, true);
}
psiClass.add(psiField);
添加一個內部類
PsiClass innerClass = elementFactory.createClass(innerClassName);
PsiModifierList classModifierList = innerClass.getModifierList();
if (classModifierList != null) {
classModifierList.setModifierProperty(PsiModifier.PRIVATE, true);
classModifierList.setModifierProperty(PsiModifier.STATIC, true);
}
psiClass.add(innerClass);
其他
//創建枚舉
PsiClass anEnum = elementFactory.createEnum("TestEnum");
//創建一個枚舉常量
PsiEnumConstant enumConstant= elementFactory.createEnumConstantFromText("TEST",anEnum);
//創建接口
elementFactory.createInterface("TestInterface");
格式化代碼
CodeStyleManager.getInstance(project).reformat(psiClass);
插件的UI都是使用java Swing來實現,比如創建一個Dialog:src>new>Dialog;然后會生成一個JDialog的java類和一個Dialog的from文件。然后在Action中使用:
TestDialog dialog = new TestDialog();
dialog.setBounds(new Rectangle(300, 200));
//讓dialog居中
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
三. 一個生成單例代碼的插件
為了練手,寫了個小插件,可以自動生成五種單例模式(IDEA自帶生成單例代碼的功能,不過只有一種模式):懶漢式,餓漢式,雙重檢查,靜態內部類和枚舉。
在Android Studio或者IDEA中使用:Settings>Plugins>Browse repositories 搜索singleton,如下圖,點擊install 然后重啟Android Studio 或者IDEA就可以使用了。
菜單欄選擇Code>Generate或者使用你設置的快捷鍵:
選擇一種單例模式:
自動生成的代碼: