6.6.2 - Alpha - 打包页面支持 Pinyin 库选项

This commit is contained in:
SuperMonster003
2025-01-02 21:18:26 +08:00
parent 3a3e01264a
commit cf155aca06
14 changed files with 134 additions and 151 deletions

View File

@@ -3,7 +3,8 @@
"v6.6.2": {
"released_date": "2025/01/02",
"improvement": [
"精简打包应用模板 APK 文件大小"
"精简打包应用模板 APK 文件大小",
"打包页面支持 Pinyin 库选项"
]
},
"v6.6.1": {

View File

@@ -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<String> = emptyList(),
@JvmField val enumerable: Boolean = true,
internal val libsToInclude: List<String> = emptyList(),
internal val assetFilesToInclude: List<String> = emptyList(),
internal val assetDirsToExclude: List<String> = 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<String>()
@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<String>()
@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<String> = (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<String>) {
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<String>()
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<String>()
@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"
}
}

View File

@@ -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<String> {
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<OcrResult> {
ApkBuilder.Libs.ensure(OcrMode.MLKIT.value, ApkBuilder.Libs.MLKIT_GOOGLE_OCR)
ApkBuilder.Libs.MLKIT_OCR.ensureLibFiles(OcrMode.MLKIT.value)
return scriptRuntime.ocrMLKit.detect(image)
}

View File

@@ -44,13 +44,13 @@ class OcrPaddle(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRu
}
fun recognizeTextInternal(scriptRuntime: ScriptRuntime, image: ImageWrapper, options: NativeObject): List<String> {
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<OcrResult> {
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)

View File

@@ -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<String> {
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<OcrResult> {
ApkBuilder.Libs.ensure(OcrMode.RAPID.value, ApkBuilder.Libs.RAPID_OCR)
ApkBuilder.Libs.RAPID_OCR.ensureLibFiles(OcrMode.RAPID.value)
return scriptRuntime.ocrRapid.detect(image)
}

View File

@@ -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<String> 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<String> SUPPORTED_LIBS = new ArrayList<>();
private static final Map<String, List<String>> 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<String, List<String>> LIB_ALIASES = new HashMap<>();
private static final ArrayList<String> 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) {

View File

@@ -32,7 +32,7 @@ android {
// 主 Java/Kotlin 目录
java.srcDirs = ['src/main/java']
// 将资源文件夹指定为 assets 目录
assets.srcDirs = ['src/main/resources']
assets.srcDirs = ['src/main/assets']
}
}
}

View File

@@ -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 }

View File

@@ -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<Char, CharArray>().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<Char, Map<Char, Double>>().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<Char, Map<Char, Double>>? = null
private var start: MutableMap<Char, Double>? = null
@@ -189,13 +191,12 @@ class FinalSeg private constructor() {
private var prevStatus: MutableMap<Char, CharArray>? = 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!!
}
}
}

View File

@@ -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