用Groovy写一款Android Studio插件

用 Groovy 写一款 Android Studio 插件

本插件由 Intellij-Idea 编写, 目的是快速获取当前手机正在运行的进程.

效果


功能介绍

  • 动态获取已连接的 Android 设备
  • 支持刷新进程信息
  • 如果 Android 设备已 Root, 则可 kill 该进程
  • 支持列表信息动态过滤

目录结构

用Groovy写一款Android Studio插件_第1张图片

代码实现

plugin.xml
<extensions defaultExtensionNs="com.intellij">
    
    <toolWindow canCloseContents="false" anchor="bottom"
        id="ProcessViewer" icon="/icons/icon_logo_13x13.png"
        factoryClass="com.shenhua.idea.plugin.processviewer.ui.ProcessViewer"/>
extensions>

<project-components>
    <component>
        <implementation-class>com.shenhua.idea.plugin.processviewer.ui.ContentComponentimplementation-class>
    component>
project-components>

AdbHelper.groovy

import com.android.ddmlib.AndroidDebugBridge
import com.android.tools.idea.ddms.adb.AdbService
import com.google.common.util.concurrent.FutureCallback
import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture
import com.intellij.openapi.project.Project
import com.intellij.ui.components.JBLoadingPanel

import com.shenhua.idea.plugin.processviewer.bean.Process
import org.jetbrains.android.sdk.AndroidSdkUtils
import org.jetbrains.annotations.NotNull

/**
 * Created by shenhua on 2017/11/25.
 * Email [email protected]
 *
 * @author shenhua
 */
class AdbHelper {

    AdbHelper() {
    }

    synchronized void loadingAdb(@NotNull Project project) {
        File adb = AndroidSdkUtils.getAdb(project)
        if (adb == null) {
            println("Adb file is null")
        } else {
            println("Adb file is " + adb.getAbsolutePath())
            ListenableFuture future = AdbService.getInstance().getDebugBridge(adb)
            Futures.addCallback(future, new FutureCallback() {
                @Override
                void onSuccess(AndroidDebugBridge androidDebugBridge) {
                    println("Successfully obtained debug bridge")
                }

                @Override
                void onFailure(Throwable throwable) {
                }
            })
        }
    }

    synchronized void loadingAdb(@NotNull Project project, JBLoadingPanel loadingPanel) {
        File adb = AndroidSdkUtils.getAdb(project)
        if (adb == null) {
            println("Adb file is null")
        } else {
            loadingPanel.setLoadingText("Initializing ADB")
            loadingPanel.startLoading()
            println("Adb file is " + adb.getAbsolutePath())
            ListenableFuture future = AdbService.getInstance().getDebugBridge(adb)
            Futures.addCallback(future, new FutureCallback() {
                @Override
                void onSuccess(AndroidDebugBridge androidDebugBridge) {
                    println("Successfully obtained debug bridge")
                    loadingPanel.stopLoading()
                }

                @Override
                void onFailure(Throwable throwable) {
                    loadingPanel.stopLoading()
                }
            })
        }
    }

    static boolean isInstalled() {
        // TODO ClassCastException: com.android.tools.idea.sdk.AndroidSdks cannot be cast to com.android.tools.idea.sdk.AndroidSdks
        AndroidSdkUtils.isAndroidSdkAvailable()
    }

    void killProcess(Project project, String deviceId, String pid) {
        CommandLine commandLine = new CommandLine()
        DeviceAdbParser adbParser = new DeviceAdbParser()
        String adbOutput = commandLine.executeShellCommand(getAdbCommand(project) + " -s ${deviceId} shell kill ${pid}")
        println(adbOutput)
    }

    ArrayList getProcess(Project project, String deviceId) {
        CommandLine commandLine = new CommandLine()
        DeviceAdbParser adbParser = new DeviceAdbParser()
        String adbOutput = commandLine.executeShellCommand(getAdbCommand(project) + " -s ${deviceId} shell ps")
        adbParser.parseProcessList(adbOutput)
    }

    private synchronized String getAdbCommand(Project project) {
        File adbFile = AndroidSdkUtils.getAdb(project)
        if (adbFile != null)
            "${adbFile.getAbsolutePath()}"
        else
            "adb"
    }
}

第三方库

android.jar
common.jar
sdk-tools.jar
sdklib.jar

注意事项

  • 以上 jar 包存放在 android-studio 安装目录 plugins\android\lib 下.
  • 在使用 Intellij-Idea 导入项目时应该对以上 jar 正确引入.
  • 调试运行时会打开新的 Intellij-Idea 项目, 请确认该项目是 Android 项目.

有待继续开发

  • 查看进程详细信息和关联进程信息

欢迎star 或者 fork项目: github地址

你可能感兴趣的:(插件开发)