diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index e848dc7c..dadaef71 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -3,7 +3,8 @@ "v6.6.2": { "released_date": "2025/01/02", "improvement": [ - "精简打包应用模板 APK 文件大小" + "精简打包应用模板 APK 文件大小", + "打包页面支持 Pinyin 库选项" ] }, "v6.6.1": { diff --git a/app/src/main/java/org/autojs/autojs/apkbuilder/ApkBuilder.kt b/app/src/main/java/org/autojs/autojs/apkbuilder/ApkBuilder.kt index a971b51c..8bb8a4b7 100644 --- a/app/src/main/java/org/autojs/autojs/apkbuilder/ApkBuilder.kt +++ b/app/src/main/java/org/autojs/autojs/apkbuilder/ApkBuilder.kt @@ -55,9 +55,9 @@ open class ApkBuilder(apkInputStream: InputStream?, private val outApkFile: File private val mAssetManager: AssetManager by lazy { globalContext.assets } - private var mLibsIncludes = Libs.DEFALUT_INCLUDES.toMutableList() - private var mAssetsFileIncludes = Assets.File.DEFAULT_INCLUDES.toMutableList() - private var mAssetsDirExcludes = Assets.Dir.DEFAULT_EXCLUDES.toMutableList() + private var mLibsIncludes = Libs.defaultLibsToInclude.toMutableList() + private var mAssetsFileIncludes = Libs.defaultAssetFilesToInclude.toMutableList() + private var mAssetsDirExcludes = Libs.defaultAssetDirsToExclude.toMutableList() private val mManifestFile get() = File(workspacePath, "AndroidManifest.xml") @@ -184,29 +184,12 @@ open class ApkBuilder(apkInputStream: InputStream?, private val outApkFile: File projectConfig.run { mKey = MD5Utils.md5(packageName + versionName + mainScriptFile) mInitVector = MD5Utils.md5(buildInfo.buildId + name).substring(0, 16) - if (appConfig.libs.contains(Constants.OPENCV)) { - mLibsIncludes += Libs.OPENCV.toSet() - mAssetsDirExcludes -= Assets.Dir.OPENCV.toSet() - } - if (appConfig.libs.contains(Constants.MLKIT_OCR)) { - mLibsIncludes += Libs.MLKIT_GOOGLE_OCR.toSet() - mAssetsDirExcludes -= Assets.Dir.MLKIT_GOOGLE_OCR.toSet() - } - if (appConfig.libs.contains(Constants.PADDLE_OCR)) { - mLibsIncludes += Libs.PADDLE_LITE.toSet() + Libs.PADDLE_LITE_EXT.toSet() - mAssetsDirExcludes -= Assets.Dir.PADDLE_LITE.toSet() - } - if (appConfig.libs.contains(Constants.MLKIT_BARCODE)) { - mLibsIncludes += Libs.MLKIT_BARCODE.toSet() - mAssetsDirExcludes -= Assets.Dir.MLKIT_BARCODE.toSet() - } - if (appConfig.libs.contains(Constants.RAPID_OCR)) { - mLibsIncludes += Libs.RAPID_OCR.toSet() - mAssetsDirExcludes -= Assets.Dir.RAPID_OCR.toSet() - } - if (appConfig.libs.contains(Constants.OPENCC)) { - mLibsIncludes += Libs.OPENCC.toSet() - mAssetsDirExcludes -= Assets.Dir.OPENCC.toSet() + Libs.entries.forEach { entry -> + if (appConfig.libs.contains(entry.label)) { + mLibsIncludes += entry.libsToInclude.toSet() + mAssetsFileIncludes += entry.assetFilesToInclude.toSet() + mAssetsDirExcludes -= entry.assetDirsToExclude.toSet() + } } } } @@ -478,119 +461,126 @@ open class ApkBuilder(apkInputStream: InputStream?, private val outApkFile: File } - @Suppress("SpellCheckingInspection") - object Libs { + enum class Libs( + @JvmField val label: String, + @JvmField val aliases: List = emptyList(), + @JvmField val enumerable: Boolean = true, + internal val libsToInclude: List = emptyList(), + internal val assetFilesToInclude: List = emptyList(), + internal val assetDirsToExclude: List = emptyList(), + ) { - private val BASIC = listOf( - "libjackpal-androidterm5.so", /* Terminal Emulator. */ - "libjackpal-termexec2.so", /* Terminal Emulator. */ - ) + TERMINAL_EMULATOR( + label = "Terminal Emulator", + enumerable = false, + libsToInclude = listOf( + "libjackpal-androidterm5.so", + "libjackpal-termexec2.so", + ), + ), - private val MISCELLANEOUS = emptyList() - - @JvmField - val OPENCV = listOf( + OPENCV( + label = "OpenCV", + aliases = listOf("cv"), + libsToInclude = listOf( "libc++_shared.so", "libopencv_java4.so", - ) + ), + ), - @JvmField - val MLKIT_GOOGLE_OCR = listOf( + MLKIT_OCR( + label = "MLKit OCR", + aliases = listOf("mlkit", "mlkitocr", "mlkit-ocr", "mlkit_ocr"), + libsToInclude = listOf( "libmlkit_google_ocr_pipeline.so", - ) + ), + assetDirsToExclude = listOf( + "mlkit-google-ocr-models", + ), + ), - @JvmField - val PADDLE_LITE = listOf( + PADDLE_OCR( + label = "Paddle OCR", + aliases = listOf("paddle", "paddleocr", "paddle-ocr", "paddle_ocr"), + libsToInclude = listOf( "libc++_shared.so", "libpaddle_light_api_shared.so", "libNative.so", - ) - - val PADDLE_LITE_EXT = listOf( "libhiai.so", "libhiai_ir.so", "libhiai_ir_build.so", + ), + assetDirsToExclude = listOf( + "models", ) + ), - @JvmField - val MLKIT_BARCODE = emptyList() - - @JvmField - val RAPID_OCR = listOf( + RAPID_OCR( + label = "Rapid OCR", + aliases = listOf("rapid", "rapidocr", "rapid-ocr", "rapid_ocr"), + libsToInclude = listOf( "libRapidOcr.so", - ) + ), + assetDirsToExclude = listOf( + "labels", + ), + ), - @JvmField - val OPENCC = listOf( + OPENCC( + label = "OpenCC", + aliases = listOf("cc"), + libsToInclude = listOf( "libChineseConverter.so", - ) + ), + assetDirsToExclude = listOf( + "openccdata", + ), + ), - val DEFALUT_INCLUDES: List = (BASIC + MISCELLANEOUS).distinct() + PINYIN( + label = "Pinyin", + aliases = listOf("pin"), + assetFilesToInclude = listOf( + "dict-chinese-words.db.gzip", + "dict-chinese-phrases.db.gzip", + "dict-chinese-chars.db.gzip", + "prob_emit.txt", + ), + ), - @JvmStatic - fun ensure(name: String, libNameList: List) { + MLKIT_BARCODE( + label = "MLKit Barcode", + aliases = listOf("barcode", "mlkit-barcode", "mlkit_barcode"), + assetDirsToExclude = listOf( + "mlkit_barcode_models", + ), + ); + + fun ensureLibFiles(moduleName: String = label) { if (!BuildConfig.isInrt) return val nativeLibraryDir = File(globalContext.applicationInfo.nativeLibraryDir) val primaryNativeLibraries = nativeLibraryDir.list()?.toList() ?: emptyList() - if (!primaryNativeLibraries.containsAll(libNameList)) { - throw Exception(globalContext.getString(R.string.error_module_does_not_work_due_to_the_lack_of_necessary_library_files, name)) + if (!primaryNativeLibraries.containsAll(libsToInclude)) { + throw Exception(globalContext.getString(R.string.error_module_does_not_work_due_to_the_lack_of_necessary_library_files, moduleName)) } } - } + companion object { - @Suppress("SpellCheckingInspection") - object Assets { + val defaultLibsToInclude = listOf( + TERMINAL_EMULATOR, + ).flatMap { it.libsToInclude } - object File { - - private val BASIC = listOf( - "init.js", "roboto_medium.ttf" + val defaultAssetFilesToInclude = listOf( + "init.js", "roboto_medium.ttf", ) - private val MISCELLANEOUS = emptyList() - - val DEFAULT_INCLUDES = (BASIC + MISCELLANEOUS).distinct() + val defaultAssetDirsToExclude = listOf( + "doc", "docs", "editor", "indices", "js-beautify", "sample", "stored-locales", + ) + Libs.entries.flatMap { it.assetDirsToExclude } } - object Dir { - - private val BASIC = listOf("doc", "docs", "editor", "indices", "js-beautify", "sample") - - private val MISCELLANEOUS = listOf("stored-locales") - - @JvmField - val OPENCV = emptyList() - - @JvmField - val MLKIT_GOOGLE_OCR = listOf("mlkit-google-ocr-models") - - @JvmField - val MLKIT_BARCODE = listOf("mlkit_barcode_models") - - @JvmField - val PADDLE_LITE = listOf("models") - - @JvmField - val RAPID_OCR = listOf("labels") - - @JvmField - val OPENCC = listOf("openccdata") - - val DEFAULT_EXCLUDES = (BASIC + MLKIT_GOOGLE_OCR + MLKIT_BARCODE + PADDLE_LITE + RAPID_OCR + OPENCC + MISCELLANEOUS).distinct() - - } - - } - - object Constants { - const val OPENCV = "OpenCV" - const val MLKIT_OCR = "MLKit OCR" - const val PADDLE_OCR = "Paddle OCR" - const val RAPID_OCR = "Rapid OCR" - const val OPENCC = "OpenCC" - const val MLKIT_BARCODE = "MLKit Barcode" } } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrMLKit.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrMLKit.kt index 80a30fe3..cf631049 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrMLKit.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrMLKit.kt @@ -40,7 +40,7 @@ class OcrMLKit(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRun // ! Reserved param `options`. // ! zh-CN: 预留参数 `options`. fun recognizeTextInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, @Suppress("UNUSED_PARAMETER") options: NativeObject): List { - ApkBuilder.Libs.ensure(OcrMode.MLKIT.value, ApkBuilder.Libs.MLKIT_GOOGLE_OCR) + ApkBuilder.Libs.MLKIT_OCR.ensureLibFiles(OcrMode.MLKIT.value) return scriptRuntime.ocrMLKit.recognizeText(image) } @@ -48,7 +48,7 @@ class OcrMLKit(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRun // ! Reserved param `options`. // ! zh-CN: 预留参数 `options`. fun detectInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, @Suppress("UNUSED_PARAMETER") options: NativeObject): List { - ApkBuilder.Libs.ensure(OcrMode.MLKIT.value, ApkBuilder.Libs.MLKIT_GOOGLE_OCR) + ApkBuilder.Libs.MLKIT_OCR.ensureLibFiles(OcrMode.MLKIT.value) return scriptRuntime.ocrMLKit.detect(image) } diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrPaddle.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrPaddle.kt index 4692caa4..11425b3f 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrPaddle.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrPaddle.kt @@ -44,13 +44,13 @@ class OcrPaddle(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRu } fun recognizeTextInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, options: NativeObject): List { - ApkBuilder.Libs.ensure(OcrMode.PADDLE.value, ApkBuilder.Libs.PADDLE_LITE) + ApkBuilder.Libs.PADDLE_OCR.ensureLibFiles(OcrMode.PADDLE.value) val (cpuThreadNum, useSlim) = getOptions(options) return scriptRuntime.ocrPaddle.recognizeText(image, cpuThreadNum, useSlim) } fun detectInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, options: NativeObject): List { - ApkBuilder.Libs.ensure(OcrMode.PADDLE.value, ApkBuilder.Libs.PADDLE_LITE) + ApkBuilder.Libs.PADDLE_OCR.ensureLibFiles(OcrMode.PADDLE.value) val (cpuThreadNum, useSlim) = getOptions(options) return scriptRuntime.ocrPaddle.detect(image, cpuThreadNum, useSlim).map { result -> OcrResult(result.label, result.confidence, result.bounds) diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrRapid.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrRapid.kt index 0878feeb..7bf70496 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrRapid.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrRapid.kt @@ -40,7 +40,7 @@ class OcrRapid(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRun // ! Reserved param `options`. // ! zh-CN: 预留参数 `options`. fun recognizeTextInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, @Suppress("UNUSED_PARAMETER") options: NativeObject): List { - ApkBuilder.Libs.ensure(OcrMode.RAPID.value, ApkBuilder.Libs.RAPID_OCR) + ApkBuilder.Libs.RAPID_OCR.ensureLibFiles(OcrMode.RAPID.value) return scriptRuntime.ocrRapid.recognizeText(image) } @@ -48,7 +48,7 @@ class OcrRapid(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRun // ! Reserved param `options`. // ! zh-CN: 预留参数 `options`. fun detectInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, @Suppress("UNUSED_PARAMETER") options: NativeObject): List { - ApkBuilder.Libs.ensure(OcrMode.RAPID.value, ApkBuilder.Libs.RAPID_OCR) + ApkBuilder.Libs.RAPID_OCR.ensureLibFiles(OcrMode.RAPID.value) return scriptRuntime.ocrRapid.detect(image) } 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 e02a43ca..57f9b4db 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 @@ -12,8 +12,8 @@ import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; -import android.widget.CheckBox; import android.widget.ArrayAdapter; +import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; @@ -22,7 +22,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; - import com.afollestad.materialdialogs.MaterialDialog; import com.google.android.flexbox.FlexboxLayout; import com.google.android.material.textfield.TextInputLayout; @@ -30,6 +29,7 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import org.autojs.autojs.apkbuilder.ApkBuilder; +import org.autojs.autojs.apkbuilder.keystore.KeyStore; import org.autojs.autojs.core.pref.Language; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.script.ScriptFile; @@ -41,10 +41,9 @@ import org.autojs.autojs.runtime.api.augment.pinyin.Pinyin; import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.common.NotAskAgainDialog; import org.autojs.autojs.ui.filechooser.FileChooserDialogBuilder; -import org.autojs.autojs.apkbuilder.keystore.KeyStore; -import org.autojs.autojs.ui.viewmodel.KeyStoreViewModel; import org.autojs.autojs.ui.keystore.ManageKeyStoreActivity; import org.autojs.autojs.ui.shortcut.AppsIconSelectActivity; +import org.autojs.autojs.ui.viewmodel.KeyStoreViewModel; import org.autojs.autojs.ui.widget.RoundCheckboxWithText; import org.autojs.autojs.util.AndroidUtils; import org.autojs.autojs.util.AndroidUtils.Abi; @@ -65,7 +64,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.TreeMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; @@ -102,25 +100,9 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa put(Abi.ARMEABI, /* armeabi */ List.of("armeabi", "arme", "armv5te", "arm5te", "armv5", "v5", "arm5", "5")); }}; - private static final ArrayList SUPPORTED_LIBS = new ArrayList<>() {{ - add(ApkBuilder.Constants.OPENCV); - add(ApkBuilder.Constants.MLKIT_OCR); - add(ApkBuilder.Constants.PADDLE_OCR); - add(ApkBuilder.Constants.RAPID_OCR); - add(ApkBuilder.Constants.OPENCC); - // add(ApkBuilder.Constants.PINYIN); - add(ApkBuilder.Constants.MLKIT_BARCODE); - }}; + private static final ArrayList SUPPORTED_LIBS = new ArrayList<>(); - private static final Map> LIB_ALIASES = new HashMap<>() {{ - put(ApkBuilder.Constants.OPENCV, List.of("cv")); - put(ApkBuilder.Constants.MLKIT_OCR, List.of("mlkit", "mlkitocr", "mlkit-ocr", "mlkit_ocr")); - put(ApkBuilder.Constants.PADDLE_OCR, List.of("paddle", "paddleocr", "paddle-ocr", "paddle_ocr")); - put(ApkBuilder.Constants.RAPID_OCR, List.of("rapid", "rapidocr", "rapid-ocr", "rapid_ocr")); - put(ApkBuilder.Constants.OPENCC, List.of("cc")); - // put(ApkBuilder.Constants.PINYIN, List.of("pin")); - put(ApkBuilder.Constants.MLKIT_BARCODE, List.of("barcode", "mlkit-barcode", "mlkit_barcode")); - }}; + private static final Map> LIB_ALIASES = new HashMap<>(); private static final ArrayList SIGNATURE_SCHEMES = new ArrayList<>() {{ add("V1 + V2"); @@ -209,6 +191,15 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa private KeyStoreViewModel mKeyStoreViewModel; + static { + for (ApkBuilder.Libs entry : ApkBuilder.Libs.getEntries()) { + if (entry.enumerable) { + SUPPORTED_LIBS.add(entry.label); + LIB_ALIASES.put(entry.label, entry.aliases); + } + } + } + @SuppressLint("SetTextI18n") @Override protected void onCreate(@Nullable Bundle savedInstanceState) { diff --git a/jieba-analysis/build.gradle b/jieba-analysis/build.gradle index 4a6bda75..48757589 100644 --- a/jieba-analysis/build.gradle +++ b/jieba-analysis/build.gradle @@ -32,7 +32,7 @@ android { // 主 Java/Kotlin 目录 java.srcDirs = ['src/main/java'] // 将资源文件夹指定为 assets 目录 - assets.srcDirs = ['src/main/resources'] + assets.srcDirs = ['src/main/assets'] } } } diff --git a/jieba-analysis/src/main/resources/dict-chinese-chars.db.gzip b/jieba-analysis/src/main/assets/dict-chinese-chars.db.gzip similarity index 100% rename from jieba-analysis/src/main/resources/dict-chinese-chars.db.gzip rename to jieba-analysis/src/main/assets/dict-chinese-chars.db.gzip diff --git a/jieba-analysis/src/main/resources/dict-chinese-phrases.db.gzip b/jieba-analysis/src/main/assets/dict-chinese-phrases.db.gzip similarity index 100% rename from jieba-analysis/src/main/resources/dict-chinese-phrases.db.gzip rename to jieba-analysis/src/main/assets/dict-chinese-phrases.db.gzip diff --git a/jieba-analysis/src/main/resources/dict-chinese-words.db.gzip b/jieba-analysis/src/main/assets/dict-chinese-words.db.gzip similarity index 100% rename from jieba-analysis/src/main/resources/dict-chinese-words.db.gzip rename to jieba-analysis/src/main/assets/dict-chinese-words.db.gzip diff --git a/jieba-analysis/src/main/resources/prob_emit.txt b/jieba-analysis/src/main/assets/prob_emit.txt similarity index 100% rename from jieba-analysis/src/main/resources/prob_emit.txt rename to jieba-analysis/src/main/assets/prob_emit.txt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt b/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt index f2001b4d..4f8b1dcb 100644 --- a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt +++ b/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt @@ -9,7 +9,7 @@ class JiebaSegmenter(context: Context) { val dictionary by lazy { WordDictionary.getInstance(context) } - private val finalSeg by lazy { FinalSeg.instance } + private val finalSeg by lazy { FinalSeg.getInstance(context) } enum class SegMode { INDEX, SEARCH } diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt b/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt index 77cac792..9c68150c 100644 --- a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt +++ b/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt @@ -1,5 +1,6 @@ package com.huaban.analysis.jieba.viterbi +import android.content.Context import com.huaban.analysis.jieba.CharacterUtil import com.huaban.analysis.jieba.Log import com.huaban.analysis.jieba.Node @@ -11,7 +12,7 @@ import java.nio.charset.Charset import java.util.* class FinalSeg private constructor() { - private fun loadModel() { + private fun loadModel(context: Context) { val s = System.currentTimeMillis() val prevStatus = HashMap().also { prevStatus = it } prevStatus['B'] = charArrayOf('E', 'S') @@ -43,7 +44,8 @@ class FinalSeg private constructor() { transS['S'] = -0.6658631448798212 trans['S'] = transS - val `is` = javaClass.getResourceAsStream(PROB_EMIT)!! + // val `is` = javaClass.getResourceAsStream(PROB_EMIT)!! + val `is` = context.assets.open(PROB_EMIT) try { val br = BufferedReader(InputStreamReader(`is`, Charset.forName("UTF-8"))) val emit = HashMap>().also { emit = it } @@ -181,7 +183,7 @@ class FinalSeg private constructor() { companion object { private var singleInstance: FinalSeg? = null - private const val PROB_EMIT = "/prob_emit.txt" + private const val PROB_EMIT = "prob_emit.txt" private val states = charArrayOf('B', 'M', 'E', 'S') private var emit: MutableMap>? = null private var start: MutableMap? = null @@ -189,13 +191,12 @@ class FinalSeg private constructor() { private var prevStatus: MutableMap? = null private const val MIN_FLOAT = -3.14e100 - @get:Synchronized - val instance: FinalSeg - get() { - if (singleInstance == null) { - singleInstance = FinalSeg().apply { loadModel() } - } - return singleInstance!! + @Synchronized + fun getInstance(context: Context): FinalSeg { + if (singleInstance == null) { + singleInstance = FinalSeg().apply { loadModel(context) } } + return singleInstance!! + } } } diff --git a/version.properties b/version.properties index 67b79127..baf67730 100644 --- a/version.properties +++ b/version.properties @@ -1,5 +1,5 @@ -#Thu Jan 02 18:05:40 CST 2025 -BUILD_TIME=1735812340458 +#Thu Jan 02 21:17:00 CST 2025 +BUILD_TIME=1735823820696 COMPILE_SDK_VERSION=34 JAVA_VERSION=23 JAVA_VERSION_MIN_RADICAL=0 @@ -17,6 +17,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 TARGET_SDK_VERSION=34 TARGET_SDK_VERSION_INRT=29 -VERSION_BUILD=2944 +VERSION_BUILD=2945 VERSION_NAME=6.6.2 Alpha VSCODE_EXT_REQUIRED_VERSION=1.0.8