From a2954273e31c73e4e5d1db2b66ddd9e5167b8f20 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Tue, 14 Apr 2026 04:57:48 +0800
Subject: [PATCH 01/21] Update Fix File
Update README.md File and Fix decompilation error by TW Server.
---
README.md | 4 ++--
merge_build.sh | 50 +++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index bf76cdb..2c55acd 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@
本项目仅用于学习和研究,请在遵守相关法律法规的前提下使用本项目,若您违规使用使用本项目,那么所导致的一切后果将由您本人承担。
- **风险警告**:使用mod可能涉及未知风险,如果您坚持使用,那么您将承担可能会造成的任何后果,包括但不限于您的游戏账号被封禁
-- **登录问题**:重新打包的APK签名与官方版本不同,可能导致第三方授权登录失败。请优先使用二维码或验证码登录。
+- **登录问题**:重新打包的APK签名与官方版本不同,可能导致第三方授权登录失败。请优先使用二维码或验证码登录。或使用此[方案](https://github.com/JMBQ/azurlane/issues/155#issue-3786864655)解决
---
@@ -35,6 +35,7 @@
- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载
+

@@ -75,7 +76,6 @@
- **华为服**:启动界面卡顿,疑似由于签名验证问题导致HMS Core初始化失败。
---
-
## 📚 致谢
1. [JMBQ/azurlane](https://github.com/JMBQ/azurlane)
diff --git a/merge_build.sh b/merge_build.sh
index 992cfb4..1816b1f 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -92,7 +92,14 @@ DOWNLOAD_APKTOOL() {
local FILENAME="apktool.jar"
echo "正在下载Apktool..."
- local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest")
+ # 新增判断:修复TW在新版Apktool反编译 Androidmanifest.xml 时报错
+ if [ "${GAME_SERVER}" == "TW" ]; then
+ API_URL="https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/v2.12.1"
+ else
+ API_URL="https://api.github.com/repos/${OWNER}/${REPO}/releases/latest"
+ fi
+
+ local API_RESPONSE=$(curl -s "${API_URL}")
local DOWNLOAD_LINK=$(echo "${API_RESPONSE}" | jq -r '.assets[] | select(.name | endswith(".jar")) | .browser_download_url' | head -n 1)
if [ -z "${DOWNLOAD_LINK}" ] || [ "${DOWNLOAD_LINK}" == "null" ]; then
echo "无法找到Apktool下载链接"
@@ -114,9 +121,46 @@ DOWNLOAD_MOD_MENU() {
local REPO="azurlane"
local FILENAME="MOD_MENU.rar"
- echo "正在下载MOD补丁..."
+ echo "正在下载旧版MOD补丁..."
+ local API_OLD_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/3.2.0")
local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest")
local JMBQ_VERSION=$(echo "${API_RESPONSE}" | jq -r '.tag_name')
+
+ # 修改:查找name中含有.rar的文件,而不是直接使用第一个assets
+ local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1)
+ if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then
+ # 修改:查找name中含有.zip的文件,避免后缀不一致导致的无法获取链接
+ local FILENAME="MOD_MENU.zip"
+ local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".zip")) | .browser_download_url' | head -n 1)
+ if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then
+ echo "无法获取MOD Patch文件下载链接"
+ exit 1
+ fi
+ fi
+
+ curl -L -o "${DOWNLOAD_DIR}/${FILENAME}" "${DOWNLOAD_OLD_LINK}"
+ if [ $? -eq 0 ]; then
+ echo "旧版补丁下载成功!文件保存至:${DOWNLOAD_DIR}/${FILENAME}"
+ else
+ echo "旧版补丁下载失败,请重试"
+ exit 1
+ fi
+
+ if command -v 7z &> /dev/null; then
+ 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ"
+ else
+ echo "错误: 未找到7z工具,无法解压!"
+ exit 1
+ fi
+
+ if [ $? -ne 0 ]; then
+ echo "错误: 解压 ${FILENAME} 失败!"
+ exit 1
+ fi
+
+ echo "正在下载MOD补丁..."
+ # 恢复原命名防止逻辑报错
+ FILENAME="MOD_MENU.rar"
# 修改:查找name中含有.rar的文件,而不是直接使用第一个assets
local DOWNLOAD_LINK=$(echo "${API_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1)
@@ -139,7 +183,7 @@ DOWNLOAD_MOD_MENU() {
fi
if command -v 7z &> /dev/null; then
- 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ"
+ 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ/assets/arch"
else
echo "错误: 未找到7z工具,无法解压!"
exit 1
From 094671de4fcfb00bf5be408826040ffb2a74f2d1 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Tue, 14 Apr 2026 04:58:42 +0800
Subject: [PATCH 02/21] Fix warning
---
.github/workflows/main.yml | 6 +++---
.github/workflows/xapk.yml | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 2261021..fb37105 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -26,14 +26,14 @@ jobs:
# 步骤2:设置 Java JDK
- name: Setup Java JDK
- uses: actions/setup-java@v3.3.0
+ uses: actions/setup-java@v4
with:
- java-version: "17"
+ java-version: "18"
distribution: "adopt"
# 步骤3:设置 Android SDK
- name: Set up Android SDK
- uses: android-actions/setup-android@v3
+ uses: android-actions/setup-android@v4
# 步骤4:安装 build-tools
- name: Install build-tools
diff --git a/.github/workflows/xapk.yml b/.github/workflows/xapk.yml
index 4067738..c3a37d9 100644
--- a/.github/workflows/xapk.yml
+++ b/.github/workflows/xapk.yml
@@ -23,13 +23,13 @@ jobs:
uses: actions/checkout@v4
- name: Setup Java JDK
- uses: actions/setup-java@v3.3.0
+ uses: actions/setup-java@v4
with:
- java-version: "17"
+ java-version: "18"
distribution: "adopt"
- name: Set up Android SDK
- uses: android-actions/setup-android@v3
+ uses: android-actions/setup-android@v4
- name: Install build-tools
run: |
From a70ec1087c258a0bf139c78561f0705a6f5b2a7a Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Tue, 14 Apr 2026 05:01:57 +0800
Subject: [PATCH 03/21] Add bilibili.svg
---
images/bilibili.svg | 1 +
1 file changed, 1 insertion(+)
create mode 100644 images/bilibili.svg
diff --git a/images/bilibili.svg b/images/bilibili.svg
new file mode 100644
index 0000000..832e4d2
--- /dev/null
+++ b/images/bilibili.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
From 845b33f6421952fc977d613fda74cc21333e4de3 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Tue, 14 Apr 2026 05:52:30 +0800
Subject: [PATCH 04/21] Update download message for MOD patch
---
merge_build.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/merge_build.sh b/merge_build.sh
index 1816b1f..b64aa58 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -121,7 +121,7 @@ DOWNLOAD_MOD_MENU() {
local REPO="azurlane"
local FILENAME="MOD_MENU.rar"
- echo "正在下载旧版MOD补丁..."
+ echo "正在下载MOD补丁..."
local API_OLD_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/3.2.0")
local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest")
local JMBQ_VERSION=$(echo "${API_RESPONSE}" | jq -r '.tag_name')
From 4dd677730dc189e3b83853df46f1b2193c90af55 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 2 May 2026 18:03:14 +0800
Subject: [PATCH 05/21] Revise installation instructions and add note on
tmp.link
Updated warning section and added a note about using tmp.link for direct link downloads.
---
README.md | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 2c55acd..b0dadd6 100644
--- a/README.md
+++ b/README.md
@@ -31,8 +31,11 @@
## 各渠道服安装包官方下载地址
若您有一定的动手能力,请自行fork本仓库,手动运行工作流来获取对应的APK
-⚠️⚠️⚠️ 注意!!!
-- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载
+### ⚠️⚠️⚠️ 注意!!!
+- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载。网盘建议使用[钛盘](https://tmp.link)来获取下载直链
+
+#### 💢💢💢 碎碎念!!!
+~~已被中心化网盘的一次性直链限制整麻了。点击下载并获取直链的同时,直链直接报废,导致频繁构建失败。~~

From 65d2cf73e2547a42d2bf89924ee7969fb11aa895 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Thu, 7 May 2026 15:04:24 +0800
Subject: [PATCH 06/21] Revise APK download instructions in README
Updated download instructions for OPPO, 4399, vivo, and bilibili channels.
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index b0dadd6..2a269ae 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@
若您有一定的动手能力,请自行fork本仓库,手动运行工作流来获取对应的APK
### ⚠️⚠️⚠️ 注意!!!
-- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载。网盘建议使用[钛盘](https://tmp.link)来获取下载直链
+- **OPPO**,**4399**,**vivo**,**bilibili**,**应用宝**渠道服请自行下载安装包,上传网盘后获取直链下载。网盘建议使用[钛盘](https://tmp.link)来获取下载直链
#### 💢💢💢 碎碎念!!!
~~已被中心化网盘的一次性直链限制整麻了。点击下载并获取直链的同时,直链直接报废,导致频繁构建失败。~~
@@ -70,6 +70,7 @@
---
## 预览

+

---
## 🚧 已知问题
From fc2cdf966483003ab92ba7d018e22600b55c2ef6 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 20:37:40 +0800
Subject: [PATCH 07/21] Implement MTDataFilesProvider injection
Add a function to inject MTDataFilesProvider into AndroidManifest.xml.
---
merge_build.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/merge_build.sh b/merge_build.sh
index b64aa58..1d4daac 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -356,6 +356,61 @@ PATCH_APK() {
echo "补丁完成。"
}
+# 注入MT文件提供器
+INJECT_MT_PROVIDER() {
+ echo "正在注入 MTDataFilesProvider..."
+ local TARGET_DIR="${DOWNLOAD_DIR}/DECODE_Output"
+ local MANIFEST_FILE="${TARGET_DIR}/AndroidManifest.xml"
+
+ # 检查清单文件是否存在,防止路径错误
+ if [ ! -f "${MANIFEST_FILE}" ]; then
+ echo "错误:找不到 ${MANIFEST_FILE},解包可能失败或路径不匹配!"
+ return 1
+ fi
+
+ # 1. 自动获取包名(如果是XAPK则使用预设,如果是APK则从清单提取)
+ local CURRENT_PKG=""
+ if [ "${BUILD_TYPE}" = "XAPK" ]; then
+ CURRENT_PKG="${GAME_BUNDLE_ID}"
+ else
+ CURRENT_PKG=$(grep -oP 'package="\K[^"]+' "${MANIFEST_FILE}")
+ fi
+
+ if [ -z "${CURRENT_PKG}" ]; then
+ echo "无法识别包名,取消注入"
+ return 1
+ fi
+ echo "识别到目标包名: ${CURRENT_PKG}"
+
+ # 2. 拷贝 Smali 文件 (保持 bin/mt/file/content/ 结构)
+ mkdir -p "${TARGET_DIR}/smali"
+ if [ -d "MTDataFilesProvider/bin" ]; then
+ cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali/"
+ echo "Smali 文件拷贝完成"
+ else
+ echo "未找到 MTDataFilesProvider/bin 目录,请检查路径"
+ return 1
+ fi
+
+ # 3. 修改 AndroidManifest.xml
+ if grep -q "MTDataFilesProvider" "${MANIFEST_FILE}"; then
+ echo "已存在 MT 组件,跳过修改"
+ else
+ local PROVIDER_XML="
"
+ local ACTIVITY_XML="
"
+
+ sed -i "s||${PROVIDER_XML}${ACTIVITY_XML}|g" "${MANIFEST_FILE}"
+ echo "AndroidManifest.xml 注入完成"
+
+ # 二次校验是否注入成功
+ if grep -q "MTDataFilesProvider" "${MANIFEST_FILE}"; then
+ echo "AndroidManifest.xml 注入成功!"
+ else
+ echo "AndroidManifest.xml 注入失败!"
+ fi
+ fi
+}
+
# 打包APK
BUILD_APK() {
local OUTPUT_APK
@@ -547,6 +602,7 @@ main() {
DECODE_APK
DELETE_ORGINAL_APK
PATCH_APK
+ INJECT_MT_PROVIDER
BUILD_APK
OPTIMIZE_AND_SIGN_APK
GET_GAME_VERSION
@@ -560,6 +616,7 @@ main() {
DECODE_APK
DELETE_ORGINAL_APK
PATCH_APK
+ INJECT_MT_PROVIDER
BUILD_APK
OPTIMIZE_AND_SIGN_APK
GET_GAME_VERSION
From d2a9d58385896d66c43e05b9ade50b978796765e Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 20:43:51 +0800
Subject: [PATCH 08/21] Create MTDataFilesProvider.smali
---
.../bin/mt/file/content/MTDataFilesProvider.smali | 1 +
1 file changed, 1 insertion(+)
create mode 100644 MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali
diff --git a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali
@@ -0,0 +1 @@
+
From f8a7e035e6e313066f93dda782c5758d93bdf5d5 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 20:44:11 +0800
Subject: [PATCH 09/21] Add files via upload
---
.../mt/file/content/MTDataFilesProvider.smali | 1875 +++++++++++++++++
.../content/MTDataFilesWakeUpActivity.smali | 26 +
2 files changed, 1901 insertions(+)
create mode 100644 MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali
diff --git a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali
index 8b13789..aac4d07 100644
--- a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali
+++ b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali
@@ -1 +1,1876 @@
+# classes3.dex
+.class public Lbin/mt/file/content/MTDataFilesProvider;
+.super Landroid/provider/DocumentsProvider;
+
+
+# static fields
+.field public static final g:[Ljava/lang/String;
+
+.field public static final h:[Ljava/lang/String;
+
+
+# instance fields
+.field public b:Ljava/lang/String;
+
+.field public c:Ljava/io/File;
+
+.field public d:Ljava/io/File;
+
+.field public e:Ljava/io/File;
+
+.field public f:Ljava/io/File;
+
+
+# direct methods
+.method public static constructor
()V
+ .registers 8
+
+ const-string v0, "root_id"
+
+ const-string v1, "mime_types"
+
+ const-string v2, "flags"
+
+ const-string v3, "icon"
+
+ const-string v4, "title"
+
+ const-string v5, "summary"
+
+ const-string v6, "document_id"
+
+ filled-new-array/range {v0 .. v6}, [Ljava/lang/String;
+
+ move-result-object v0
+
+ sput-object v0, Lbin/mt/file/content/MTDataFilesProvider;->g:[Ljava/lang/String;
+
+ const-string v1, "document_id"
+
+ const-string v2, "mime_type"
+
+ const-string v3, "_display_name"
+
+ const-string v4, "last_modified"
+
+ const-string v5, "flags"
+
+ const-string v6, "_size"
+
+ const-string v7, "mt_extras"
+
+ filled-new-array/range {v1 .. v7}, [Ljava/lang/String;
+
+ move-result-object v0
+
+ sput-object v0, Lbin/mt/file/content/MTDataFilesProvider;->h:[Ljava/lang/String;
+
+ return-void
+.end method
+
+.method public constructor ()V
+ .registers 1
+
+ invoke-direct {p0}, Landroid/provider/DocumentsProvider;->()V
+
+ return-void
+.end method
+
+.method public static a(Ljava/io/File;)Z
+ .registers 6
+
+ invoke-virtual {p0}, Ljava/io/File;->isDirectory()Z
+
+ move-result v0
+
+ if-eqz v0, :cond_3b
+
+ const/4 v0, 0x0
+
+ :try_start_7
+ invoke-virtual {p0}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object v1
+
+ invoke-static {v1}, Landroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
+
+ move-result-object v1
+
+ iget v1, v1, Landroid/system/StructStat;->st_mode:I
+ :try_end_11
+ .catch Landroid/system/ErrnoException; {:try_start_7 .. :try_end_11} :catch_1e
+
+ const v2, 0xf000
+
+ and-int/2addr v1, v2
+
+ const v2, 0xa000
+
+ if-ne v1, v2, :cond_1c
+
+ const/4 v1, 0x1
+
+ goto :goto_23
+
+ :cond_1c
+ :goto_1c
+ const/4 v1, 0x0
+
+ goto :goto_23
+
+ :catch_1e
+ move-exception v1
+
+ invoke-virtual {v1}, Ljava/lang/Throwable;->printStackTrace()V
+
+ goto :goto_1c
+
+ :goto_23
+ if-nez v1, :cond_3b
+
+ invoke-virtual {p0}, Ljava/io/File;->listFiles()[Ljava/io/File;
+
+ move-result-object v1
+
+ if-eqz v1, :cond_3b
+
+ array-length v2, v1
+
+ const/4 v3, 0x0
+
+ :goto_2d
+ if-ge v3, v2, :cond_3b
+
+ aget-object v4, v1, v3
+
+ invoke-static {v4}, Lbin/mt/file/content/MTDataFilesProvider;->a(Ljava/io/File;)Z
+
+ move-result v4
+
+ if-nez v4, :cond_38
+
+ return v0
+
+ :cond_38
+ add-int/lit8 v3, v3, 0x1
+
+ goto :goto_2d
+
+ :cond_3b
+ invoke-virtual {p0}, Ljava/io/File;->delete()Z
+
+ move-result p0
+
+ return p0
+.end method
+
+.method public static c(Ljava/io/File;)Ljava/lang/String;
+ .registers 2
+
+ invoke-virtual {p0}, Ljava/io/File;->isDirectory()Z
+
+ move-result v0
+
+ if-eqz v0, :cond_9
+
+ const-string p0, "vnd.android.document/directory"
+
+ return-object p0
+
+ :cond_9
+ invoke-virtual {p0}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object p0
+
+ const/16 v0, 0x2e
+
+ invoke-virtual {p0, v0}, Ljava/lang/String;->lastIndexOf(I)I
+
+ move-result v0
+
+ if-ltz v0, :cond_2a
+
+ add-int/lit8 v0, v0, 0x1
+
+ invoke-virtual {p0, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String;
+
+ move-result-object p0
+
+ invoke-virtual {p0}, Ljava/lang/String;->toLowerCase()Ljava/lang/String;
+
+ move-result-object p0
+
+ invoke-static {}, Landroid/webkit/MimeTypeMap;->getSingleton()Landroid/webkit/MimeTypeMap;
+
+ move-result-object v0
+
+ invoke-virtual {v0, p0}, Landroid/webkit/MimeTypeMap;->getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p0
+
+ if-eqz p0, :cond_2a
+
+ return-object p0
+
+ :cond_2a
+ const-string p0, "application/octet-stream"
+
+ return-object p0
+.end method
+
+
+# virtual methods
+.method public final attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
+ .registers 6
+
+ invoke-super {p0, p1, p2}, Landroid/provider/DocumentsProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
+
+ invoke-virtual {p1}, Landroid/content/Context;->getPackageName()Ljava/lang/String;
+
+ move-result-object p2
+
+ iput-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1}, Landroid/content/Context;->getFilesDir()Ljava/io/File;
+
+ move-result-object p2
+
+ invoke-virtual {p2}, Ljava/io/File;->getParentFile()Ljava/io/File;
+
+ move-result-object p2
+
+ iput-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File;
+
+ invoke-virtual {p2}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object p2
+
+ const-string v0, "/data/user/"
+
+ invoke-virtual {p2, v0}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+ move-result v0
+
+ if-eqz v0, :cond_3a
+
+ new-instance v0, Ljava/io/File;
+
+ new-instance v1, Ljava/lang/StringBuilder;
+
+ const-string v2, "/data/user_de/"
+
+ invoke-direct {v1, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
+
+ const/16 v2, 0xb
+
+ invoke-virtual {p2, v2}, Ljava/lang/String;->substring(I)Ljava/lang/String;
+
+ move-result-object p2
+
+ invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p2
+
+ invoke-direct {v0, p2}, Ljava/io/File;->(Ljava/lang/String;)V
+
+ iput-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File;
+
+ :cond_3a
+ const/4 p2, 0x0
+
+ invoke-virtual {p1, p2}, Landroid/content/Context;->getExternalFilesDir(Ljava/lang/String;)Ljava/io/File;
+
+ move-result-object p2
+
+ if-eqz p2, :cond_47
+
+ invoke-virtual {p2}, Ljava/io/File;->getParentFile()Ljava/io/File;
+
+ move-result-object p2
+
+ iput-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File;
+
+ :cond_47
+ invoke-virtual {p1}, Landroid/content/Context;->getObbDir()Ljava/io/File;
+
+ move-result-object p1
+
+ iput-object p1, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File;
+
+ return-void
+.end method
+
+.method public final b(Ljava/lang/String;Z)Ljava/io/File;
+ .registers 9
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1, v0}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+ move-result v0
+
+ const-string v1, " not found"
+
+ if-eqz v0, :cond_ac
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {v0}, Ljava/lang/String;->length()I
+
+ move-result v0
+
+ invoke-virtual {p1, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String;
+
+ move-result-object v0
+
+ const-string v2, "/"
+
+ invoke-virtual {v0, v2}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+ move-result v2
+
+ const/4 v3, 0x1
+
+ if-eqz v2, :cond_21
+
+ invoke-virtual {v0, v3}, Ljava/lang/String;->substring(I)Ljava/lang/String;
+
+ move-result-object v0
+
+ :cond_21
+ invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z
+
+ move-result v2
+
+ const/4 v4, 0x0
+
+ if-eqz v2, :cond_29
+
+ return-object v4
+
+ :cond_29
+ const/16 v2, 0x2f
+
+ invoke-virtual {v0, v2}, Ljava/lang/String;->indexOf(I)I
+
+ move-result v2
+
+ const/4 v5, -0x1
+
+ if-ne v2, v5, :cond_35
+
+ const-string v2, ""
+
+ goto :goto_40
+
+ :cond_35
+ const/4 v5, 0x0
+
+ invoke-virtual {v0, v5, v2}, Ljava/lang/String;->substring(II)Ljava/lang/String;
+
+ move-result-object v5
+
+ add-int/2addr v2, v3
+
+ invoke-virtual {v0, v2}, Ljava/lang/String;->substring(I)Ljava/lang/String;
+
+ move-result-object v2
+
+ move-object v0, v5
+
+ :goto_40
+ const-string v3, "data"
+
+ invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
+
+ move-result v3
+
+ if-eqz v3, :cond_50
+
+ new-instance v4, Ljava/io/File;
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File;
+
+ invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ goto :goto_8b
+
+ :cond_50
+ const-string v3, "android_data"
+
+ invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
+
+ move-result v3
+
+ if-eqz v3, :cond_64
+
+ iget-object v3, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File;
+
+ if-eqz v3, :cond_64
+
+ new-instance v4, Ljava/io/File;
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File;
+
+ invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ goto :goto_8b
+
+ :cond_64
+ const-string v3, "android_obb"
+
+ invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
+
+ move-result v3
+
+ if-eqz v3, :cond_78
+
+ iget-object v3, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File;
+
+ if-eqz v3, :cond_78
+
+ new-instance v4, Ljava/io/File;
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File;
+
+ invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ goto :goto_8b
+
+ :cond_78
+ const-string v3, "user_de_data"
+
+ invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
+
+ move-result v0
+
+ if-eqz v0, :cond_8b
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File;
+
+ if-eqz v0, :cond_8b
+
+ new-instance v4, Ljava/io/File;
+
+ iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File;
+
+ invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ :cond_8b
+ :goto_8b
+ if-eqz v4, :cond_a2
+
+ if-eqz p2, :cond_a1
+
+ :try_start_8f
+ invoke-virtual {v4}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object p2
+
+ invoke-static {p2}, Landroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
+ :try_end_96
+ .catch Ljava/lang/Exception; {:try_start_8f .. :try_end_96} :catch_97
+
+ goto :goto_a1
+
+ :catch_97
+ new-instance p2, Ljava/io/FileNotFoundException;
+
+ invoke-virtual {p1, v1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw p2
+
+ :cond_a1
+ :goto_a1
+ return-object v4
+
+ :cond_a2
+ new-instance p2, Ljava/io/FileNotFoundException;
+
+ invoke-virtual {p1, v1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw p2
+
+ :cond_ac
+ new-instance p2, Ljava/io/FileNotFoundException;
+
+ invoke-virtual {p1, v1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw p2
+.end method
+
+.method public final call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+ .registers 13
+
+ const-string v0, "message"
+
+ const-string v1, "result"
+
+ const-string v2, "Unsupported method: "
+
+ invoke-super {p0, p1, p2, p3}, Landroid/provider/DocumentsProvider;->call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+
+ move-result-object p2
+
+ if-eqz p2, :cond_d
+
+ return-object p2
+
+ :cond_d
+ const-string p2, "mt:"
+
+ invoke-virtual {p1, p2}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+ move-result p2
+
+ if-nez p2, :cond_17
+
+ const/4 p1, 0x0
+
+ return-object p1
+
+ :cond_17
+ new-instance p2, Landroid/os/Bundle;
+
+ invoke-direct {p2}, Landroid/os/Bundle;->()V
+
+ const/4 v3, 0x0
+
+ :try_start_1d
+ const-string v4, "uri"
+
+ invoke-virtual {p3, v4}, Landroid/os/Bundle;->getParcelable(Ljava/lang/String;)Landroid/os/Parcelable;
+
+ move-result-object v4
+
+ check-cast v4, Landroid/net/Uri;
+
+ invoke-virtual {v4}, Landroid/net/Uri;->getPathSegments()Ljava/util/List;
+
+ move-result-object v4
+
+ invoke-interface {v4}, Ljava/util/List;->size()I
+
+ move-result v5
+
+ const/4 v6, 0x4
+
+ const/4 v7, 0x1
+
+ if-lt v5, v6, :cond_39
+
+ const/4 v5, 0x3
+
+ invoke-interface {v4, v5}, Ljava/util/List;->get(I)Ljava/lang/Object;
+
+ move-result-object v4
+
+ :goto_36
+ check-cast v4, Ljava/lang/String;
+
+ goto :goto_3e
+
+ :cond_39
+ invoke-interface {v4, v7}, Ljava/util/List;->get(I)Ljava/lang/Object;
+
+ move-result-object v4
+
+ goto :goto_36
+
+ :goto_3e
+ invoke-virtual {p1}, Ljava/lang/String;->hashCode()I
+
+ move-result v5
+
+ const v6, -0x620f2f0b
+
+ const/4 v8, 0x2
+
+ if-eq v5, v6, :cond_67
+
+ const v6, 0xcc82212
+
+ if-eq v5, v6, :cond_5d
+
+ const v6, 0x6621b52e
+
+ if-eq v5, v6, :cond_53
+
+ goto :goto_71
+
+ :cond_53
+ const-string v5, "mt:setLastModified"
+
+ invoke-virtual {p1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v5
+
+ if-eqz v5, :cond_71
+
+ const/4 v5, 0x0
+
+ goto :goto_72
+
+ :cond_5d
+ const-string v5, "mt:createSymlink"
+
+ invoke-virtual {p1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v5
+
+ if-eqz v5, :cond_71
+
+ const/4 v5, 0x2
+
+ goto :goto_72
+
+ :cond_67
+ const-string v5, "mt:setPermissions"
+
+ invoke-virtual {p1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v5
+
+ if-eqz v5, :cond_71
+
+ const/4 v5, 0x1
+
+ goto :goto_72
+
+ :cond_71
+ :goto_71
+ const/4 v5, -0x1
+
+ :goto_72
+ if-eqz v5, :cond_c8
+
+ if-eq v5, v7, :cond_a7
+
+ if-eq v5, v8, :cond_83
+
+ invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+
+ invoke-virtual {v2, p1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ :goto_7f
+ invoke-virtual {p2, v0, p1}, Landroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V
+
+ goto :goto_e8
+
+ :cond_83
+ invoke-virtual {p0, v4, v3}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p1
+
+ if-nez p1, :cond_8d
+
+ :goto_89
+ invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+
+ goto :goto_e8
+
+ :cond_8d
+ const-string v2, "path"
+
+ invoke-virtual {p3, v2}, Landroid/os/BaseBundle;->getString(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p3
+ :try_end_93
+ .catch Ljava/lang/Exception; {:try_start_1d .. :try_end_93} :catch_dd
+
+ :try_start_93
+ invoke-virtual {p1}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-static {p3, p1}, Landroid/system/Os;->symlink(Ljava/lang/String;Ljava/lang/String;)V
+
+ invoke-virtual {p2, v1, v7}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+ :try_end_9d
+ .catch Landroid/system/ErrnoException; {:try_start_93 .. :try_end_9d} :catch_9e
+ .catch Ljava/lang/Exception; {:try_start_93 .. :try_end_9d} :catch_dd
+
+ goto :goto_e8
+
+ :catch_9e
+ move-exception p1
+
+ :try_start_9f
+ invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+
+ invoke-virtual {p1}, Landroid/system/ErrnoException;->getMessage()Ljava/lang/String;
+
+ move-result-object p1
+
+ goto :goto_7f
+
+ :cond_a7
+ invoke-virtual {p0, v4, v7}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p1
+
+ if-nez p1, :cond_ae
+
+ goto :goto_89
+
+ :cond_ae
+ const-string v2, "permissions"
+
+ invoke-virtual {p3, v2}, Landroid/os/BaseBundle;->getInt(Ljava/lang/String;)I
+
+ move-result p3
+ :try_end_b4
+ .catch Ljava/lang/Exception; {:try_start_9f .. :try_end_b4} :catch_dd
+
+ :try_start_b4
+ invoke-virtual {p1}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-static {p1, p3}, Landroid/system/Os;->chmod(Ljava/lang/String;I)V
+
+ invoke-virtual {p2, v1, v7}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+ :try_end_be
+ .catch Landroid/system/ErrnoException; {:try_start_b4 .. :try_end_be} :catch_bf
+ .catch Ljava/lang/Exception; {:try_start_b4 .. :try_end_be} :catch_dd
+
+ goto :goto_e8
+
+ :catch_bf
+ move-exception p1
+
+ :try_start_c0
+ invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+
+ invoke-virtual {p1}, Landroid/system/ErrnoException;->getMessage()Ljava/lang/String;
+
+ move-result-object p1
+
+ goto :goto_7f
+
+ :cond_c8
+ invoke-virtual {p0, v4, v7}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p1
+
+ if-nez p1, :cond_cf
+
+ goto :goto_89
+
+ :cond_cf
+ const-string v2, "time"
+
+ invoke-virtual {p3, v2}, Landroid/os/BaseBundle;->getLong(Ljava/lang/String;)J
+
+ move-result-wide v4
+
+ invoke-virtual {p1, v4, v5}, Ljava/io/File;->setLastModified(J)Z
+
+ move-result p1
+
+ invoke-virtual {p2, v1, p1}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+ :try_end_dc
+ .catch Ljava/lang/Exception; {:try_start_c0 .. :try_end_dc} :catch_dd
+
+ goto :goto_e8
+
+ :catch_dd
+ move-exception p1
+
+ invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
+
+ invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-virtual {p2, v0, p1}, Landroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V
+
+ :goto_e8
+ return-object p2
+.end method
+
+.method public final createDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+ .registers 10
+
+ const-string v0, "/"
+
+ const/4 v1, 0x1
+
+ invoke-virtual {p0, p1, v1}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object v1
+
+ if-eqz v1, :cond_7c
+
+ new-instance v2, Ljava/io/File;
+
+ invoke-direct {v2, v1, p3}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ const/4 v3, 0x2
+
+ :goto_f
+ invoke-virtual {v2}, Ljava/io/File;->exists()Z
+
+ move-result v4
+
+ if-eqz v4, :cond_37
+
+ new-instance v2, Ljava/io/File;
+
+ new-instance v4, Ljava/lang/StringBuilder;
+
+ invoke-direct {v4}, Ljava/lang/StringBuilder;->()V
+
+ invoke-virtual {v4, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ const-string v5, " ("
+
+ invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ add-int/lit8 v5, v3, 0x1
+
+ invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
+
+ const-string v3, ")"
+
+ invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object v3
+
+ invoke-direct {v2, v1, v3}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ move v3, v5
+
+ goto :goto_f
+
+ :cond_37
+ :try_start_37
+ const-string v1, "vnd.android.document/directory"
+
+ invoke-virtual {v1, p2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result p2
+
+ if-eqz p2, :cond_44
+
+ invoke-virtual {v2}, Ljava/io/File;->mkdir()Z
+
+ move-result p2
+
+ goto :goto_48
+
+ :cond_44
+ invoke-virtual {v2}, Ljava/io/File;->createNewFile()Z
+
+ move-result p2
+
+ :goto_48
+ if-eqz p2, :cond_7c
+
+ invoke-virtual {p1, v0}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
+
+ move-result p2
+
+ if-eqz p2, :cond_64
+
+ new-instance p2, Ljava/lang/StringBuilder;
+
+ invoke-direct {p2}, Ljava/lang/StringBuilder;->()V
+
+ invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v2}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object v0
+
+ invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ :goto_5f
+ invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ goto :goto_77
+
+ :cond_64
+ new-instance p2, Ljava/lang/StringBuilder;
+
+ invoke-direct {p2}, Ljava/lang/StringBuilder;->()V
+
+ invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v2}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object v0
+
+ invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ :try_end_76
+ .catch Ljava/io/IOException; {:try_start_37 .. :try_end_76} :catch_78
+
+ goto :goto_5f
+
+ :goto_77
+ return-object p1
+
+ :catch_78
+ move-exception p2
+
+ invoke-virtual {p2}, Ljava/lang/Throwable;->printStackTrace()V
+
+ :cond_7c
+ new-instance p2, Ljava/io/FileNotFoundException;
+
+ new-instance v0, Ljava/lang/StringBuilder;
+
+ const-string v1, "Failed to create document in "
+
+ invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
+
+ invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ const-string p1, " with name "
+
+ invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw p2
+.end method
+
+.method public final d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+ .registers 16
+
+ const-string v0, "|"
+
+ const/4 v1, 0x1
+
+ if-nez p3, :cond_9
+
+ invoke-virtual {p0, p2, v1}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p3
+
+ :cond_9
+ const/4 v2, 0x0
+
+ const-string v3, "flags"
+
+ const-string v4, "last_modified"
+
+ const-string v5, "mime_type"
+
+ const-string v6, "_size"
+
+ const-string v7, "_display_name"
+
+ const-string v8, "document_id"
+
+ if-nez p3, :cond_43
+
+ invoke-virtual {p1}, Landroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder;
+
+ move-result-object p1
+
+ iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1, v8, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1, v7, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-wide/16 p2, 0x0
+
+ invoke-static {p2, p3}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v6, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-string p2, "vnd.android.document/directory"
+
+ invoke-virtual {p1, v5, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v4, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v3, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ return-void
+
+ :cond_43
+ invoke-virtual {p3}, Ljava/io/File;->isDirectory()Z
+
+ move-result v9
+
+ if-eqz v9, :cond_52
+
+ invoke-virtual {p3}, Ljava/io/File;->canWrite()Z
+
+ move-result v9
+
+ if-eqz v9, :cond_5a
+
+ const/16 v9, 0x8
+
+ goto :goto_5b
+
+ :cond_52
+ invoke-virtual {p3}, Ljava/io/File;->canWrite()Z
+
+ move-result v9
+
+ if-eqz v9, :cond_5a
+
+ const/4 v9, 0x2
+
+ goto :goto_5b
+
+ :cond_5a
+ const/4 v9, 0x0
+
+ :goto_5b
+ invoke-virtual {p3}, Ljava/io/File;->getParentFile()Ljava/io/File;
+
+ move-result-object v10
+
+ invoke-virtual {v10}, Ljava/io/File;->canWrite()Z
+
+ move-result v10
+
+ if-eqz v10, :cond_69
+
+ or-int/lit8 v9, v9, 0x4
+
+ or-int/lit8 v9, v9, 0x40
+
+ :cond_69
+ invoke-virtual {p3}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object v10
+
+ iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File;
+
+ invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object v11
+
+ invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v11
+
+ if-eqz v11, :cond_7c
+
+ const-string v1, "data"
+
+ goto :goto_b5
+
+ :cond_7c
+ iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File;
+
+ if-eqz v11, :cond_8d
+
+ invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object v11
+
+ invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v11
+
+ if-eqz v11, :cond_8d
+
+ const-string v1, "android_data"
+
+ goto :goto_b5
+
+ :cond_8d
+ iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File;
+
+ if-eqz v11, :cond_9e
+
+ invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object v11
+
+ invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v11
+
+ if-eqz v11, :cond_9e
+
+ const-string v1, "android_obb"
+
+ goto :goto_b5
+
+ :cond_9e
+ iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File;
+
+ if-eqz v11, :cond_af
+
+ invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String;
+
+ move-result-object v11
+
+ invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
+
+ move-result v11
+
+ if-eqz v11, :cond_af
+
+ const-string v1, "user_de_data"
+
+ goto :goto_b5
+
+ :cond_af
+ invoke-virtual {p3}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object v2
+
+ move-object v1, v2
+
+ const/4 v2, 0x1
+
+ :goto_b5
+ invoke-virtual {p1}, Landroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder;
+
+ move-result-object p1
+
+ invoke-virtual {p1, v8, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-virtual {p1, v7, v1}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-virtual {p3}, Ljava/io/File;->length()J
+
+ move-result-wide v7
+
+ invoke-static {v7, v8}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v6, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-static {p3}, Lbin/mt/file/content/MTDataFilesProvider;->c(Ljava/io/File;)Ljava/lang/String;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v5, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-virtual {p3}, Ljava/io/File;->lastModified()J
+
+ move-result-wide v5
+
+ invoke-static {v5, v6}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v4, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ invoke-static {v9}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
+
+ move-result-object p2
+
+ invoke-virtual {p1, v3, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-string p2, "mt_path"
+
+ invoke-virtual {p3}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String;
+
+ move-result-object p3
+
+ invoke-virtual {p1, p2, p3}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ if-eqz v2, :cond_12f
+
+ :try_start_ee
+ new-instance p2, Ljava/lang/StringBuilder;
+
+ invoke-direct {p2}, Ljava/lang/StringBuilder;->()V
+
+ invoke-static {v10}, Landroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat;
+
+ move-result-object p3
+
+ iget v1, p3, Landroid/system/StructStat;->st_mode:I
+
+ invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ iget v1, p3, Landroid/system/StructStat;->st_uid:I
+
+ invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ iget v1, p3, Landroid/system/StructStat;->st_gid:I
+
+ invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
+
+ iget p3, p3, Landroid/system/StructStat;->st_mode:I
+
+ const v1, 0xf000
+
+ and-int/2addr p3, v1
+
+ const v1, 0xa000
+
+ if-ne p3, v1, :cond_121
+
+ invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-static {v10}, Landroid/system/Os;->readlink(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p3
+
+ invoke-virtual {p2, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ :cond_121
+ const-string p3, "mt_extras"
+
+ invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p2
+
+ invoke-virtual {p1, p3, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+ :try_end_12a
+ .catch Ljava/lang/Exception; {:try_start_ee .. :try_end_12a} :catch_12b
+
+ goto :goto_12f
+
+ :catch_12b
+ move-exception p1
+
+ invoke-virtual {p1}, Ljava/lang/Throwable;->printStackTrace()V
+
+ :cond_12f
+ :goto_12f
+ return-void
+.end method
+
+.method public final deleteDocument(Ljava/lang/String;)V
+ .registers 4
+
+ const/4 v0, 0x1
+
+ invoke-virtual {p0, p1, v0}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object v0
+
+ if-eqz v0, :cond_e
+
+ invoke-static {v0}, Lbin/mt/file/content/MTDataFilesProvider;->a(Ljava/io/File;)Z
+
+ move-result v0
+
+ if-eqz v0, :cond_e
+
+ return-void
+
+ :cond_e
+ new-instance v0, Ljava/io/FileNotFoundException;
+
+ const-string v1, "Failed to delete document "
+
+ invoke-virtual {v1, p1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {v0, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw v0
+.end method
+
+.method public final getDocumentType(Ljava/lang/String;)Ljava/lang/String;
+ .registers 3
+
+ const/4 v0, 0x1
+
+ invoke-virtual {p0, p1, v0}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p1
+
+ if-nez p1, :cond_a
+
+ const-string p1, "vnd.android.document/directory"
+
+ goto :goto_e
+
+ :cond_a
+ invoke-static {p1}, Lbin/mt/file/content/MTDataFilesProvider;->c(Ljava/io/File;)Ljava/lang/String;
+
+ move-result-object p1
+
+ :goto_e
+ return-object p1
+.end method
+
+.method public final isChildDocument(Ljava/lang/String;Ljava/lang/String;)Z
+ .registers 3
+
+ invoke-virtual {p2, p1}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z
+
+ move-result p1
+
+ return p1
+.end method
+
+.method public final moveDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+ .registers 7
+
+ const/4 p2, 0x1
+
+ invoke-virtual {p0, p1, p2}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object v0
+
+ invoke-virtual {p0, p3, p2}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p2
+
+ if-eqz v0, :cond_55
+
+ if-eqz p2, :cond_55
+
+ new-instance v1, Ljava/io/File;
+
+ invoke-virtual {v0}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object v2
+
+ invoke-direct {v1, p2, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ invoke-virtual {v1}, Ljava/io/File;->exists()Z
+
+ move-result p2
+
+ if-nez p2, :cond_55
+
+ invoke-virtual {v0, v1}, Ljava/io/File;->renameTo(Ljava/io/File;)Z
+
+ move-result p2
+
+ if-eqz p2, :cond_55
+
+ const-string p1, "/"
+
+ invoke-virtual {p3, p1}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
+
+ move-result p2
+
+ if-eqz p2, :cond_3e
+
+ new-instance p1, Ljava/lang/StringBuilder;
+
+ invoke-direct {p1}, Ljava/lang/StringBuilder;->()V
+
+ invoke-virtual {p1, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object p2
+
+ invoke-virtual {p1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ goto :goto_54
+
+ :cond_3e
+ new-instance p2, Ljava/lang/StringBuilder;
+
+ invoke-direct {p2}, Ljava/lang/StringBuilder;->()V
+
+ invoke-virtual {p2, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ :goto_54
+ return-object p1
+
+ :cond_55
+ new-instance p2, Ljava/io/FileNotFoundException;
+
+ new-instance v0, Ljava/lang/StringBuilder;
+
+ const-string v1, "Filed to move document "
+
+ invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
+
+ invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ const-string p1, " to "
+
+ invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw p2
+.end method
+
+.method public final onCreate()Z
+ .registers 2
+
+ const/4 v0, 0x1
+
+ return v0
+.end method
+
+.method public final openDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;
+ .registers 4
+
+ const/4 p3, 0x0
+
+ invoke-virtual {p0, p1, p3}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p3
+
+ if-eqz p3, :cond_10
+
+ invoke-static {p2}, Landroid/os/ParcelFileDescriptor;->parseMode(Ljava/lang/String;)I
+
+ move-result p1
+
+ invoke-static {p3, p1}, Landroid/os/ParcelFileDescriptor;->open(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;
+
+ move-result-object p1
+
+ return-object p1
+
+ :cond_10
+ new-instance p2, Ljava/io/FileNotFoundException;
+
+ const-string p3, " not found"
+
+ invoke-virtual {p1, p3}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw p2
+.end method
+
+.method public final queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
+ .registers 10
+
+ const-string p3, "/"
+
+ invoke-virtual {p1, p3}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z
+
+ move-result v0
+
+ const/4 v1, 0x0
+
+ const/4 v2, 0x1
+
+ if-eqz v0, :cond_13
+
+ invoke-virtual {p1}, Ljava/lang/String;->length()I
+
+ move-result v0
+
+ sub-int/2addr v0, v2
+
+ invoke-virtual {p1, v1, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String;
+
+ move-result-object p1
+
+ :cond_13
+ new-instance v0, Landroid/database/MatrixCursor;
+
+ if-eqz p2, :cond_18
+
+ goto :goto_1a
+
+ :cond_18
+ sget-object p2, Lbin/mt/file/content/MTDataFilesProvider;->h:[Ljava/lang/String;
+
+ :goto_1a
+ invoke-direct {v0, p2}, Landroid/database/MatrixCursor;->([Ljava/lang/String;)V
+
+ invoke-virtual {p0, p1, v2}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object p2
+
+ if-nez p2, :cond_6e
+
+ const-string p2, "/data"
+
+ invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p2
+
+ iget-object p3, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File;
+
+ invoke-virtual {p0, v0, p2, p3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+
+ iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File;
+
+ if-eqz p2, :cond_43
+
+ invoke-virtual {p2}, Ljava/io/File;->exists()Z
+
+ move-result p2
+
+ if-eqz p2, :cond_43
+
+ const-string p2, "/android_data"
+
+ invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p2
+
+ iget-object p3, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File;
+
+ invoke-virtual {p0, v0, p2, p3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+
+ :cond_43
+ iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File;
+
+ if-eqz p2, :cond_58
+
+ invoke-virtual {p2}, Ljava/io/File;->exists()Z
+
+ move-result p2
+
+ if-eqz p2, :cond_58
+
+ const-string p2, "/android_obb"
+
+ invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p2
+
+ iget-object p3, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File;
+
+ invoke-virtual {p0, v0, p2, p3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+
+ :cond_58
+ iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File;
+
+ if-eqz p2, :cond_95
+
+ invoke-virtual {p2}, Ljava/io/File;->exists()Z
+
+ move-result p2
+
+ if-eqz p2, :cond_95
+
+ const-string p2, "/user_de_data"
+
+ invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
+
+ move-result-object p1
+
+ iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File;
+
+ invoke-virtual {p0, v0, p1, p2}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+
+ goto :goto_95
+
+ :cond_6e
+ invoke-virtual {p2}, Ljava/io/File;->listFiles()[Ljava/io/File;
+
+ move-result-object p2
+
+ if-eqz p2, :cond_95
+
+ array-length v2, p2
+
+ :goto_75
+ if-ge v1, v2, :cond_95
+
+ aget-object v3, p2, v1
+
+ new-instance v4, Ljava/lang/StringBuilder;
+
+ invoke-direct {v4}, Ljava/lang/StringBuilder;->()V
+
+ invoke-virtual {v4, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v4, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v3}, Ljava/io/File;->getName()Ljava/lang/String;
+
+ move-result-object v5
+
+ invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object v4
+
+ invoke-virtual {p0, v0, v4, v3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+
+ add-int/lit8 v1, v1, 0x1
+
+ goto :goto_75
+
+ :cond_95
+ :goto_95
+ return-object v0
+.end method
+
+.method public final queryDocument(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;
+ .registers 4
+
+ new-instance v0, Landroid/database/MatrixCursor;
+
+ if-eqz p2, :cond_5
+
+ goto :goto_7
+
+ :cond_5
+ sget-object p2, Lbin/mt/file/content/MTDataFilesProvider;->h:[Ljava/lang/String;
+
+ :goto_7
+ invoke-direct {v0, p2}, Landroid/database/MatrixCursor;->([Ljava/lang/String;)V
+
+ const/4 p2, 0x0
+
+ invoke-virtual {p0, v0, p1, p2}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V
+
+ return-object v0
+.end method
+
+.method public final queryRoots([Ljava/lang/String;)Landroid/database/Cursor;
+ .registers 7
+
+ invoke-virtual {p0}, Landroid/content/ContentProvider;->getContext()Landroid/content/Context;
+
+ move-result-object v0
+
+ invoke-virtual {v0}, Landroid/content/Context;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
+
+ move-result-object v0
+
+ invoke-virtual {p0}, Landroid/content/ContentProvider;->getContext()Landroid/content/Context;
+
+ move-result-object v1
+
+ invoke-virtual {v1}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager;
+
+ move-result-object v1
+
+ invoke-virtual {v0, v1}, Landroid/content/pm/PackageItemInfo;->loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;
+
+ move-result-object v1
+
+ invoke-interface {v1}, Ljava/lang/CharSequence;->toString()Ljava/lang/String;
+
+ move-result-object v1
+
+ new-instance v2, Landroid/database/MatrixCursor;
+
+ if-eqz p1, :cond_1d
+
+ goto :goto_1f
+
+ :cond_1d
+ sget-object p1, Lbin/mt/file/content/MTDataFilesProvider;->g:[Ljava/lang/String;
+
+ :goto_1f
+ invoke-direct {v2, p1}, Landroid/database/MatrixCursor;->([Ljava/lang/String;)V
+
+ invoke-virtual {v2}, Landroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder;
+
+ move-result-object p1
+
+ const-string v3, "root_id"
+
+ iget-object v4, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1, v3, v4}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-string v3, "document_id"
+
+ iget-object v4, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1, v3, v4}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-string v3, "summary"
+
+ iget-object v4, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String;
+
+ invoke-virtual {p1, v3, v4}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const/16 v3, 0x11
+
+ invoke-static {v3}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
+
+ move-result-object v3
+
+ const-string v4, "flags"
+
+ invoke-virtual {p1, v4, v3}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-string v3, "title"
+
+ invoke-virtual {p1, v3, v1}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ const-string v1, "mime_types"
+
+ const-string v3, "*/*"
+
+ invoke-virtual {p1, v1, v3}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ iget v0, v0, Landroid/content/pm/ApplicationInfo;->icon:I
+
+ invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
+
+ move-result-object v0
+
+ const-string v1, "icon"
+
+ invoke-virtual {p1, v1, v0}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;
+
+ return-object v2
+.end method
+
+.method public final removeDocument(Ljava/lang/String;Ljava/lang/String;)V
+ .registers 3
+
+ invoke-virtual {p0, p1}, Lbin/mt/file/content/MTDataFilesProvider;->deleteDocument(Ljava/lang/String;)V
+
+ return-void
+.end method
+
+.method public final renameDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+ .registers 6
+
+ const/4 v0, 0x1
+
+ invoke-virtual {p0, p1, v0}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File;
+
+ move-result-object v0
+
+ if-eqz v0, :cond_3c
+
+ new-instance v1, Ljava/io/File;
+
+ invoke-virtual {v0}, Ljava/io/File;->getParentFile()Ljava/io/File;
+
+ move-result-object v2
+
+ invoke-direct {v1, v2, p2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
+
+ invoke-virtual {v0, v1}, Ljava/io/File;->renameTo(Ljava/io/File;)Z
+
+ move-result v0
+
+ if-eqz v0, :cond_3c
+
+ invoke-virtual {p1}, Ljava/lang/String;->length()I
+
+ move-result v0
+
+ add-int/lit8 v0, v0, -0x2
+
+ const/16 v1, 0x2f
+
+ invoke-virtual {p1, v1, v0}, Ljava/lang/String;->lastIndexOf(II)I
+
+ move-result v0
+
+ new-instance v1, Ljava/lang/StringBuilder;
+
+ invoke-direct {v1}, Ljava/lang/StringBuilder;->()V
+
+ const/4 v2, 0x0
+
+ invoke-virtual {p1, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ const-string p1, "/"
+
+ invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ return-object p1
+
+ :cond_3c
+ new-instance v0, Ljava/io/FileNotFoundException;
+
+ new-instance v1, Ljava/lang/StringBuilder;
+
+ const-string v2, "Failed to rename document "
+
+ invoke-direct {v1, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
+
+ invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ const-string p1, " to "
+
+ invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+ move-result-object p1
+
+ invoke-direct {v0, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V
+
+ throw v0
+.end method
diff --git a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali
new file mode 100644
index 0000000..81cf1a5
--- /dev/null
+++ b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali
@@ -0,0 +1,26 @@
+# classes3.dex
+
+.class public Lbin/mt/file/content/MTDataFilesWakeUpActivity;
+.super Landroid/app/Activity;
+
+
+# direct methods
+.method public constructor ()V
+ .registers 1
+
+ invoke-direct {p0}, Landroid/app/Activity;->()V
+
+ return-void
+.end method
+
+
+# virtual methods
+.method public final onCreate(Landroid/os/Bundle;)V
+ .registers 2
+
+ invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
+
+ invoke-virtual {p0}, Landroid/app/Activity;->finish()V
+
+ return-void
+.end method
From eac59f213740547940b5561429f7931d886a3640 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 20:46:53 +0800
Subject: [PATCH 10/21] Add MTDataFilesProvider to acknowledgments
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 2a269ae..c48b719 100644
--- a/README.md
+++ b/README.md
@@ -84,7 +84,7 @@
1. [JMBQ/azurlane](https://github.com/JMBQ/azurlane)
2. [n0k0m3/PerseusCI](https://github.com/n0k0m3/PerseusCI)
-
+3. [L-JINBIN/MTDataFilesProvider](https://github.com/L-JINBIN/MTDataFilesProvider)
---
## 📊 Star历史
From 9e4f7ca0012bd8151aca148c4d155459dcec94aa Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 21:31:38 +0800
Subject: [PATCH 11/21] Add files via upload
---
RELEASE_NOTES.md | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 RELEASE_NOTES.md
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
new file mode 100644
index 0000000..f96c936
--- /dev/null
+++ b/RELEASE_NOTES.md
@@ -0,0 +1,21 @@
+
+中文安装说明 - 点击展开
+
+1. 在下方列表中找到你需要的版本前缀,下载该服务器名称前缀的所有以 `7z.00*` 结尾的分卷文件。
+2. 解压时,只需要右键选择 `XXX.7z.001` 进行解压,解压软件会自动处理后续分卷。
+3. 在解压后的文件夹中找到对应的安装包并安装(具体安装方法请自行查阅相关教程)。
+
+
+
+
+English Installation Instructions - Click to expand
+
+1. Find the version prefix you need in the list below, and download all files ending with `7z.00*` that share the same server name prefix.
+2. When extracting, simply select the `XXX.7z.001` file to decompress, and the software will automatically process the rest of the volumes.
+3. Find the installation package in the extracted folder and install it (please refer to relevant tutorials for installation methods).
+
+
+
+### 📝 更新日志 / Changelog
+- **[新增]** “文件提供器”(File Provider),方便免 Root 用户修改文件。
+- **[New]** Added "File Provider", making it easier for non-root users to modify files.
From 0f8a088a36a3404818198ac3e85ccbafac13bd0d Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 21:33:32 +0800
Subject: [PATCH 12/21] Add dynamic release notes generation step
Added a step to generate dynamic release notes before creating the release.
---
.github/workflows/main.yml | 25 ++++++++++---------------
1 file changed, 10 insertions(+), 15 deletions(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index fb37105..0e00232 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -46,7 +46,15 @@ jobs:
chmod +x merge_build.sh
./merge_build.sh "${{ github.event.inputs.server_name }}" "${{ github.event.inputs.download_url }}"
- # 步骤6:创建 Release 并上传所有分卷文件
+ # 步骤6: 动态拼接 Release 简介
+ - name: Generate Release Notes
+ run: |
+ cp RELEASE_NOTES.md current_release.md
+
+ echo "" >> current_release.md
+ echo "### 📦 本次构建动态信息" >> current_release.md
+
+ # 步骤7:创建 Release 并上传所有分卷文件
- name: Release and Upload Assets
uses: ncipollo/release-action@v1
with:
@@ -54,17 +62,4 @@ jobs:
name: "AzurLane JMBQ ${{ env.JMBQ_VERSION }} Build APK"
artifacts: "${{ github.event.inputs.server_name }}-V.${{ env.VERSION }}.7z.*"
allowUpdates: true
- body: |
-
- 中文安装说明 - 点击展开
- 1. 在下方列表中找到你需要的版本前缀,下载该服务器名称前缀的所有以 7z.00* 结尾的文件
- 2. 解压时只需要选择"XXX.7z.001"解压即可
- 3. 在解压后的文件夹中找到apk文件并安装
-
-
-
- English Installation Instructions - Click to expand
- 1. Find the version prefix you need in the list below, and download all files ending with 7z.00* that have that server name prefix
- 2. When extracting, simply select the "XXX.7z.001" file to decompress
- 3. Find the APK file in the extracted folder and install it
-
+ bodyFile: "current_release.md"
From 81318f14627bfc9777698788b3eaab71ac109e71 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 21:35:05 +0800
Subject: [PATCH 13/21] Refactor release notes handling in xapk.yml
Updated release notes generation to use current_release.md and removed inline installation instructions.
---
.github/workflows/xapk.yml | 22 ++++++++--------------
1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/.github/workflows/xapk.yml b/.github/workflows/xapk.yml
index c3a37d9..75eea22 100644
--- a/.github/workflows/xapk.yml
+++ b/.github/workflows/xapk.yml
@@ -40,6 +40,13 @@ jobs:
chmod +x merge_build.sh
./merge_build.sh "${{ github.event.inputs.region }}"
+ - name: Generate Release Notes
+ run: |
+ cp RELEASE_NOTES.md current_release.md
+
+ echo "" >> current_release.md
+ echo "### 📦 Build Details" >> current_release.md
+
- name: Release and Upload Assets
uses: ncipollo/release-action@v1
with:
@@ -47,17 +54,4 @@ jobs:
name: "AzurLane JMBQ ${{ env.JMBQ_VERSION }} Build XAPK"
artifacts: "${{ github.event.inputs.region }}-V.${{ env.VERSION }}.7z.*"
allowUpdates: true
- body: |
-
- 中文安装说明 - 点击展开
- 1. 在下方列表中找到你需要的版本前缀,下载该服务器名称前缀的所有以 7z.00* 结尾的文件
- 2. 解压时只需要选择"XXX.7z.001"解压即可
- 3. 在解压后的文件夹中找到xapk文件并安装,安装方法请自行查询相关教程
-
-
-
- English Installation Instructions - Click to expand
- 1. Find the version prefix you need in the list below, and download all files ending with 7z.00* that have that server name prefix
- 2. When extracting, simply select the "XXX.7z.001" file to decompress
- 3. Find the XAPK file in the extracted folder and install it, please refer to the relevant tutorials for installation methods
-
+ bodyFile: "current_release.md"
From 75ec57416ce04d70aa6c35260ce67b9fba619aa3 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 21:37:12 +0800
Subject: [PATCH 14/21] Update main.yml
---
.github/workflows/main.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 0e00232..132f756 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -52,7 +52,6 @@ jobs:
cp RELEASE_NOTES.md current_release.md
echo "" >> current_release.md
- echo "### 📦 本次构建动态信息" >> current_release.md
# 步骤7:创建 Release 并上传所有分卷文件
- name: Release and Upload Assets
From 128ef73d3f5f78893e58901cdb8c2eba4e307f4d Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 21:37:25 +0800
Subject: [PATCH 15/21] Remove build details from current_release.md
Remove build details section from release notes.
---
.github/workflows/xapk.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.github/workflows/xapk.yml b/.github/workflows/xapk.yml
index 75eea22..37eb0c7 100644
--- a/.github/workflows/xapk.yml
+++ b/.github/workflows/xapk.yml
@@ -45,7 +45,6 @@ jobs:
cp RELEASE_NOTES.md current_release.md
echo "" >> current_release.md
- echo "### 📦 Build Details" >> current_release.md
- name: Release and Upload Assets
uses: ncipollo/release-action@v1
From 4496d3f5471bf6902fc255ca92d4db44e90195fa Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 22:07:38 +0800
Subject: [PATCH 16/21] Update RELEASE_NOTES.md
---
RELEASE_NOTES.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index f96c936..bcc9e81 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -19,3 +19,7 @@
### 📝 更新日志 / Changelog
- **[新增]** “文件提供器”(File Provider),方便免 Root 用户修改文件。
- **[New]** Added "File Provider", making it easier for non-root users to modify files.
+
+### 🪄使用方法
+- [注入文件提供器](https://mt2.cn/guide/reverse/inject-documents-provider.html#%E6%B7%BB%E5%8A%A0%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8)
+- [Data Files Provider](https://mt2.cn/guide/reverse/inject-documents-provider.html#%E6%B7%BB%E5%8A%A0%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8)
From 6bf3da7f2d4aa8bf2c6602ea22ee3308e0919f31 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 23:06:00 +0800
Subject: [PATCH 17/21] Update merge_build.sh
---
merge_build.sh | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/merge_build.sh b/merge_build.sh
index 1d4daac..b0d6514 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -384,14 +384,18 @@ INJECT_MT_PROVIDER() {
# 2. 拷贝 Smali 文件 (保持 bin/mt/file/content/ 结构)
mkdir -p "${TARGET_DIR}/smali"
- if [ -d "MTDataFilesProvider/bin" ]; then
- cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali/"
- echo "Smali 文件拷贝完成"
- else
+ if [ ! -d "MTDataFilesProvider/bin" ]; then
echo "未找到 MTDataFilesProvider/bin 目录,请检查路径"
return 1
fi
-
+ if [ -d "${TARGET_DIR}/smali_classes2" ]; then
+ cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/"
+ echo "Smali 文件成功拷贝至 smali_classes2 (规避 64K 限制)"
+ else [ -d "${TARGET_DIR}/smali_classes3" ]; then
+ cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/"
+ echo "Smali 文件成功拷贝至 smali_classes3 (规避 64K 限制)"
+ fi
+
# 3. 修改 AndroidManifest.xml
if grep -q "MTDataFilesProvider" "${MANIFEST_FILE}"; then
echo "已存在 MT 组件,跳过修改"
From 9bcf12a0aa9fcda38971093357e623f7b300435b Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 23:18:52 +0800
Subject: [PATCH 18/21] Update merge_build.sh
---
merge_build.sh | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/merge_build.sh b/merge_build.sh
index b0d6514..749ae31 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -388,10 +388,11 @@ INJECT_MT_PROVIDER() {
echo "未找到 MTDataFilesProvider/bin 目录,请检查路径"
return 1
fi
+
if [ -d "${TARGET_DIR}/smali_classes2" ]; then
cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/"
echo "Smali 文件成功拷贝至 smali_classes2 (规避 64K 限制)"
- else [ -d "${TARGET_DIR}/smali_classes3" ]; then
+ else
cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/"
echo "Smali 文件成功拷贝至 smali_classes3 (规避 64K 限制)"
fi
From d4c83c4f97e4309a2439f7936fe84e0c81c04eeb Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sat, 9 May 2026 23:23:17 +0800
Subject: [PATCH 19/21] Fix copy destination for smali_classes directories
---
merge_build.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/merge_build.sh b/merge_build.sh
index 749ae31..1a909d5 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -390,10 +390,10 @@ INJECT_MT_PROVIDER() {
fi
if [ -d "${TARGET_DIR}/smali_classes2" ]; then
- cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/"
+ cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/"
echo "Smali 文件成功拷贝至 smali_classes2 (规避 64K 限制)"
else
- cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/"
+ cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/"
echo "Smali 文件成功拷贝至 smali_classes3 (规避 64K 限制)"
fi
From 00402c923af665897c7cf50449bd630f3a915640 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Thu, 14 May 2026 14:36:19 +0800
Subject: [PATCH 20/21] Handle failure case in AndroidManifest injection
Add return statement for failure case in manifest injection.
---
merge_build.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/merge_build.sh b/merge_build.sh
index 1a909d5..1a36e3d 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -412,6 +412,7 @@ INJECT_MT_PROVIDER() {
echo "AndroidManifest.xml 注入成功!"
else
echo "AndroidManifest.xml 注入失败!"
+ return 1
fi
fi
}
From d8bd2bfbc149a854eedc35a0039213882d52bc53 Mon Sep 17 00:00:00 2001
From: azzzddddd <105015339+azzzddddd@users.noreply.github.com>
Date: Sun, 24 May 2026 20:17:20 +0800
Subject: [PATCH 21/21] Refactor MOD patch download and extraction logic
Updated download logic for MOD patches to prioritize the latest release and improved error handling for file extraction.
---
merge_build.sh | 38 +-------------------------------------
1 file changed, 1 insertion(+), 37 deletions(-)
diff --git a/merge_build.sh b/merge_build.sh
index 1a36e3d..d27b815 100644
--- a/merge_build.sh
+++ b/merge_build.sh
@@ -122,45 +122,9 @@ DOWNLOAD_MOD_MENU() {
local FILENAME="MOD_MENU.rar"
echo "正在下载MOD补丁..."
- local API_OLD_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/3.2.0")
local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest")
local JMBQ_VERSION=$(echo "${API_RESPONSE}" | jq -r '.tag_name')
- # 修改:查找name中含有.rar的文件,而不是直接使用第一个assets
- local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1)
- if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then
- # 修改:查找name中含有.zip的文件,避免后缀不一致导致的无法获取链接
- local FILENAME="MOD_MENU.zip"
- local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".zip")) | .browser_download_url' | head -n 1)
- if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then
- echo "无法获取MOD Patch文件下载链接"
- exit 1
- fi
- fi
-
- curl -L -o "${DOWNLOAD_DIR}/${FILENAME}" "${DOWNLOAD_OLD_LINK}"
- if [ $? -eq 0 ]; then
- echo "旧版补丁下载成功!文件保存至:${DOWNLOAD_DIR}/${FILENAME}"
- else
- echo "旧版补丁下载失败,请重试"
- exit 1
- fi
-
- if command -v 7z &> /dev/null; then
- 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ"
- else
- echo "错误: 未找到7z工具,无法解压!"
- exit 1
- fi
-
- if [ $? -ne 0 ]; then
- echo "错误: 解压 ${FILENAME} 失败!"
- exit 1
- fi
-
- echo "正在下载MOD补丁..."
- # 恢复原命名防止逻辑报错
- FILENAME="MOD_MENU.rar"
# 修改:查找name中含有.rar的文件,而不是直接使用第一个assets
local DOWNLOAD_LINK=$(echo "${API_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1)
@@ -183,7 +147,7 @@ DOWNLOAD_MOD_MENU() {
fi
if command -v 7z &> /dev/null; then
- 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ/assets/arch"
+ 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ"
else
echo "错误: 未找到7z工具,无法解压!"
exit 1