From f85778903b327b01aa1acaa8e548863602ec7bd3 Mon Sep 17 00:00:00 2001 From: Photons Date: Fri, 13 Jun 2025 11:53:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=ACAndroidStudio=E5=8F=8Agradle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- .idea/compiler.xml | 22 ----------- .idea/copyright/profiles_settings.xml | 3 -- .idea/gradle.xml | 20 ---------- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 12 +++--- open.netease.com/build.gradle | 19 +++++----- .../open/libpoco/ExampleInstrumentedTest.java | 5 ++- open.netease.com/src/main/AndroidManifest.xml | 4 +- .../netease/open/libpoco/ExampleUnitTest.java | 5 ++- pocoservice/build.gradle | 37 +++++++++---------- pocoservice/src/main/AndroidManifest.xml | 5 +-- .../InstrumentedTestAsLauncher.java | 4 +- .../pocoservice/ServerForHierarchyViewer.java | 3 +- .../open/pocoservice/TestActivity.java | 8 +++- 15 files changed, 54 insertions(+), 98 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/gradle.xml diff --git a/.gitignore b/.gitignore index 0b7b04c..c791342 100644 --- a/.gitignore +++ b/.gitignore @@ -86,4 +86,5 @@ lint/tmp/ # lint/reports/ # Android Profiling -*.hprof \ No newline at end of file +*.hprof +.idea diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 96cc43e..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 277e79f..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7d34715..a5702ba 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools.build:gradle:8.8.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 30bcc37..9ca160b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jul 09 16:28:06 CST 2021 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +#Wed Jun 11 11:21:45 CST 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/open.netease.com/build.gradle b/open.netease.com/build.gradle index 2de3370..6601154 100644 --- a/open.netease.com/build.gradle +++ b/open.netease.com/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 24 - buildToolsVersion "26.0.1" + compileSdk 35 + namespace "com.netease.open.pocoservice" defaultConfig { - minSdkVersion 19 - targetSdkVersion 29 + minSdkVersion 21 + targetSdkVersion 35 versionCode 1 versionName "1.0" @@ -22,10 +22,9 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile 'com.android.support:appcompat-v7:24.+' - testCompile 'junit:junit:4.12' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.test:monitor:1.7.2' + implementation 'androidx.test.uiautomator:uiautomator:2.3.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1') } diff --git a/open.netease.com/src/androidTest/java/com/netease/open/libpoco/ExampleInstrumentedTest.java b/open.netease.com/src/androidTest/java/com/netease/open/libpoco/ExampleInstrumentedTest.java index 56f8271..d8e9359 100644 --- a/open.netease.com/src/androidTest/java/com/netease/open/libpoco/ExampleInstrumentedTest.java +++ b/open.netease.com/src/androidTest/java/com/netease/open/libpoco/ExampleInstrumentedTest.java @@ -1,14 +1,15 @@ package com.netease.open.libpoco; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + /** * Instrumentation test, which will execute on an Android device. * diff --git a/open.netease.com/src/main/AndroidManifest.xml b/open.netease.com/src/main/AndroidManifest.xml index 0408b75..9912c54 100644 --- a/open.netease.com/src/main/AndroidManifest.xml +++ b/open.netease.com/src/main/AndroidManifest.xml @@ -1,6 +1,4 @@ - + diff --git a/open.netease.com/src/test/java/com/netease/open/libpoco/ExampleUnitTest.java b/open.netease.com/src/test/java/com/netease/open/libpoco/ExampleUnitTest.java index a51a3a6..052559d 100644 --- a/open.netease.com/src/test/java/com/netease/open/libpoco/ExampleUnitTest.java +++ b/open.netease.com/src/test/java/com/netease/open/libpoco/ExampleUnitTest.java @@ -1,8 +1,9 @@ package com.netease.open.libpoco; -import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; /** * Example local unit test, which will execute on the development machine (host). diff --git a/pocoservice/build.gradle b/pocoservice/build.gradle index 16d2c90..2dd90f4 100644 --- a/pocoservice/build.gradle +++ b/pocoservice/build.gradle @@ -4,12 +4,12 @@ android { def cmd = 'git rev-list HEAD --count' def gitVersion = cmd.execute().text.trim().toInteger() - compileSdkVersion 28 - buildToolsVersion "25.0.3" + compileSdk 35 + namespace "com.netease.open.pocoservice" defaultConfig { applicationId "com.netease.open.pocoservice" - minSdkVersion 19 - targetSdkVersion 29 + minSdkVersion 21 + targetSdkVersion 35 versionCode gitVersion versionName "1.0.0." + gitVersion testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -26,20 +26,17 @@ android { } dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - implementation 'androidx.test.uiautomator:uiautomator:2.2.0' - compile 'com.google.guava:guava:20.0' - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:25.3.1' - testCompile 'junit:junit:4.12' - compile 'com.nanohttpd:nanohttpd-webserver:2.2.0' - compile 'com.android.support:support-annotations:25.3.1' - compile 'com.android.support.test:runner:0.5' - compile 'com.android.support.test:rules:0.5' - compile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' - compile 'org.apache.commons:commons-lang3:3.5' - compile project(':open.netease.com') + testImplementation 'junit:junit:4.13.2' + implementation 'androidx.test.uiautomator:uiautomator:2.3.0' + implementation 'com.google.guava:guava:27.0.1-android' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'androidx.appcompat:appcompat:1.7.1' + implementation 'androidx.test:monitor:1.7.2' + + implementation 'androidx.test.ext:junit:1.2.1' + implementation 'androidx.test.espresso:espresso-core:3.6.1' + + implementation 'com.nanohttpd:nanohttpd-webserver:2.2.0' + implementation 'org.apache.commons:commons-lang3:3.5' + implementation project(':open.netease.com') } diff --git a/pocoservice/src/main/AndroidManifest.xml b/pocoservice/src/main/AndroidManifest.xml index 6f10008..5341d1a 100644 --- a/pocoservice/src/main/AndroidManifest.xml +++ b/pocoservice/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + @@ -21,7 +20,7 @@ android:supportsRtl="true" android:theme="@style/AppTheme" android:persistent="true" > - + diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java b/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java index e0de6c5..4d70e78 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java @@ -4,19 +4,19 @@ import android.app.UiAutomation; import android.content.Context; import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.uiautomator.UiObject; import android.view.accessibility.AccessibilityNodeInfo; import com.netease.open.hrpc.backend.RpcServer; + import org.junit.Test; import org.junit.runner.RunWith; import java.util.HashMap; import java.util.LinkedList; -import static org.junit.Assert.assertEquals; /** * Instrumentation test, which will execute on an Android device. diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java b/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java index 6d42603..2352560 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java @@ -4,10 +4,11 @@ import android.annotation.SuppressLint; import android.app.UiAutomation; import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.uiautomator.UiDevice; import android.util.Log; import android.view.accessibility.AccessibilityEvent; -import androidx.test.InstrumentationRegistry; import com.netease.open.libpoco.sdk.AbstractNode; import com.netease.open.libpoco.sdk.IScreen; diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java b/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java index bbc6850..6aa7a6f 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java @@ -6,16 +6,20 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; +//import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; + +import com.netease.open.pocoservice.R; + public class TestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_test); +// setContentView(R.layout.activity_test); } @Override From 3b9cef512806c440a78205fc985521f3b3378f83 Mon Sep 17 00:00:00 2001 From: Photons Date: Fri, 13 Jun 2025 11:58:18 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8Djava=20method=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E7=B1=BB=E5=9E=8B=E5=AE=BD=E5=8C=96=E8=A7=84=E5=88=99?= =?UTF-8?q?=E6=9B=BF=E4=BB=A3=E5=90=8D=E7=A7=B0=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?int=E5=88=B0double=E6=97=A0=E6=B3=95=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open/hrpc/backend/MethodMatcher.java | 143 ++++++++++++++++++ .../netease/open/hrpc/backend/RpcServer.java | 67 ++------ .../com/netease/open/pocoservice/Input.java | 8 +- .../InstrumentedTestAsLauncher.java | 6 +- .../open/pocoservice/PocoUiautomation.java | 5 + .../pocoservice/ServerForHierarchyViewer.java | 3 +- .../open/pocoservice/TestActivity.java | 9 +- 7 files changed, 170 insertions(+), 71 deletions(-) create mode 100644 pocoservice/src/main/java/com/netease/open/hrpc/backend/MethodMatcher.java diff --git a/pocoservice/src/main/java/com/netease/open/hrpc/backend/MethodMatcher.java b/pocoservice/src/main/java/com/netease/open/hrpc/backend/MethodMatcher.java new file mode 100644 index 0000000..a21adef --- /dev/null +++ b/pocoservice/src/main/java/com/netease/open/hrpc/backend/MethodMatcher.java @@ -0,0 +1,143 @@ +package com.netease.open.hrpc.backend; + +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +public class MethodMatcher { + private static final String TAG = "MethodMatcher-CGM"; + // 改进的 primitiveTypeAssignableFrom 方法 + private static boolean primitiveTypeAssignableFrom(Class parType, Class argType) { + // 如果都不是基本类型或包装类,使用 isAssignableFrom + if (!isPrimitiveOrWrapper(parType) && !isPrimitiveOrWrapper(argType)) { + return parType.isAssignableFrom(argType); + } + + // 将包装类转换为对应的基本类型 + parType = unwrap(parType); + argType = unwrap(argType); + + // 如果目标类型不是基本类型,返回 false + if (!parType.isPrimitive()) { + return false; + } + + // 基本类型宽化转换规则 (JLS §5.1.2) + if (parType == double.class) { + return argType == double.class || argType == float.class || argType == long.class || + argType == int.class || argType == short.class || argType == byte.class; + } else if (parType == float.class) { + return argType == float.class || argType == long.class || argType == int.class || + argType == short.class || argType == byte.class; + } else if (parType == long.class) { + return argType == long.class || argType == int.class || argType == short.class || + argType == byte.class; + } else if (parType == int.class) { + return argType == int.class || argType == short.class || argType == byte.class; + } else if (parType == short.class) { + return argType == short.class || argType == byte.class; + } else if (parType == byte.class) { + return argType == byte.class; + } else if (parType == char.class) { + return argType == char.class; + } else if (parType == boolean.class) { + return argType == boolean.class; + } + + return false; + } + + // 判断是否是基本类型或包装类 + private static boolean isPrimitiveOrWrapper(Class type) { + return type.isPrimitive() || + type == Integer.class || type == Double.class || type == Float.class || + type == Long.class || type == Short.class || type == Byte.class || + type == Character.class || type == Boolean.class; + } + + // 将包装类转换为对应的基本类型 + private static Class unwrap(Class type) { + if (type == Integer.class) return int.class; + if (type == Double.class) return double.class; + if (type == Float.class) return float.class; + if (type == Long.class) return long.class; + if (type == Short.class) return short.class; + if (type == Byte.class) return byte.class; + if (type == Character.class) return char.class; + if (type == Boolean.class) return boolean.class; + return type; + } + + // 改进的匹配逻辑 + public static java.lang.reflect.Method findMatchingMethod(List _overloadMethods, + String _overloadMethodName, + List calcArguments) { + java.lang.reflect.Method func = null; + for (java.lang.reflect.Method m : _overloadMethods) { + Class[] paramTypes = m.getParameterTypes(); + if (paramTypes.length == calcArguments.size()) { + boolean matched = true; + Log.d(TAG, "method " + m.getName() + ", paramTypes.length=" + paramTypes.length); + for (int j = 0; j < paramTypes.length; j++) { + Class parType = paramTypes[j]; + Class argType = calcArguments.get(j).getClass(); + // 调试日志,显示每个参数类型和匹配结果 + Log.d(TAG, String.format("Method: %s, Param %d: parType=%s, argType=%s, isAssignableFrom=%b, primitiveAssignable=%b", + _overloadMethodName, j, parType.getSimpleName(), argType.getSimpleName(), + parType.isAssignableFrom(argType), primitiveTypeAssignableFrom(parType, argType))); + // 检查数组类型是否一致 + if (parType.isArray() != argType.isArray()) { + Log.d(TAG, String.format("Method: %s, Param %d: Array type mismatch", _overloadMethodName, j)); + matched = false; + break; + } + // 检查类型兼容性 + if (!parType.isAssignableFrom(argType) && !primitiveTypeAssignableFrom(parType, argType)) { + Log.d(TAG, String.format("Method: %s, Param %d: Type mismatch", _overloadMethodName, j)); + matched = false; + break; + } + } + if (matched) { + func = m; + break; + } + } else { + Log.d(TAG, String.format("Method: %s, Parameter count mismatch: expected=%d, actual=%d", + _overloadMethodName, paramTypes.length, calcArguments.size())); + } + } + _overloadMethods.clear(); + return func; + } + + // 日志标签(根据你的环境定义) + + // 测试代码 + public static void test(String[] args) throws Exception { + // 模拟目标类 + class Inputer { + public void swipe(double x1, double y1, double x2, double y2, double duration) { + System.out.println("Swiping..."); + } + } + + // 模拟 _overloadMethods + List _overloadMethods = new ArrayList<>(); + _overloadMethods.add(Inputer.class.getDeclaredMethod("swipe", double.class, double.class, double.class, double.class, double.class)); + + // 模拟 calcArguments(从 JSON 解析) + List calcArguments = new ArrayList<>(); + calcArguments.add(0.5); // Double + calcArguments.add(0.5555555555555556); // Double + calcArguments.add(0.5); // Double + calcArguments.add(0); // Integer (JSON 解析的 0) + calcArguments.add(2); // Integer (JSON 解析的 2) + + // 测试 + String _overloadMethodName = "swipe"; + java.lang.reflect.Method func = findMatchingMethod(_overloadMethods, _overloadMethodName, calcArguments); + System.out.println("Found method: " + (func != null ? func.getName() : "null")); + } +} \ No newline at end of file diff --git a/pocoservice/src/main/java/com/netease/open/hrpc/backend/RpcServer.java b/pocoservice/src/main/java/com/netease/open/hrpc/backend/RpcServer.java index 401b76f..c7718a5 100644 --- a/pocoservice/src/main/java/com/netease/open/hrpc/backend/RpcServer.java +++ b/pocoservice/src/main/java/com/netease/open/hrpc/backend/RpcServer.java @@ -1,8 +1,11 @@ package com.netease.open.hrpc.backend; +import static com.netease.open.hrpc.backend.MethodMatcher.findMatchingMethod; + import android.annotation.TargetApi; import android.util.JsonReader; import android.util.JsonWriter; +import android.util.Log; import org.apache.commons.lang3.SystemUtils; import org.json.JSONArray; @@ -30,8 +33,9 @@ */ public class RpcServer extends NanoHTTPD { + private static final String TAG = "RpcServer"; - private Map objUriStore_ = new HashMap<>(); + private final Map objUriStore_ = new HashMap<>(); public RpcServer(String hostname, int port) throws IOException { super(hostname, port); @@ -53,7 +57,6 @@ public Response serve(IHTTPSession session) { } catch (JSONException e) { return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, ExceptionUtils.getStackTrace(e)); } - System.out.println(req.toString()); JSONObject resp = this.onRequest(req); if (resp != null) { return newFixedLengthResponse(Response.Status.OK, "application/json; charset=utf-8", resp.toString()); @@ -62,13 +65,13 @@ public Response serve(IHTTPSession session) { } } - @TargetApi(19) public JSONObject onRequest(JSONObject req) { JSONObject resp = null; String sessionId = null; String reqId = null; String uri = null; JSONArray method = null; + Log.d(TAG, "req = " + req); try { sessionId = req.getString("session_id"); reqId = req.getString("id"); @@ -101,9 +104,6 @@ public JSONObject onRequest(JSONObject req) { _this = obj; String params = operation.getString(1); Class objCls = obj.getClass(); - if (objCls == null) { - return this.buildErrorResponseObjectNotFound(reqId, sessionId, uri); - } for (java.lang.reflect.Method m : objCls.getMethods()) { // 先把所有名字相同的方法都存起来,在调用的时候根据参数类型去选出重载的方法 @@ -138,35 +138,7 @@ public JSONObject onRequest(JSONObject req) { } } - // 根据参数类型选出重载方法 - java.lang.reflect.Method func = null; - for (java.lang.reflect.Method m : _overloadMethods) { - Class[] paramTypes = m.getParameterTypes(); - if (paramTypes.length == calcArguments.size()) { - boolean matched = true; -// System.out.println(m); - for (int j = 0; j < paramTypes.length; j++) { - Class parType = paramTypes[j]; - Class argType = calcArguments.get(j).getClass(); - // 下面这行用来调试重载函数参数匹配 - // ystem.out.println(String.format("%s | %s | %s | %s | %s", _overloadMethodName, parType, argType, parType.isAssignableFrom(argType), primitiveTypeAssignableFrom(parType, argType))); - if (parType.isArray() != argType.isArray()) { - matched = false; - break; - } - if (!parType.isAssignableFrom(argType) && !primitiveTypeAssignableFrom(parType, argType)) { - matched = false; - break; - } - } - if (matched) { - func = m; - break; - } - } - } - _overloadMethods.clear(); - + java.lang.reflect.Method func = findMatchingMethod(_overloadMethods, _overloadMethodName, calcArguments); if (func != null) { obj = func.invoke(_this, calcArguments.toArray()); } else { @@ -201,10 +173,6 @@ public JSONObject onRequest(JSONObject req) { } else if (operator.equals("=")) { Class objCls = obj.getClass(); - if (objCls == null) { - resp = this.buildErrorResponse(reqId, sessionId, "RuntimeError", String.format("Cannot retrieve class of RPC object. uri=\"%s\"", uri), "", ""); - return resp; - } JSONArray params = operation.getJSONArray(1); String fieldName = params.getString(0); @@ -215,10 +183,6 @@ public JSONObject onRequest(JSONObject req) { } else if (operator.equals("=uri")) { Class objCls = obj.getClass(); - if (objCls == null) { - resp = this.buildErrorResponse(reqId, sessionId, "RuntimeError", String.format("Cannot retrieve class of RPC object. uri=\"%s\"", uri), "", ""); - return resp; - } JSONArray params = operation.getJSONArray(1); String fieldName = params.getString(0); @@ -262,22 +226,9 @@ public JSONObject onRequest(JSONObject req) { resp = this.buildErrorResponse(reqId, sessionId, cause.getClass().getName(), cause.getMessage(), "", ExceptionUtils.getStackTrace(cause)); } - return resp; - } + Log.d(TAG, "resp = " + resp); - private static boolean primitiveTypeAssignableFrom(Class parType, Class argType) { - if (parType.isPrimitive() || argType.isPrimitive()) { - String[] parTypeNameArray = parType.getName().toLowerCase().split(Pattern.quote(".")); - String[] argTypeNameArray = argType.getName().toLowerCase().split(Pattern.quote(".")); - String parTypeName = parTypeNameArray[parTypeNameArray.length - 1]; - String argTypeName = argTypeNameArray[argTypeNameArray.length - 1]; - if (parTypeName.length() < argTypeName.length()) { - return argTypeName.startsWith(parTypeName); - } else { - return parTypeName.startsWith(argTypeName); - } - } - return false; + return resp; } private JSONObject buildResponse(String id, String sessionId, Object result, String uri) { diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/Input.java b/pocoservice/src/main/java/com/netease/open/pocoservice/Input.java index 2b624d3..5b5eafd 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/Input.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/Input.java @@ -23,7 +23,7 @@ */ public class Input implements IInput { - private static final String TAG = Input.class.getName(); + private static final String TAG = "Input"; private Context context; private UiAutomationConnection uiConnn = null; @@ -35,6 +35,7 @@ public Input(Context context, UiAutomationConnection uiConnn) { @Override public void keyevent(int keycode) { + Log.d(TAG, "keyevent " + keycode); UiAutomation uiauto = this.uiConnn.get(); uiauto.injectInputEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode), true); uiauto.injectInputEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode), true); @@ -42,6 +43,7 @@ public void keyevent(int keycode) { @Override public void click(double x, double y) { + Log.d(TAG, "click x=" + x + ", y=" + y); down(x, y); up(x, y); } @@ -53,6 +55,7 @@ public void longClick(double x, double y) { @Override public void longClick(double x, double y, double duration) { + Log.d(TAG, "longClick x=" + x + ", y=" + y + ", duration=" + duration); // duration: 单位秒 down(x, y); SystemClock.sleep((long) (duration * 1000)); @@ -62,6 +65,7 @@ public void longClick(double x, double y, double duration) { @Override public void swipe(double x1, double y1, double x2, double y2, double duration) { + Log.d(TAG, "swipe x1=" + x1 + ", y1=" + y1 + ", x2=" + x2 + ", y2=" + y2 + ", duration=" + duration); final int interval = 25; int steps = (int) (duration * 1000 / interval + 1); double dx = (x2 - x1) / steps; @@ -82,6 +86,7 @@ public void applyMotionEvents(JSONArray events) throws JSONException { int w = size[0]; int h = size[1]; + Log.d(TAG, "applyMotionEvents: " + events.toString()); SparseArray pps = new SparseArray<>(5); SparseArray pcs = new SparseArray<>(5); @@ -309,6 +314,7 @@ private boolean performMultiPointerGesture(MotionEvent.PointerCoords[] ... touch throw new IllegalArgumentException("Must provide coordinates for at least 2 pointers"); } + Log.d(TAG, "performMultiPointerGesture"); // Get the pointer with the max steps to inject. int maxSteps = 0; for (int x = 0; x < touches.length; x++) diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java b/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java index 4d70e78..092e392 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/InstrumentedTestAsLauncher.java @@ -3,8 +3,8 @@ import android.app.Instrumentation; import android.app.UiAutomation; import android.content.Context; -import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.uiautomator.UiObject; import android.view.accessibility.AccessibilityNodeInfo; @@ -31,9 +31,9 @@ public class InstrumentedTestAsLauncher { public void launch() throws Exception { Instrumentation ins = InstrumentationRegistry.getInstrumentation(); UiAutomationConnection uiConn = new UiAutomationConnection(ins); - Context context = InstrumentationRegistry.getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - new ServerForHierarchyViewer(InstrumentationRegistry.getTargetContext(), uiConn); + new ServerForHierarchyViewer(context, uiConn); RpcServer rpc = new RpcServer("0.0.0.0", 10081); rpc.export("poco-uiautomation-framework", new PocoUiautomation(context, uiConn)); diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/PocoUiautomation.java b/pocoservice/src/main/java/com/netease/open/pocoservice/PocoUiautomation.java index 1b40076..ff8464f 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/PocoUiautomation.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/PocoUiautomation.java @@ -3,6 +3,7 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.app.UiAutomation; import android.content.Context; +import android.util.Log; import android.view.accessibility.AccessibilityEvent; import com.netease.open.libpoco.sdk.IPocoUiautomation; @@ -19,6 +20,7 @@ */ public class PocoUiautomation implements IPocoUiautomation { + private static final String TAG = "PocoUiautomation"; private Context context = null; private UiAutomationConnection uiConn = null; @@ -50,10 +52,13 @@ public PocoUiautomation(Context context, UiAutomationConnection uiConn) { AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS | AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS; uiauto.setServiceInfo(accessibilityServiceInfo); + + Log.d(TAG, "PocoUiautomation"); } public boolean uiAutomationConnected() { try { + Log.d(TAG, "uiAutomationConnected"); this.uiConn.get().getRootInActiveWindow(); return true; } catch (IllegalStateException e) { diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java b/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java index 2352560..c2bff2f 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/ServerForHierarchyViewer.java @@ -28,7 +28,7 @@ @SuppressLint("NewApi") public class ServerForHierarchyViewer extends NanoHTTPD { - private static final String TAG = ServerForHierarchyViewer.class.getName(); + private static final String TAG = "ServerForHierarchyViewer"; private Context context; private UiAutomationConnection uiConn; @@ -70,6 +70,7 @@ public Response serve(IHTTPSession session) { String path = session.getUri(); String ret = "- empty -"; String mimeType = NanoHTTPD.MIME_PLAINTEXT; + Log.i(TAG, "server serve " + path); switch (path) { case "/uiautomation/connectionState": diff --git a/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java b/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java index 6aa7a6f..627bfc6 100644 --- a/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java +++ b/pocoservice/src/main/java/com/netease/open/pocoservice/TestActivity.java @@ -1,24 +1,17 @@ package com.netease.open.pocoservice; -import android.content.ComponentName; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.os.Bundle; -//import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; -import com.netease.open.pocoservice.R; - public class TestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.i("PocoService", "onCreate"); // setContentView(R.layout.activity_test); }