package com.antfortune.freeline.idea.utils; import com.intellij.openapi.project.Project; import com.antfortune.freeline.idea.models.GradleSyncHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by pengwei on 2016/11/25. */ public class GradleSyncUtil { /** * 获取GradleSyncListener * android studio 2.3 GradleSyncListener类换包名了 * * @return */ private static Object getGradleSyncAdapter(GradleSyncHandler mHandler) { Class<?> adapter = null; Class<?> listener = null; try { adapter = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncListener$Adapter"); listener = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncListener"); } catch (ClassNotFoundException e) { try { adapter = Class.forName("com.android.tools.idea.gradle.project.GradleSyncListener$Adapter"); listener = Class.forName("com.android.tools.idea.gradle.project.GradleSyncListener"); } catch (ClassNotFoundException e1) { } } if (adapter != null && listener != null) { Object mObj = Proxy.newProxyInstance(GradleSyncUtil.class.getClassLoader(), new Class[]{listener}, mHandler); System.out.println("Proxy=" + mObj); try { Method successMethod = listener.getDeclaredMethod("syncSucceeded", new Class[]{Project.class}); Method failureMethod = listener.getDeclaredMethod("syncFailed", new Class[]{Project.class, String.class}); Object result = adapter.newInstance(); successMethod.invoke(result, new Object[]{mObj}); failureMethod.invoke(result, new Object[]{mObj}); return result; } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return null; } /** * 同步gradle * android studio 2.3之前用GradleProjectImporter.getInstance().requestProjectSync(project, listener) * android studio 2.3后用GradleSyncInvoker.getInstance().requestProjectSync(project, null, listener); * @param project * @param mHandler */ @Deprecated public static void startSync(Project project, GradleSyncHandler mHandler) { if (mHandler == null) { LogUtil.d("GradleSyncHandler == null"); return; } Object adapter = getGradleSyncAdapter(mHandler); if (adapter == null) { LogUtil.d("getGradleSyncAdapter() return == null"); return; } try { Class<?> syncClass = Class.forName("com.android.tools.idea.gradle.project.sync.GradleSyncInvoker"); if (syncClass != null) { Method instance = syncClass.getMethod("getInstance", null); Object value = instance.invoke(null); Method syncMethod = syncClass.getMethod("requestProjectSyncAndSourceGeneration", new Class[]{Project.class, adapter.getClass()}); syncMethod.invoke(value, project, adapter); } } catch (ClassNotFoundException e) { startSyncForOldVersion(project, adapter); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 支持旧版本startSync * @param project * @param adapter */ private static void startSyncForOldVersion(Project project, Object adapter) { try { Class<?> syncClass = Class.forName("com.android.tools.idea.gradle.project.GradleProjectImporter"); if (syncClass != null) { Method instance = syncClass.getMethod("getInstance", null); Object value = instance.invoke(null); Method syncMethod = syncClass.getMethod("requestProjectSync", new Class[]{Project.class, adapter.getClass()}); syncMethod.invoke(value, project, adapter); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }