diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index e06615e5..d2455d68 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -21,6 +21,7 @@ "images 部分相关方法出现异常时 oneShot 标记功能失效的问题 _[`issue #372`](http://issues.autojs6.com/372)_", "images 部分相关方法可能引发内存泄露的问题 _[`issue #372`](http://issues.autojs6.com/372)_", "Android 10 UiObject#child 方法可能出现 ArrayIndexOutOfBoundsException 异常的问题 _[`issue #416`](http://issues.autojs6.com/416)_", + "运行项目时 project.json 配置参数无法正常解析的问题", "打包应用无法正常使用 Paddle OCR 与 Rapid OCR 功能的问题", "版本历史页面部分系统因字体差别导致统计数据显示不完整的问题", "部分设备无法正常初始化 MLKit Google OCR 的问题 (试修) _[`issue #8`](http://issues.autojs6.com/8#issuecomment-3117061768)_", diff --git a/app/src/main/java/org/autojs/autojs/project/ProjectConfig.java b/app/src/main/java/org/autojs/autojs/project/ProjectConfig.java index 507e21bc..c38b6de4 100644 --- a/app/src/main/java/org/autojs/autojs/project/ProjectConfig.java +++ b/app/src/main/java/org/autojs/autojs/project/ProjectConfig.java @@ -170,7 +170,7 @@ public class ProjectConfig { @With(value = "ignoredDirs", target = {"AutoJs4", "AutoX"}), @With(value = "ignore", target = {"Unknown"}), }) - private final List mExcludedDirs = new ArrayList<>(); + private final List mExcludedDirs = new ArrayList<>(); @Nullable private transient String mSourcePath = null; @@ -231,27 +231,27 @@ public class ProjectConfig { LaunchConfig launchConfig = new LaunchConfig(); BuildInfo buildInfo = new BuildInfo(); - Pattern namePattern = Pattern.compile(stringPattern("name")); - Pattern versionNamePattern = Pattern.compile(stringPattern("versionName")); - Pattern versionCodePattern = Pattern.compile(numberPattern("versionCode")); - Pattern packageNamePattern = Pattern.compile(stringPattern("packageName")); - Pattern mainPattern = Pattern.compile(stringPattern("main")); - Pattern iconPattern = Pattern.compile(stringPattern("icon")); + Pattern namePattern = Pattern.compile(stringPattern("name"), Pattern.CASE_INSENSITIVE); + Pattern versionNamePattern = Pattern.compile(stringPattern("versionName"), Pattern.CASE_INSENSITIVE); + Pattern versionCodePattern = Pattern.compile(numberPattern("versionCode"), Pattern.CASE_INSENSITIVE); + Pattern packageNamePattern = Pattern.compile(stringPattern("packageName"), Pattern.CASE_INSENSITIVE); + Pattern mainPattern = Pattern.compile(stringPattern("main"), Pattern.CASE_INSENSITIVE); + Pattern iconPattern = Pattern.compile(stringPattern("icon"), Pattern.CASE_INSENSITIVE); - Pattern assetsPattern = Pattern.compile(listPattern("asset")); - Pattern abisPattern = Pattern.compile(listPattern("abi")); - Pattern libsPattern = Pattern.compile(listPattern("lib")); - Pattern useFeaturesPattern = Pattern.compile(listPattern("useFeature")); + Pattern assetsPattern = Pattern.compile(listPattern("asset"), Pattern.CASE_INSENSITIVE); + Pattern abisPattern = Pattern.compile(listPattern("abi"), Pattern.CASE_INSENSITIVE); + Pattern libsPattern = Pattern.compile(listPattern("lib"), Pattern.CASE_INSENSITIVE); + Pattern useFeaturesPattern = Pattern.compile(listPattern("useFeature"), Pattern.CASE_INSENSITIVE); - Pattern buildTimePattern = Pattern.compile(numberPattern("buildTime")); - Pattern buildNumberPattern = Pattern.compile(numberPattern("buildNumber")); - Pattern buildIdPattern = Pattern.compile(stringPattern("buildId")); + Pattern buildTimePattern = Pattern.compile(numberPattern("buildTime"), Pattern.CASE_INSENSITIVE); + Pattern buildNumberPattern = Pattern.compile(numberPattern("buildNumber"), Pattern.CASE_INSENSITIVE); + Pattern buildIdPattern = Pattern.compile(stringPattern("buildId"), Pattern.CASE_INSENSITIVE); - Pattern launchConfigHideLogsPattern = Pattern.compile(booleanPattern("hideLogs")); - Pattern launchConfigLogsVisiblePattern = Pattern.compile(booleanPattern("logsVisible")); + Pattern launchConfigHideLogsPattern = Pattern.compile(booleanPattern("hideLogs"), Pattern.CASE_INSENSITIVE); + Pattern launchConfigLogsVisiblePattern = Pattern.compile(booleanPattern("logsVisible"), Pattern.CASE_INSENSITIVE); - Pattern launchConfigDisplaySplashPattern = Pattern.compile(booleanPattern("displaySplash")); - Pattern launchConfigSplashVisiblePattern = Pattern.compile(booleanPattern("splashVisible")); + Pattern launchConfigDisplaySplashPattern = Pattern.compile(booleanPattern("displaySplash"), Pattern.CASE_INSENSITIVE); + Pattern launchConfigSplashVisiblePattern = Pattern.compile(booleanPattern("splashVisible"), Pattern.CASE_INSENSITIVE); setFieldIfMatches(namePattern, s, projectConfig::setName); setFieldIfMatches(versionNamePattern, s, projectConfig::setVersionName); @@ -293,7 +293,7 @@ public class ProjectConfig { @NotNull @Language("RegExp") private static String listPattern(String name) { - return "\"" + parseNamePattern(name) + "(s|List)?\"\\s*:\\s*\\[([^\"]*)]"; + return "\"" + parseNamePattern(name) + "(?:s|list)?\"\\s*:\\s*\\[\\s*(\"(?:\\\\.|[^\"\\\\])*\")(?:\\s*,\\s*\"(?:\\\\.|[^\"\\\\])*\")*\\s*]"; } @NotNull @@ -316,7 +316,7 @@ public class ProjectConfig { @NotNull private static String parseNamePattern(String name) { - return Pattern.quote(name.replaceAll("(?<=[a-z])([A-Z]+)", "(?:$1|_$1)")); + return name.replaceAll("(?<=[a-z])([A-Z]+)", "(?:$1|_$1)"); } private static void setFieldIfMatches(Pattern pattern, String s, java.util.function.Consumer setter) { @@ -347,7 +347,12 @@ public class ProjectConfig { if (content == null) { setter.accept(Collections.emptyList()); } else { - List list = Arrays.asList(content.split("\\s*,\\s*")); + List list = Arrays.stream(content.split("\\s*,\\s*")).map(str -> { + if (str.startsWith("\"") && str.endsWith("\"")) { + return str.substring(1, str.length() - 1); + } + return str; + }).collect(Collectors.toList()); setter.accept(list); } } @@ -552,11 +557,24 @@ public class ProjectConfig { // # } public List getExcludedDirs() { - return mExcludedDirs; + return mExcludedDirs.stream().map(dir -> { + if (dir.endsWith("/")) { + dir = dir.substring(0, dir.length() - 1); + } + if (mSourcePath == null) { + throw new IllegalStateException("Source path is not set"); + } + if (dir.startsWith(mSourcePath)) { + return new File(dir); + } + return new File(mSourcePath, dir); + }).distinct().collect(Collectors.toList()); } - public ProjectConfig excludeDir(File dirToExclude) { - mExcludedDirs.add(dirToExclude); + public ProjectConfig excludeDir(String dirToExclude) { + if (!mExcludedDirs.contains(dirToExclude)) { + mExcludedDirs.add(dirToExclude); + } return this; } diff --git a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index 5a2e2c89..85d0ea44 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -932,7 +932,7 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa ProjectConfig projectConfig; if (mProjectConfig != null) { projectConfig = mProjectConfig - .excludeDir(new File(mSource, mProjectConfig.getBuildDir())) + .excludeDir(mProjectConfig.getBuildDir()) .setSourcePath(mSource) .setIconPath(mProjectConfig.getIconPath() == null ? null : new File(mSource, mProjectConfig.getIconPath()).getPath()); } else {