diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index a1757ae..3058433 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -4,5 +4,6 @@
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 5cd135a..9bba60d 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -14,6 +14,7 @@
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 7bfef59..d5d35ec 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index fab6e19..82487c3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
applicationId "com.zane.smapiinstaller"
minSdkVersion 19
targetSdkVersion 30
- versionCode 60
- versionName "1.7.0"
+ versionCode 63
+ versionName "3.7.6.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
@@ -65,7 +65,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.2.1'
- implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "androidx.navigation:navigation-fragment:2.3.1"
implementation "androidx.navigation:navigation-ui:2.3.1"
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
@@ -82,7 +82,7 @@ dependencies {
// https://mvnrepository.com/artifact/org.zeroturnaround/zt-zip
implementation group: 'org.zeroturnaround', name: 'zt-zip', version: '1.14'
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
- implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.10'
+ implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.11'
// https://mvnrepository.com/artifact/commons-io/commons-io
implementation group: 'commons-io', name: 'commons-io', version: '2.7'
implementation 'com.lzy.net:okgo:3.0.4'
@@ -90,6 +90,8 @@ dependencies {
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.11.0'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.0'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.11.0'
+ // https://mvnrepository.com/artifact/org.lz4/lz4-java
+ compile group: 'org.lz4', name: 'lz4-java', version: '1.7.1'
implementation 'com.github.didikee:AndroidDonate:0.1.0'
implementation 'com.hjq:language:3.0'
@@ -106,7 +108,7 @@ dependencies {
implementation "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}"
implementation "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}"
- compileOnly 'org.projectlombok:lombok:1.18.12'
- annotationProcessor 'org.projectlombok:lombok:1.18.12'
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
+ compileOnly 'org.projectlombok:lombok:1.18.16'
+ annotationProcessor 'org.projectlombok:lombok:1.18.16'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.0'
}
diff --git a/app/src/main/assets/apk/BmFont.dll b/app/src/main/assets/apk/BmFont.dll
new file mode 100644
index 0000000..9e32a9e
Binary files /dev/null and b/app/src/main/assets/apk/BmFont.dll differ
diff --git a/app/src/main/assets/apk/Java.Interop.dll b/app/src/main/assets/apk/Java.Interop.dll
new file mode 100644
index 0000000..f39b756
Binary files /dev/null and b/app/src/main/assets/apk/Java.Interop.dll differ
diff --git a/app/src/main/assets/apk/Mono.Android.dll b/app/src/main/assets/apk/Mono.Android.dll
new file mode 100644
index 0000000..2fe212d
Binary files /dev/null and b/app/src/main/assets/apk/Mono.Android.dll differ
diff --git a/app/src/main/assets/apk/Mono.Security.dll b/app/src/main/assets/apk/Mono.Security.dll
new file mode 100644
index 0000000..dc77592
Binary files /dev/null and b/app/src/main/assets/apk/Mono.Security.dll differ
diff --git a/app/src/main/assets/apk/MonoGame.Framework.Content.Pipeline.dll b/app/src/main/assets/apk/MonoGame.Framework.Content.Pipeline.dll
new file mode 100644
index 0000000..988c783
Binary files /dev/null and b/app/src/main/assets/apk/MonoGame.Framework.Content.Pipeline.dll differ
diff --git a/app/src/main/assets/apk/Newtonsoft.Json.dll b/app/src/main/assets/apk/Newtonsoft.Json.dll
index 8069902..b501fb6 100644
Binary files a/app/src/main/assets/apk/Newtonsoft.Json.dll and b/app/src/main/assets/apk/Newtonsoft.Json.dll differ
diff --git a/app/src/main/assets/apk/OpenTK-1.0.dll b/app/src/main/assets/apk/OpenTK-1.0.dll
new file mode 100644
index 0000000..b0d45e0
Binary files /dev/null and b/app/src/main/assets/apk/OpenTK-1.0.dll differ
diff --git a/app/src/main/assets/apk/SMAPI.Toolkit.CoreInterfaces.dll b/app/src/main/assets/apk/SMAPI.Toolkit.CoreInterfaces.dll
index af06ff8..1e2db88 100644
Binary files a/app/src/main/assets/apk/SMAPI.Toolkit.CoreInterfaces.dll and b/app/src/main/assets/apk/SMAPI.Toolkit.CoreInterfaces.dll differ
diff --git a/app/src/main/assets/apk/SMAPI.Toolkit.dll b/app/src/main/assets/apk/SMAPI.Toolkit.dll
index 37c9b91..fbbeb70 100644
Binary files a/app/src/main/assets/apk/SMAPI.Toolkit.dll and b/app/src/main/assets/apk/SMAPI.Toolkit.dll differ
diff --git a/app/src/main/assets/apk/StardewModdingAPI.dll b/app/src/main/assets/apk/StardewModdingAPI.dll
index 0b27d99..5873c3c 100644
Binary files a/app/src/main/assets/apk/StardewModdingAPI.dll and b/app/src/main/assets/apk/StardewModdingAPI.dll differ
diff --git a/app/src/main/assets/apk/System.ComponentModel.Composition.dll b/app/src/main/assets/apk/System.ComponentModel.Composition.dll
new file mode 100644
index 0000000..34661c0
Binary files /dev/null and b/app/src/main/assets/apk/System.ComponentModel.Composition.dll differ
diff --git a/app/src/main/assets/apk/System.Core.dll b/app/src/main/assets/apk/System.Core.dll
new file mode 100644
index 0000000..4ad7ac3
Binary files /dev/null and b/app/src/main/assets/apk/System.Core.dll differ
diff --git a/app/src/main/assets/apk/System.Data.DataSetExtensions.dll b/app/src/main/assets/apk/System.Data.DataSetExtensions.dll
new file mode 100644
index 0000000..4d892bc
Binary files /dev/null and b/app/src/main/assets/apk/System.Data.DataSetExtensions.dll differ
diff --git a/app/src/main/assets/apk/System.Data.dll b/app/src/main/assets/apk/System.Data.dll
index 81bf743..7bb09b8 100644
Binary files a/app/src/main/assets/apk/System.Data.dll and b/app/src/main/assets/apk/System.Data.dll differ
diff --git a/app/src/main/assets/apk/System.Drawing.Common.dll b/app/src/main/assets/apk/System.Drawing.Common.dll
new file mode 100644
index 0000000..23285d7
Binary files /dev/null and b/app/src/main/assets/apk/System.Drawing.Common.dll differ
diff --git a/app/src/main/assets/apk/System.IO.Compression.FileSystem.dll b/app/src/main/assets/apk/System.IO.Compression.FileSystem.dll
new file mode 100644
index 0000000..082419b
Binary files /dev/null and b/app/src/main/assets/apk/System.IO.Compression.FileSystem.dll differ
diff --git a/app/src/main/assets/apk/System.IO.Compression.dll b/app/src/main/assets/apk/System.IO.Compression.dll
new file mode 100644
index 0000000..5515acb
Binary files /dev/null and b/app/src/main/assets/apk/System.IO.Compression.dll differ
diff --git a/app/src/main/assets/apk/System.Net.Http.dll b/app/src/main/assets/apk/System.Net.Http.dll
new file mode 100644
index 0000000..e7b3cda
Binary files /dev/null and b/app/src/main/assets/apk/System.Net.Http.dll differ
diff --git a/app/src/main/assets/apk/System.Numerics.dll b/app/src/main/assets/apk/System.Numerics.dll
index 05fa568..8613f35 100644
Binary files a/app/src/main/assets/apk/System.Numerics.dll and b/app/src/main/assets/apk/System.Numerics.dll differ
diff --git a/app/src/main/assets/apk/System.Runtime.Serialization.dll b/app/src/main/assets/apk/System.Runtime.Serialization.dll
new file mode 100644
index 0000000..915f27c
Binary files /dev/null and b/app/src/main/assets/apk/System.Runtime.Serialization.dll differ
diff --git a/app/src/main/assets/apk/System.Runtime.dll b/app/src/main/assets/apk/System.Runtime.dll
new file mode 100644
index 0000000..c124dbf
Binary files /dev/null and b/app/src/main/assets/apk/System.Runtime.dll differ
diff --git a/app/src/main/assets/apk/System.ServiceModel.Internals.dll b/app/src/main/assets/apk/System.ServiceModel.Internals.dll
new file mode 100644
index 0000000..8ad7e8b
Binary files /dev/null and b/app/src/main/assets/apk/System.ServiceModel.Internals.dll differ
diff --git a/app/src/main/assets/apk/System.Transactions.dll b/app/src/main/assets/apk/System.Transactions.dll
new file mode 100644
index 0000000..f4d7173
Binary files /dev/null and b/app/src/main/assets/apk/System.Transactions.dll differ
diff --git a/app/src/main/assets/apk/System.Web.Services.dll b/app/src/main/assets/apk/System.Web.Services.dll
new file mode 100644
index 0000000..a09906a
Binary files /dev/null and b/app/src/main/assets/apk/System.Web.Services.dll differ
diff --git a/app/src/main/assets/apk/System.Xml.dll b/app/src/main/assets/apk/System.Xml.dll
new file mode 100644
index 0000000..93729da
Binary files /dev/null and b/app/src/main/assets/apk/System.Xml.dll differ
diff --git a/app/src/main/assets/apk/System.dll b/app/src/main/assets/apk/System.dll
new file mode 100644
index 0000000..d5969bf
Binary files /dev/null and b/app/src/main/assets/apk/System.dll differ
diff --git a/app/src/main/assets/apk/classes.dex b/app/src/main/assets/apk/classes.dex
index f6b4037..71462d2 100644
Binary files a/app/src/main/assets/apk/classes.dex and b/app/src/main/assets/apk/classes.dex differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libmono-btls-shared.so b/app/src/main/assets/apk/lib/arm64-v8a/libmono-btls-shared.so
new file mode 100644
index 0000000..0ba8f1b
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libmono-btls-shared.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libmono-native.so b/app/src/main/assets/apk/lib/arm64-v8a/libmono-native.so
new file mode 100644
index 0000000..af3456b
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libmono-native.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libmono-profiler-log.so b/app/src/main/assets/apk/lib/arm64-v8a/libmono-profiler-log.so
new file mode 100644
index 0000000..d3884d0
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libmono-profiler-log.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libmonodroid.so b/app/src/main/assets/apk/lib/arm64-v8a/libmonodroid.so
new file mode 100644
index 0000000..3cb8630
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libmonodroid.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libmonosgen-2.0.so b/app/src/main/assets/apk/lib/arm64-v8a/libmonosgen-2.0.so
new file mode 100644
index 0000000..68108e7
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libmonosgen-2.0.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libopenal32.so b/app/src/main/assets/apk/lib/arm64-v8a/libopenal32.so
new file mode 100644
index 0000000..48ab023
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libopenal32.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libxamarin-app.so b/app/src/main/assets/apk/lib/arm64-v8a/libxamarin-app.so
new file mode 100644
index 0000000..806939c
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libxamarin-app.so differ
diff --git a/app/src/main/assets/apk/lib/arm64-v8a/libxamarin-debug-app-helper.so b/app/src/main/assets/apk/lib/arm64-v8a/libxamarin-debug-app-helper.so
new file mode 100644
index 0000000..dcf2eaf
Binary files /dev/null and b/app/src/main/assets/apk/lib/arm64-v8a/libxamarin-debug-app-helper.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libmono-btls-shared.so b/app/src/main/assets/apk/lib/armeabi-v7a/libmono-btls-shared.so
new file mode 100644
index 0000000..497fdd8
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libmono-btls-shared.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libmono-native.so b/app/src/main/assets/apk/lib/armeabi-v7a/libmono-native.so
new file mode 100644
index 0000000..22bc517
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libmono-native.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libmono-profiler-log.so b/app/src/main/assets/apk/lib/armeabi-v7a/libmono-profiler-log.so
new file mode 100644
index 0000000..69e4b5f
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libmono-profiler-log.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libmonodroid.so b/app/src/main/assets/apk/lib/armeabi-v7a/libmonodroid.so
new file mode 100644
index 0000000..4dd9cd4
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libmonodroid.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libmonosgen-2.0.so b/app/src/main/assets/apk/lib/armeabi-v7a/libmonosgen-2.0.so
new file mode 100644
index 0000000..a4a282c
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libmonosgen-2.0.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libopenal32.so b/app/src/main/assets/apk/lib/armeabi-v7a/libopenal32.so
new file mode 100644
index 0000000..4a28a13
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libopenal32.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libxamarin-app.so b/app/src/main/assets/apk/lib/armeabi-v7a/libxamarin-app.so
new file mode 100644
index 0000000..ddd2429
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libxamarin-app.so differ
diff --git a/app/src/main/assets/apk/lib/armeabi-v7a/libxamarin-debug-app-helper.so b/app/src/main/assets/apk/lib/armeabi-v7a/libxamarin-debug-app-helper.so
new file mode 100644
index 0000000..82ae817
Binary files /dev/null and b/app/src/main/assets/apk/lib/armeabi-v7a/libxamarin-debug-app-helper.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libmono-btls-shared.so b/app/src/main/assets/apk/lib/x86/libmono-btls-shared.so
new file mode 100644
index 0000000..2d2d787
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libmono-btls-shared.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libmono-native.so b/app/src/main/assets/apk/lib/x86/libmono-native.so
new file mode 100644
index 0000000..a42fee8
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libmono-native.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libmono-profiler-log.so b/app/src/main/assets/apk/lib/x86/libmono-profiler-log.so
new file mode 100644
index 0000000..960d2c7
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libmono-profiler-log.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libmonodroid.so b/app/src/main/assets/apk/lib/x86/libmonodroid.so
new file mode 100644
index 0000000..0e8c03a
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libmonodroid.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libmonosgen-2.0.so b/app/src/main/assets/apk/lib/x86/libmonosgen-2.0.so
new file mode 100644
index 0000000..eb8712b
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libmonosgen-2.0.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libopenal32.so b/app/src/main/assets/apk/lib/x86/libopenal32.so
new file mode 100644
index 0000000..dcd02b0
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libopenal32.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libxamarin-app.so b/app/src/main/assets/apk/lib/x86/libxamarin-app.so
new file mode 100644
index 0000000..c2dfe5b
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libxamarin-app.so differ
diff --git a/app/src/main/assets/apk/lib/x86/libxamarin-debug-app-helper.so b/app/src/main/assets/apk/lib/x86/libxamarin-debug-app-helper.so
new file mode 100644
index 0000000..cc79842
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86/libxamarin-debug-app-helper.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libmono-btls-shared.so b/app/src/main/assets/apk/lib/x86_64/libmono-btls-shared.so
new file mode 100644
index 0000000..c07d6b2
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libmono-btls-shared.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libmono-native.so b/app/src/main/assets/apk/lib/x86_64/libmono-native.so
new file mode 100644
index 0000000..095c398
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libmono-native.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libmono-profiler-log.so b/app/src/main/assets/apk/lib/x86_64/libmono-profiler-log.so
new file mode 100644
index 0000000..fcc5fe3
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libmono-profiler-log.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libmonodroid.so b/app/src/main/assets/apk/lib/x86_64/libmonodroid.so
new file mode 100644
index 0000000..0312497
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libmonodroid.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libmonosgen-2.0.so b/app/src/main/assets/apk/lib/x86_64/libmonosgen-2.0.so
new file mode 100644
index 0000000..4f77213
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libmonosgen-2.0.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libopenal32.so b/app/src/main/assets/apk/lib/x86_64/libopenal32.so
new file mode 100644
index 0000000..7da1505
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libopenal32.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libxamarin-app.so b/app/src/main/assets/apk/lib/x86_64/libxamarin-app.so
new file mode 100644
index 0000000..a565875
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libxamarin-app.so differ
diff --git a/app/src/main/assets/apk/lib/x86_64/libxamarin-debug-app-helper.so b/app/src/main/assets/apk/lib/x86_64/libxamarin-debug-app-helper.so
new file mode 100644
index 0000000..407db96
Binary files /dev/null and b/app/src/main/assets/apk/lib/x86_64/libxamarin-debug-app-helper.so differ
diff --git a/app/src/main/assets/apk/mscorlib.dll b/app/src/main/assets/apk/mscorlib.dll
new file mode 100644
index 0000000..a2ac827
Binary files /dev/null and b/app/src/main/assets/apk/mscorlib.dll differ
diff --git a/app/src/main/assets/apk/netstandard.dll b/app/src/main/assets/apk/netstandard.dll
new file mode 100644
index 0000000..118f814
Binary files /dev/null and b/app/src/main/assets/apk/netstandard.dll differ
diff --git a/app/src/main/assets/apk/xTile.dll b/app/src/main/assets/apk/xTile.dll
new file mode 100644
index 0000000..96f5562
Binary files /dev/null and b/app/src/main/assets/apk/xTile.dll differ
diff --git a/app/src/main/assets/apk_files_manifest.json b/app/src/main/assets/apk_files_manifest.json
index 949091a..7f3dfe3 100644
--- a/app/src/main/assets/apk_files_manifest.json
+++ b/app/src/main/assets/apk_files_manifest.json
@@ -1,5 +1,5 @@
{
- "minBuildCode": 138,
+ "minBuildCode": 148,
"maxBuildCode": null,
"basePath": "",
"targetPackageName": [
@@ -45,47 +45,78 @@
"external": false
},
{
- "targetPath": "assemblies/Newtonsoft.Json.dll",
- "assetPath": "apk/Newtonsoft.Json.dll",
+ "targetPath": "assemblies/",
+ "assetPath": "apk/*.dll",
"compression": 0,
"external": false
},
{
- "targetPath": "assemblies/SMAPI.Toolkit.CoreInterfaces.dll",
- "assetPath": "apk/SMAPI.Toolkit.CoreInterfaces.dll",
+ "targetPath": "lib/arm64-v8a/",
+ "assetPath": "apk/lib/arm64-v8a/*.so",
+ "compression": 8,
+ "external": false
+ },
+ {
+ "targetPath": "lib/armeabi-v7a/",
+ "assetPath": "apk/lib/armeabi-v7a/*.so",
+ "compression": 8,
+ "external": false
+ },
+ {
+ "targetPath": "lib/x86/",
+ "assetPath": "apk/lib/x86/*.so",
+ "compression": 8,
+ "external": false
+ },
+ {
+ "targetPath": "lib/x86_64/",
+ "assetPath": "apk/lib/x86_64/*.so",
+ "compression": 8,
+ "external": false
+ },
+ {
+ "targetPath": "assemblies/0Harmony.dll",
+ "assetPath": "smapi/0Harmony.dll",
"compression": 0,
"external": false
},
{
- "targetPath": "assemblies/SMAPI.Toolkit.dll",
- "assetPath": "apk/SMAPI.Toolkit.dll",
+ "targetPath": "assemblies/Mono.Cecil.dll",
+ "assetPath": "smapi/Mono.Cecil.dll",
"compression": 0,
"external": false
},
{
- "targetPath": "assemblies/StardewModdingAPI.dll",
- "assetPath": "apk/StardewModdingAPI.dll",
+ "targetPath": "assemblies/MonoMod.RuntimeDetour.dll",
+ "assetPath": "smapi/MonoMod.RuntimeDetour.dll",
"compression": 0,
"external": false
},
{
- "targetPath": "assemblies/System.Data.dll",
- "assetPath": "apk/System.Data.dll",
+ "targetPath": "assemblies/MonoMod.Utils.dll",
+ "assetPath": "smapi/MonoMod.Utils.dll",
"compression": 0,
"external": false
},
{
- "targetPath": "assemblies/System.Numerics.dll",
- "assetPath": "apk/System.Numerics.dll",
+ "targetPath": "assemblies/System.Xml.Linq.dll",
+ "assetPath": "smapi/System.Xml.Linq.dll",
"compression": 0,
"external": false
},
{
- "targetPath": "assemblies/MonoGame.Framework.dll",
- "assetPath": "apk/MonoGame.Framework.dll",
+ "targetPath": "assemblies/TMXTile.dll",
+ "assetPath": "smapi/TMXTile.dll",
"compression": 0,
- "external": false,
- "advanced": true
+ "external": false
+ },
+ {
+ "targetPath": "assemblies/",
+ "assetPath": "assemblies/*.dll",
+ "origin": 1,
+ "isXALZ": true,
+ "compression": 0,
+ "external": false
}
]
}
\ No newline at end of file
diff --git a/app/src/main/assets/downloadable_content_list.json b/app/src/main/assets/downloadable_content_list.json
index c8f6acf..d23a079 100644
--- a/app/src/main/assets/downloadable_content_list.json
+++ b/app/src/main/assets/downloadable_content_list.json
@@ -1,6 +1,14 @@
{
- "version": 31,
+ "version": 32,
"contents": [
+ {
+ "type": "COMPAT",
+ "name": "SMAPI for 1.4.5.145",
+ "assetPath": "compat/145/",
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_145_210128.zip",
+ "hash": "3424287f98e9cfdd2a653e2e06b1b88f2f3080f7e56a976a8de9cc36afdede8a"
+ },
{
"type": "COMPAT",
"name": "SMAPI for 1.4.5.137",
@@ -13,17 +21,17 @@
"type": "COMPAT",
"name": "SMAPI for Galaxy Store",
"assetPath": "compat/samsung_138/",
- "description": "SMAPI compat package for game 1.4.4.138 - latest, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_samsung_138_201019.zip",
- "hash": "648c4b387c5b61642614aa6677909a755a9b84fd96d717703fc83f5f73f515c0"
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_samsung_145_210128.zip",
+ "hash": "256d1a4f6ccfcae916f22575f04d8f677e91ae85b24993f010552cffb401e6a0"
},
{
"type": "COMPAT",
"name": "SMAPI for Amazon Store",
"assetPath": "compat/amazon_138/",
- "description": "SMAPI compat package for game 1.4.4.138 - latest, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_amazon_138_201019.zip",
- "hash": "1c826b1419491cae063fd046131873f30640b841f2e8e6498d3f23ad82988d87"
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_amazon_145_210128.zip",
+ "hash": "3e461ae9dcb6269340bfc923b720dd9f0f9c724acb66807b68571779e575c4e3"
},
{
"type": "LOCALE",
diff --git a/app/src/main/assets/downloadable_content_list.json.en b/app/src/main/assets/downloadable_content_list.json.en
index c8f6acf..d23a079 100644
--- a/app/src/main/assets/downloadable_content_list.json.en
+++ b/app/src/main/assets/downloadable_content_list.json.en
@@ -1,6 +1,14 @@
{
- "version": 31,
+ "version": 32,
"contents": [
+ {
+ "type": "COMPAT",
+ "name": "SMAPI for 1.4.5.145",
+ "assetPath": "compat/145/",
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_145_210128.zip",
+ "hash": "3424287f98e9cfdd2a653e2e06b1b88f2f3080f7e56a976a8de9cc36afdede8a"
+ },
{
"type": "COMPAT",
"name": "SMAPI for 1.4.5.137",
@@ -13,17 +21,17 @@
"type": "COMPAT",
"name": "SMAPI for Galaxy Store",
"assetPath": "compat/samsung_138/",
- "description": "SMAPI compat package for game 1.4.4.138 - latest, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_samsung_138_201019.zip",
- "hash": "648c4b387c5b61642614aa6677909a755a9b84fd96d717703fc83f5f73f515c0"
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_samsung_145_210128.zip",
+ "hash": "256d1a4f6ccfcae916f22575f04d8f677e91ae85b24993f010552cffb401e6a0"
},
{
"type": "COMPAT",
"name": "SMAPI for Amazon Store",
"assetPath": "compat/amazon_138/",
- "description": "SMAPI compat package for game 1.4.4.138 - latest, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_amazon_138_201019.zip",
- "hash": "1c826b1419491cae063fd046131873f30640b841f2e8e6498d3f23ad82988d87"
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_amazon_145_210128.zip",
+ "hash": "3e461ae9dcb6269340bfc923b720dd9f0f9c724acb66807b68571779e575c4e3"
},
{
"type": "LOCALE",
diff --git a/app/src/main/assets/downloadable_content_list.json.in b/app/src/main/assets/downloadable_content_list.json.in
index ec5d3c9..0878f98 100644
--- a/app/src/main/assets/downloadable_content_list.json.in
+++ b/app/src/main/assets/downloadable_content_list.json.in
@@ -1,6 +1,14 @@
{
- "version": 31,
+ "version": 32,
"contents": [
+ {
+ "type": "COMPAT",
+ "name": "SMAPI for 1.4.5.145",
+ "assetPath": "compat/145/",
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_145_210128.zip",
+ "hash": "3424287f98e9cfdd2a653e2e06b1b88f2f3080f7e56a976a8de9cc36afdede8a"
+ },
{
"type": "COMPAT",
"name": "SMAPI untuk 1.4.5.137",
@@ -13,17 +21,17 @@
"type": "COMPAT",
"name": "SMAPI untuk Galaxy Store",
"assetPath": "compat/samsung_138/",
- "description": "Paket kompatibilitas SMAPI untuk versi 1.4.4.138 - terbaru, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_samsung_138_201019.zip",
- "hash": "648c4b387c5b61642614aa6677909a755a9b84fd96d717703fc83f5f73f515c0"
+ "description": "Paket kompatibilitas SMAPI untuk versi 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_samsung_145_210128.zip",
+ "hash": "256d1a4f6ccfcae916f22575f04d8f677e91ae85b24993f010552cffb401e6a0"
},
{
"type": "COMPAT",
"name": "SMAPI untuk Amazon Store",
"assetPath": "compat/amazon_138/",
- "description": "Paket kompatibilitas SMAPI untuk versi 1.4.4.138 - terbaru, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_amazon_138_201019.zip",
- "hash": "1c826b1419491cae063fd046131873f30640b841f2e8e6498d3f23ad82988d87"
+ "description": "Paket kompatibilitas SMAPI untuk versi 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_amazon_145_210128.zip",
+ "hash": "3e461ae9dcb6269340bfc923b720dd9f0f9c724acb66807b68571779e575c4e3"
},
{
"type": "LOCAL",
diff --git a/app/src/main/assets/downloadable_content_list.json.th b/app/src/main/assets/downloadable_content_list.json.th
index b6c47f2..486bbb0 100644
--- a/app/src/main/assets/downloadable_content_list.json.th
+++ b/app/src/main/assets/downloadable_content_list.json.th
@@ -1,6 +1,14 @@
{
- "version": 31,
+ "version": 32,
"contents": [
+ {
+ "type": "COMPAT",
+ "name": "SMAPI for 1.4.5.145",
+ "assetPath": "compat/145/",
+ "description": "SMAPI compat package for game 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_145_210128.zip",
+ "hash": "3424287f98e9cfdd2a653e2e06b1b88f2f3080f7e56a976a8de9cc36afdede8a"
+ },
{
"type": "COMPAT",
"name": "SMAPI สำหรับ 1.4.5.137",
@@ -13,17 +21,17 @@
"type": "COMPAT",
"name": "SMAPI สำหรับ Galaxy Store",
"assetPath": "compat/samsung_138/",
- "description": "แพคเกจแอพลิเคชั่น SMAPI สำหรับเกม Stardew Valley เวอร์ชั่น 1.4.4.138 - ล่าสุด, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_samsung_138_201019.zip",
- "hash": "648c4b387c5b61642614aa6677909a755a9b84fd96d717703fc83f5f73f515c0"
+ "description": "แพคเกจแอพลิเคชั่น SMAPI สำหรับเกม Stardew Valley เวอร์ชั่น 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_samsung_145_210128.zip",
+ "hash": "256d1a4f6ccfcae916f22575f04d8f677e91ae85b24993f010552cffb401e6a0"
},
{
"type": "COMPAT",
"name": "SMAPI สำหรับ Amazon Store",
"assetPath": "compat/amazon_138/",
- "description": "แพคเกจแอพลิเคชั่น SMAPI สำหรับเกม Stardew Valley เวอร์ชั่น 1.4.4.138 - ล่าสุด, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_amazon_138_201019.zip",
- "hash": "1c826b1419491cae063fd046131873f30640b841f2e8e6498d3f23ad82988d87"
+ "description": "แพคเกจแอพลิเคชั่น SMAPI สำหรับเกม Stardew Valley เวอร์ชั่น 1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_amazon_145_210128.zip",
+ "hash": "3e461ae9dcb6269340bfc923b720dd9f0f9c724acb66807b68571779e575c4e3"
},
{
"type": "LOCALE",
diff --git a/app/src/main/assets/downloadable_content_list.json.zh b/app/src/main/assets/downloadable_content_list.json.zh
index bdb4e97..5635288 100644
--- a/app/src/main/assets/downloadable_content_list.json.zh
+++ b/app/src/main/assets/downloadable_content_list.json.zh
@@ -1,6 +1,14 @@
{
- "version": 31,
+ "version": 32,
"contents": [
+ {
+ "type": "COMPAT",
+ "name": "SMAPI兼容包 1.4.5.145",
+ "assetPath": "compat/145/",
+ "description": "SMAPI兼容包, 适用版本1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_145_210128.zip",
+ "hash": "3424287f98e9cfdd2a653e2e06b1b88f2f3080f7e56a976a8de9cc36afdede8a"
+ },
{
"type": "COMPAT",
"name": "SMAPI兼容包 1.4.5.137",
@@ -13,17 +21,17 @@
"type": "COMPAT",
"name": "SMAPI三星商店兼容包",
"assetPath": "compat/samsung_138/",
- "description": "SMAPI三星商店兼容包, 适用版本1.4.4.138至今, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_samsung_138_201019.zip",
- "hash": "648c4b387c5b61642614aa6677909a755a9b84fd96d717703fc83f5f73f515c0"
+ "description": "SMAPI三星商店兼容包, 适用版本1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_samsung_145_210128.zip",
+ "hash": "256d1a4f6ccfcae916f22575f04d8f677e91ae85b24993f010552cffb401e6a0"
},
{
"type": "COMPAT",
"name": "SMAPI亚马逊商店兼容包",
"assetPath": "compat/amazon_138/",
- "description": "SMAPI亚马逊商店兼容包, 适用版本1.4.4.138至今, SMAPI 3.7.5",
- "url": "http://zaneyork.cn/dl/compat/smapi_amazon_138_201019.zip",
- "hash": "1c826b1419491cae063fd046131873f30640b841f2e8e6498d3f23ad82988d87"
+ "description": "SMAPI亚马逊商店兼容包, 适用版本1.4.4.138 - 1.4.5.147, SMAPI 3.7.5",
+ "url": "http://zaneyork.cn/dl/compat/smapi_amazon_145_210128.zip",
+ "hash": "3e461ae9dcb6269340bfc923b720dd9f0f9c724acb66807b68571779e575c4e3"
},
{
"type": "LOCALE",
diff --git a/app/src/main/assets/mods/console-commands.zip b/app/src/main/assets/mods/console-commands.zip
index 906d127..773ca0e 100644
Binary files a/app/src/main/assets/mods/console-commands.zip and b/app/src/main/assets/mods/console-commands.zip differ
diff --git a/app/src/main/assets/mods/save-backup.zip b/app/src/main/assets/mods/save-backup.zip
index 5131aa7..f205ad0 100644
Binary files a/app/src/main/assets/mods/save-backup.zip and b/app/src/main/assets/mods/save-backup.zip differ
diff --git a/app/src/main/assets/smapi/Mono.Cecil.dll b/app/src/main/assets/smapi/Mono.Cecil.dll
index bdb99df..1d8f94b 100644
Binary files a/app/src/main/assets/smapi/Mono.Cecil.dll and b/app/src/main/assets/smapi/Mono.Cecil.dll differ
diff --git a/app/src/main/assets/smapi/System.Xml.Linq.dll b/app/src/main/assets/smapi/System.Xml.Linq.dll
index 94bc260..7ffc57b 100644
Binary files a/app/src/main/assets/smapi/System.Xml.Linq.dll and b/app/src/main/assets/smapi/System.Xml.Linq.dll differ
diff --git a/app/src/main/assets/smapi/TMXTile.dll b/app/src/main/assets/smapi/TMXTile.dll
index b2a1184..46f9dee 100644
Binary files a/app/src/main/assets/smapi/TMXTile.dll and b/app/src/main/assets/smapi/TMXTile.dll differ
diff --git a/app/src/main/assets/smapi_files_manifest.json b/app/src/main/assets/smapi_files_manifest.json
index 494b3dc..310f8ef 100644
--- a/app/src/main/assets/smapi_files_manifest.json
+++ b/app/src/main/assets/smapi_files_manifest.json
@@ -1,43 +1,33 @@
[
{
- "targetPath": "smapi-internal/0Harmony.dll",
- "assetPath": "smapi/0Harmony.dll",
+ "targetPath": "smapi-internal/",
+ "assetPath": "smapi/*.json",
"origin": 0
},
{
- "targetPath": "smapi-internal/config.json",
- "assetPath": "smapi/config.json",
+ "targetPath": "smapi-internal/i18n/",
+ "assetPath": "smapi/i18n/*.json",
"origin": 0
},
{
- "targetPath": "smapi-internal/metadata.json",
- "assetPath": "smapi/metadata.json",
+ "targetPath": "smapi-internal/",
+ "assetPath": "smapi/*.dll",
"origin": 0
},
{
- "targetPath": "smapi-internal/Mono.Cecil.dll",
- "assetPath": "smapi/Mono.Cecil.dll",
+ "targetPath": "smapi-internal/Mono.Android.dll",
+ "assetPath": "apk/Mono.Android.dll",
"origin": 0
},
{
"targetPath": "smapi-internal/MonoGame.Framework.dll",
- "assetPath": "assemblies/MonoGame.Framework.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/MonoMod.RuntimeDetour.dll",
- "assetPath": "smapi/MonoMod.RuntimeDetour.dll",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/MonoMod.Utils.dll",
- "assetPath": "smapi/MonoMod.Utils.dll",
+ "assetPath": "apk/MonoGame.Framework.dll",
"origin": 0
},
{
"targetPath": "smapi-internal/mscorlib.dll",
- "assetPath": "assemblies/mscorlib.dll",
- "origin": 1
+ "assetPath": "apk/mscorlib.dll",
+ "origin": 0
},
{
"targetPath": "smapi-internal/Newtonsoft.Json.dll",
@@ -62,17 +52,19 @@
{
"targetPath": "smapi-internal/StardewValley.dll",
"assetPath": "assemblies/StardewValley.dll",
+ "isXALZ": true,
"origin": 1
},
{
"targetPath": "smapi-internal/StardewValley.GameData.dll",
"assetPath": "assemblies/StardewValley.GameData.dll",
+ "isXALZ": true,
"origin": 1
},
{
"targetPath": "smapi-internal/System.Core.dll",
- "assetPath": "assemblies/System.Core.dll",
- "origin": 1
+ "assetPath": "apk/System.Core.dll",
+ "origin": 0
},
{
"targetPath": "smapi-internal/System.Data.dll",
@@ -81,13 +73,13 @@
},
{
"targetPath": "smapi-internal/System.dll",
- "assetPath": "assemblies/System.dll",
- "origin": 1
+ "assetPath": "apk/System.dll",
+ "origin": 0
},
{
"targetPath": "smapi-internal/System.Net.Http.dll",
- "assetPath": "assemblies/System.Net.Http.dll",
- "origin": 1
+ "assetPath": "apk/System.Net.Http.dll",
+ "origin": 0
},
{
"targetPath": "smapi-internal/System.Numerics.dll",
@@ -96,97 +88,22 @@
},
{
"targetPath": "smapi-internal/System.Runtime.Serialization.dll",
- "assetPath": "assemblies/System.Runtime.Serialization.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/System.ServiceModel.Internals.dll",
- "assetPath": "assemblies/System.ServiceModel.Internals.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/System.Xml.dll",
- "assetPath": "assemblies/System.Xml.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/Mono.Android.dll",
- "assetPath": "assemblies/Mono.Android.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/System.Xml.Linq.dll",
- "assetPath": "smapi/System.Xml.Linq.dll",
+ "assetPath": "apk/System.Runtime.Serialization.dll",
"origin": 0
},
{
- "targetPath": "smapi-internal/TMXTile.dll",
- "assetPath": "smapi/TMXTile.dll",
+ "targetPath": "smapi-internal/System.ServiceModel.Internals.dll",
+ "assetPath": "apk/System.ServiceModel.Internals.dll",
+ "origin": 0
+ },
+ {
+ "targetPath": "smapi-internal/System.Xml.dll",
+ "assetPath": "apk/System.Xml.dll",
"origin": 0
},
{
"targetPath": "smapi-internal/xTile.dll",
- "assetPath": "assemblies/xTile.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/BmFont.dll",
- "assetPath": "assemblies/BmFont.dll",
- "origin": 1
- },
- {
- "targetPath": "smapi-internal/i18n/de.json",
- "assetPath": "smapi/i18n/de.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/default.json",
- "assetPath": "smapi/i18n/default.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/es.json",
- "assetPath": "smapi/i18n/es.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/fr.json",
- "assetPath": "smapi/i18n/fr.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/hu.json",
- "assetPath": "smapi/i18n/hu.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/it.json",
- "assetPath": "smapi/i18n/it.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/ja.json",
- "assetPath": "smapi/i18n/ja.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/pt.json",
- "assetPath": "smapi/i18n/pt.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/ru.json",
- "assetPath": "smapi/i18n/ru.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/tr.json",
- "assetPath": "smapi/i18n/tr.json",
- "origin": 0
- },
- {
- "targetPath": "smapi-internal/i18n/zh.json",
- "assetPath": "smapi/i18n/zh.json",
+ "assetPath": "apk/xTile.dll",
"origin": 0
}
]
\ No newline at end of file
diff --git a/app/src/main/java/com/zane/smapiinstaller/constant/Constants.java b/app/src/main/java/com/zane/smapiinstaller/constant/Constants.java
index 305117e..ae6535e 100644
--- a/app/src/main/java/com/zane/smapiinstaller/constant/Constants.java
+++ b/app/src/main/java/com/zane/smapiinstaller/constant/Constants.java
@@ -67,7 +67,7 @@ public class Constants {
/**
* SMAPI版本
*/
- public static final String SMAPI_VERSION = "3.7.5";
+ public static final String SMAPI_VERSION = "3.7.6";
/**
* 应用名称
diff --git a/app/src/main/java/com/zane/smapiinstaller/entity/ManifestEntry.java b/app/src/main/java/com/zane/smapiinstaller/entity/ManifestEntry.java
index ee5c130..d271937 100644
--- a/app/src/main/java/com/zane/smapiinstaller/entity/ManifestEntry.java
+++ b/app/src/main/java/com/zane/smapiinstaller/entity/ManifestEntry.java
@@ -1,5 +1,7 @@
package com.zane.smapiinstaller.entity;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
import lombok.Data;
/**
@@ -43,4 +45,9 @@ public class ManifestEntry {
* 是否为高级模式补丁
*/
private boolean advanced;
+ /**
+ * 是否为XALZ压缩格式
+ */
+ @JsonProperty("isXALZ")
+ private boolean isXALZ;
}
diff --git a/app/src/main/java/com/zane/smapiinstaller/logic/ApkPatcher.java b/app/src/main/java/com/zane/smapiinstaller/logic/ApkPatcher.java
index f3e5c8b..cdaee8d 100644
--- a/app/src/main/java/com/zane/smapiinstaller/logic/ApkPatcher.java
+++ b/app/src/main/java/com/zane/smapiinstaller/logic/ApkPatcher.java
@@ -14,7 +14,7 @@ import com.android.apksig.ApkSigner;
import com.android.apksig.ApkVerifier;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.base.Stopwatch;
-import com.google.common.collect.Iterables;
+import com.google.common.io.ByteStreams;
import com.google.common.io.Files;
import com.zane.smapiinstaller.BuildConfig;
import com.zane.smapiinstaller.MainActivity;
@@ -22,18 +22,16 @@ import com.zane.smapiinstaller.R;
import com.zane.smapiinstaller.constant.Constants;
import com.zane.smapiinstaller.constant.DialogAction;
import com.zane.smapiinstaller.constant.ManifestPatchConstants;
-import com.zane.smapiinstaller.dto.Tuple2;
import com.zane.smapiinstaller.entity.ApkFilesManifest;
import com.zane.smapiinstaller.entity.ManifestEntry;
import com.zane.smapiinstaller.utils.DialogUtils;
import com.zane.smapiinstaller.utils.FileUtils;
+import com.zane.smapiinstaller.utils.StringUtils;
import com.zane.smapiinstaller.utils.ZipUtils;
import net.fornwall.apksigner.KeyStoreFileManager;
import org.apache.commons.lang3.NotImplementedException;
-import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.Nullable;
import org.zeroturnaround.zip.ZipUtil;
import java.io.File;
@@ -53,8 +51,10 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import java.util.zip.Deflater;
+import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
import pxb.android.axml.NodeVisitor;
@@ -71,6 +71,10 @@ public class ApkPatcher {
private final AtomicReference errorMessage = new AtomicReference<>();
+ private final AtomicReference gamePackageName = new AtomicReference<>();
+
+ private final AtomicLong gameVersionCode = new AtomicLong();
+
private final AtomicInteger switchAction = new AtomicInteger();
private final List> progressListener = new ArrayList<>();
@@ -103,6 +107,13 @@ public class ApkPatcher {
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
String sourceDir = packageInfo.applicationInfo.publicSourceDir;
+ gamePackageName.set(packageName);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ gameVersionCode.set(packageInfo.getLongVersionCode());
+ }
+ else {
+ gameVersionCode.set(packageInfo.versionCode);
+ }
File apkFile = new File(sourceDir);
String stadewValleyBasePath = FileUtils.getStadewValleyBasePath();
@@ -190,8 +201,8 @@ public class ApkPatcher {
List manifestEntries = apkFilesManifest.getManifestEntries();
errorMessage.set(null);
List entries = manifestEntries.stream()
- .map(entry -> processfileentry(file, apkFilesManifest, entry, isAdvanced))
- .filter(Objects::nonNull).collect(Collectors.toList());
+ .map(entry -> processFileEntry(file, apkFilesManifest, entry, isAdvanced))
+ .filter(Objects::nonNull).flatMap(Stream::of).distinct().collect(Collectors.toList());
if (errorMessage.get() != null) {
return false;
}
@@ -218,20 +229,58 @@ public class ApkPatcher {
}
@Nullable
- private ZipUtils.ZipEntrySource processfileentry(File file, ApkFilesManifest apkFilesManifest, ManifestEntry entry, boolean isAdvanced) {
+ private ZipUtils.ZipEntrySource[] processFileEntry(File apkFile, ApkFilesManifest apkFilesManifest, ManifestEntry entry, boolean isAdvanced) {
if (entry.isAdvanced() && !isAdvanced) {
return null;
}
+ if (entry.getTargetPath().endsWith("/") && entry.getAssetPath().contains("*")) {
+ String path = StringUtils.substringBeforeLast(entry.getAssetPath(), "/");
+ String pattern = StringUtils.substringAfterLast(entry.getAssetPath(), "/");
+ try {
+ if (entry.getOrigin() == 1) {
+ ArrayList list = new ArrayList<>();
+ ZipUtil.iterate(apkFile, (in, zipEntry) -> {
+ String entryPath = StringUtils.substringBeforeLast(zipEntry.getName(), "/");
+ String filename = StringUtils.substringAfterLast(zipEntry.getName(), "/");
+ if (entryPath.equals(path) && StringUtils.wildCardMatch(filename, pattern)) {
+ byte[] bytes = ByteStreams.toByteArray(in);
+ if (entry.isXALZ()) {
+ bytes = ZipUtils.decompressXALZ(bytes);
+ }
+ list.add(new ZipUtils.ZipEntrySource(entry.getTargetPath() + filename, bytes, entry.getCompression()));
+ }
+ });
+ return list.toArray(new ZipUtils.ZipEntrySource[0]);
+ } else {
+ return Stream.of(context.getAssets().list(path))
+ .filter(filename -> StringUtils.wildCardMatch(filename, pattern))
+ .map(filename -> {
+ byte[] bytes = FileUtils.getAssetBytes(context, path + "/" + filename);
+ return new ZipUtils.ZipEntrySource(entry.getTargetPath() + filename, bytes, entry.getCompression());
+ })
+ .toArray(ZipUtils.ZipEntrySource[]::new);
+ }
+ } catch (IOException ignored) {
+ }
+ return null;
+ }
byte[] bytes;
- if (entry.isExternal()) {
- bytes = FileUtils.getAssetBytes(context, apkFilesManifest.getBasePath() + entry.getAssetPath());
+ if (entry.getOrigin() == 1) {
+ bytes = ZipUtil.unpackEntry(apkFile, entry.getAssetPath());
+ if (entry.isXALZ()) {
+ bytes = ZipUtils.decompressXALZ(bytes);
+ }
} else {
- bytes = FileUtils.getAssetBytes(context, entry.getAssetPath());
+ if (entry.isExternal()) {
+ bytes = FileUtils.getAssetBytes(context, apkFilesManifest.getBasePath() + entry.getAssetPath());
+ } else {
+ bytes = FileUtils.getAssetBytes(context, entry.getAssetPath());
+ }
+ if (StringUtils.isNoneBlank(entry.getPatchCrc())) {
+ throw new NotImplementedException("bs patch mode is not supported anymore.");
+ }
}
- if (StringUtils.isNoneBlank(entry.getPatchCrc())) {
- throw new NotImplementedException("bs patch mode is not supported anymore.");
- }
- return new ZipUtils.ZipEntrySource(entry.getTargetPath(), bytes, entry.getCompression());
+ return new ZipUtils.ZipEntrySource[]{new ZipUtils.ZipEntrySource(entry.getTargetPath(), bytes, entry.getCompression())};
}
/**
@@ -281,7 +330,12 @@ public class ApkPatcher {
}
case "name":
if (strObj.contains(ManifestPatchConstants.PATTERN_MAIN_ACTIVITY)) {
- attr.obj = strObj.replaceFirst("\\w+\\.MainActivity", "md5723872fa9a204f7f942686e9ed9d0b7d.SMainActivity");
+ if(versionCode.get() > 147) {
+ attr.obj = strObj.replaceFirst("\\w+\\.MainActivity", "crc648e5438a58262f792.SMainActivity");
+ }
+ else {
+ attr.obj = strObj.replaceFirst("\\w+\\.MainActivity", "md5723872fa9a204f7f942686e9ed9d0b7d.SMainActivity");
+ }
}
break;
default:
@@ -311,23 +365,7 @@ public class ApkPatcher {
if (StringUtils.endsWith(versionName.get(), ManifestPatchConstants.PATTERN_VERSION_AMAZON)) {
packageName.set(ManifestPatchConstants.APP_PACKAGE_NAME + ManifestPatchConstants.PATTERN_VERSION_AMAZON);
}
- Iterables.removeIf(manifests, manifest -> {
- if (manifest == null) {
- return true;
- }
- if (versionCode.get() < manifest.getMinBuildCode()) {
- return true;
- }
- if (manifest.getMaxBuildCode() != null) {
- if (versionCode.get() > manifest.getMaxBuildCode()) {
- return true;
- }
- }
- if (manifest.getTargetPackageName() != null && packageName.get() != null && !manifest.getTargetPackageName().contains(packageName.get())) {
- return true;
- }
- return false;
- });
+ CommonLogic.filterManifest(manifests, packageName.get(), versionCode.get());
return modifyManifest;
} catch (Exception e) {
errorMessage.set(e.getLocalizedMessage());
@@ -454,6 +492,14 @@ public class ApkPatcher {
return errorMessage;
}
+ public String getGamePackageName() {
+ return gamePackageName.get();
+ }
+
+ public long getGameVersionCode() {
+ return gameVersionCode.get();
+ }
+
public AtomicInteger getSwitchAction() {
return switchAction;
}
diff --git a/app/src/main/java/com/zane/smapiinstaller/logic/CommonLogic.java b/app/src/main/java/com/zane/smapiinstaller/logic/CommonLogic.java
index 1abefbc..695cf55 100644
--- a/app/src/main/java/com/zane/smapiinstaller/logic/CommonLogic.java
+++ b/app/src/main/java/com/zane/smapiinstaller/logic/CommonLogic.java
@@ -19,6 +19,7 @@ import android.widget.ImageView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.io.ByteStreams;
import com.lmntrx.android.library.livin.missme.ProgressDialog;
@@ -26,16 +27,21 @@ import com.microsoft.appcenter.crashes.Crashes;
import com.zane.smapiinstaller.MainApplication;
import com.zane.smapiinstaller.R;
import com.zane.smapiinstaller.constant.DialogAction;
-import com.zane.smapiinstaller.dto.Tuple2;
import com.zane.smapiinstaller.entity.ApkFilesManifest;
import com.zane.smapiinstaller.entity.ManifestEntry;
import com.zane.smapiinstaller.utils.DialogUtils;
import com.zane.smapiinstaller.utils.FileUtils;
+import com.zane.smapiinstaller.utils.StringUtils;
+import com.zane.smapiinstaller.utils.ZipUtils;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.zeroturnaround.zip.ZipUtil;
import java.io.File;
+import java.io.FileFilter;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -45,6 +51,7 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
+import java.util.stream.Stream;
import pxb.android.axml.AxmlReader;
import pxb.android.axml.AxmlVisitor;
@@ -188,11 +195,26 @@ public class CommonLogic {
* @param context context
* @param apkPath 安装包路径
* @param checkMode 是否为校验模式
+ * @param packageName
+ * @param versionCode
* @return 操作是否成功
*/
- public static boolean unpackSmapiFiles(Context context, String apkPath, boolean checkMode) {
- List manifestEntries = FileUtils.getAssetJson(context, "smapi_files_manifest.json", new TypeReference>() {
- });
+ public static boolean unpackSmapiFiles(Context context, String apkPath, boolean checkMode, String packageName, long versionCode) {
+ List apkFilesManifests = CommonLogic.findAllApkFileManifest(context);
+ filterManifest(apkFilesManifests, packageName, versionCode);
+ List manifestEntries = null;
+ ApkFilesManifest apkFilesManifest = null;
+ if(apkFilesManifests.size() > 0) {
+ apkFilesManifest = apkFilesManifests.get(0);
+ String basePath = apkFilesManifest.getBasePath();
+ if(StringUtils.isNoneBlank(basePath)) {
+ manifestEntries = FileUtils.getAssetJson(context, basePath + "smapi_files_manifest.json", new TypeReference>() {});
+ }
+ }
+ if(manifestEntries == null) {
+ manifestEntries = FileUtils.getAssetJson(context, "smapi_files_manifest.json", new TypeReference>() {
+ });
+ }
if (manifestEntries == null) {
return false;
}
@@ -202,6 +224,16 @@ public class CommonLogic {
return false;
}
}
+ else {
+ if(!checkMode) {
+ File[] oldAssemblies = new File(basePath, "smapi-internal").listFiles((FileFilter) new WildcardFileFilter("*.dll"));
+ if(oldAssemblies != null) {
+ for (File file : oldAssemblies) {
+ FileUtils.deleteQuietly(file);
+ }
+ }
+ }
+ }
File noMedia = new File(basePath, ".nomedia");
if (!noMedia.exists()) {
try {
@@ -213,24 +245,55 @@ public class CommonLogic {
File targetFile = new File(basePath, entry.getTargetPath());
switch (entry.getOrigin()) {
case 0:
- if (!checkMode || !targetFile.exists()) {
- try (InputStream inputStream = context.getAssets().open(entry.getAssetPath())) {
- if (!targetFile.getParentFile().exists()) {
- if (!targetFile.getParentFile().mkdirs()) {
- return false;
- }
+ if(entry.isExternal() && apkFilesManifest != null){
+ byte[] bytes = FileUtils.getAssetBytes(context, apkFilesManifest.getBasePath() + entry.getAssetPath());
+ try (FileOutputStream outputStream = new FileOutputStream(targetFile)) {
+ outputStream.write(bytes);
+ } catch (IOException ignored) {
+ }
+ }
+ else {
+ if (entry.getTargetPath().endsWith("/") && entry.getAssetPath().contains("*")) {
+ String path = StringUtils.substring(entry.getAssetPath(), 0, StringUtils.lastIndexOf(entry.getAssetPath(), "/"));
+ String pattern = StringUtils.substringAfterLast(entry.getAssetPath(), "/");
+ try {
+ Stream.of(context.getAssets().list(path))
+ .filter(filename -> StringUtils.wildCardMatch(filename, pattern))
+ .forEach(filename -> {
+ unpackFile(context, checkMode, path + "/" + filename, new File(basePath, entry.getTargetPath() + filename));
+ });
+ } catch (IOException ignored) {
}
- try (FileOutputStream outputStream = new FileOutputStream(targetFile)) {
- ByteStreams.copy(inputStream, outputStream);
- }
- } catch (IOException e) {
- Log.e("COMMON", "Copy Error", e);
+ } else {
+ unpackFile(context, checkMode, entry.getAssetPath(), targetFile);
}
}
break;
case 1:
if (!checkMode || !targetFile.exists()) {
- ZipUtil.unpackEntry(new File(apkPath), entry.getAssetPath(), targetFile);
+ if(entry.isXALZ()){
+ byte[] bytes = ZipUtil.unpackEntry(new File(apkPath), entry.getAssetPath());
+ if (entry.isXALZ()) {
+ bytes = ZipUtils.decompressXALZ(bytes);
+ }
+ FileOutputStream stream = null;
+ try {
+ stream = FileUtils.openOutputStream(targetFile);
+ stream.write(bytes);
+ } catch (IOException ignore) {
+ }
+ finally {
+ if(stream != null) {
+ try {
+ stream.close();
+ } catch (IOException ignored) {
+ }
+ }
+ }
+ }
+ else {
+ ZipUtil.unpackEntry(new File(apkPath), entry.getAssetPath(), targetFile);
+ }
}
break;
default:
@@ -240,10 +303,47 @@ public class CommonLogic {
return true;
}
+ public static void filterManifest(List manifests, String packageName, long versionCode){
+ Iterables.removeIf(manifests, manifest -> {
+ if (manifest == null) {
+ return true;
+ }
+ if (versionCode < manifest.getMinBuildCode()) {
+ return true;
+ }
+ if (manifest.getMaxBuildCode() != null) {
+ if (versionCode > manifest.getMaxBuildCode()) {
+ return true;
+ }
+ }
+ if (manifest.getTargetPackageName() != null && packageName != null && !manifest.getTargetPackageName().contains(packageName)) {
+ return true;
+ }
+ return false;
+ });
+ }
+ private static void unpackFile(Context context, boolean checkMode, String assertPath, File targetFile) {
+ if (!checkMode || !targetFile.exists()) {
+ try (InputStream inputStream = context.getAssets().open(assertPath)) {
+ if (!targetFile.getParentFile().exists()) {
+ if (!targetFile.getParentFile().mkdirs()) {
+ Log.e("COMMON", "Make dirs error");
+ return;
+ }
+ }
+ try (FileOutputStream outputStream = new FileOutputStream(targetFile)) {
+ ByteStreams.copy(inputStream, outputStream);
+ }
+ } catch (IOException e) {
+ Log.e("COMMON", "Copy Error", e);
+ }
+ }
+ }
+
/**
* 修改AndroidManifest.xml文件
*
- * @param bytes AndroidManifest.xml文件字符数组
+ * @param bytes AndroidManifest.xml文件字符数组
* @param attrProcessLogic 处理逻辑
* @return 修改后的AndroidManifest.xml文件字符数组
* @throws IOException 异常
diff --git a/app/src/main/java/com/zane/smapiinstaller/logic/GameLauncher.java b/app/src/main/java/com/zane/smapiinstaller/logic/GameLauncher.java
index 6697a15..5b039a3 100644
--- a/app/src/main/java/com/zane/smapiinstaller/logic/GameLauncher.java
+++ b/app/src/main/java/com/zane/smapiinstaller/logic/GameLauncher.java
@@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.os.Build;
import android.view.View;
import com.microsoft.appcenter.crashes.Crashes;
@@ -55,7 +56,14 @@ public class GameLauncher {
DialogUtils.showAlertDialog(root, R.string.error, R.string.error_smapi_not_installed);
return;
}
- if(!CommonLogic.unpackSmapiFiles(context, packageInfo.applicationInfo.publicSourceDir, true)) {
+ long versionCode;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ versionCode = packageInfo.getLongVersionCode();
+ }
+ else {
+ versionCode = packageInfo.versionCode;
+ }
+ if(!CommonLogic.unpackSmapiFiles(context, packageInfo.applicationInfo.publicSourceDir, true, packageInfo.packageName, versionCode)) {
DialogUtils.showAlertDialog(root, R.string.error, R.string.error_failed_to_repair);
return;
}
diff --git a/app/src/main/java/com/zane/smapiinstaller/ui/install/InstallFragment.java b/app/src/main/java/com/zane/smapiinstaller/ui/install/InstallFragment.java
index 28afe6f..aff7e19 100644
--- a/app/src/main/java/com/zane/smapiinstaller/ui/install/InstallFragment.java
+++ b/app/src/main/java/com/zane/smapiinstaller/ui/install/InstallFragment.java
@@ -124,7 +124,7 @@ public class InstallFragment extends Fragment {
return;
}
DialogUtils.setProgressDialogState(binding.getRoot(), dialog, R.string.unpacking_smapi_files, null);
- if (!CommonLogic.unpackSmapiFiles(context, path, false)) {
+ if (!CommonLogic.unpackSmapiFiles(context, path, false, patcher.getGamePackageName(), patcher.getGameVersionCode())) {
DialogUtils.showAlertDialog(binding.getRoot(), R.string.error, StringUtils.firstNonBlank(patcher.getErrorMessage().get(), context.getString(R.string.failed_to_unpack_smapi_files)));
return;
}
diff --git a/app/src/main/java/com/zane/smapiinstaller/utils/StringUtils.java b/app/src/main/java/com/zane/smapiinstaller/utils/StringUtils.java
new file mode 100644
index 0000000..7df0a60
--- /dev/null
+++ b/app/src/main/java/com/zane/smapiinstaller/utils/StringUtils.java
@@ -0,0 +1,34 @@
+package com.zane.smapiinstaller.utils;
+
+/**
+ * @author Zane
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils {
+
+ public static boolean wildCardMatch(String str, String pattern) {
+ int i = 0;
+ int j = 0;
+ int starIndex = -1;
+ int iIndex = -1;
+ while (i < str.length()) {
+ if (j < pattern.length() && (pattern.charAt(j) == '?' || pattern.charAt(j) == str.charAt(i))) {
+ ++i;
+ ++j;
+ } else if (j < pattern.length() && pattern.charAt(j) == '*') {
+ starIndex = j;
+ iIndex = i;
+ j++;
+ } else if (starIndex != -1) {
+ j = starIndex + 1;
+ i = iIndex + 1;
+ iIndex++;
+ } else {
+ return false;
+ }
+ }
+ while (j < pattern.length() && pattern.charAt(j) == '*') {
+ ++j;
+ }
+ return j == pattern.length();
+ }
+}
diff --git a/app/src/main/java/com/zane/smapiinstaller/utils/ZipUtils.java b/app/src/main/java/com/zane/smapiinstaller/utils/ZipUtils.java
index f994f56..e8db767 100644
--- a/app/src/main/java/com/zane/smapiinstaller/utils/ZipUtils.java
+++ b/app/src/main/java/com/zane/smapiinstaller/utils/ZipUtils.java
@@ -7,22 +7,39 @@ import com.google.common.collect.Sets;
import net.fornwall.apksigner.zipio.ZioEntry;
import net.fornwall.apksigner.zipio.ZipInput;
import net.fornwall.apksigner.zipio.ZipOutput;
+import net.jpountz.lz4.LZ4Factory;
+import net.jpountz.lz4.LZ4FastDecompressor;
+
+import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.List;
import java.util.function.Consumer;
import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.EqualsAndHashCode;
/**
* @author Zane
*/
public class ZipUtils {
+ public static byte[] decompressXALZ(byte[] bytes){
+ if("XALZ".equals(new String(ByteUtils.subArray(bytes, 0, 4), StandardCharsets.ISO_8859_1))) {
+ LZ4Factory factory = LZ4Factory.fastestInstance();
+ LZ4FastDecompressor lz4FastDecompressor = factory.fastDecompressor();
+ byte[] length = ByteUtils.subArray(bytes, 8, 12);
+ int len = (length[0] & 0xff) | ((length[1] & 0xff) << 8) | ((length[2] & 0xff) << 16) | ((length[3] & 0xff) << 24);
+ bytes = lz4FastDecompressor.decompress(bytes, 12, len);
+ }
+ return bytes;
+ }
+
public static void addOrReplaceEntries(String inputZipFilename, List entrySources, String outputZipFilename, Consumer progressCallback) throws IOException {
File inFile = new File(inputZipFilename).getCanonicalFile();
File outFile = new File(outputZipFilename).getCanonicalFile();
@@ -94,6 +111,7 @@ public class ZipUtils {
@Data
@AllArgsConstructor
+ @EqualsAndHashCode(of = "path")
public static class ZipEntrySource {
private String path;
private byte[] data;
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index a2f8e0b..d3d3466 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -61,7 +61,7 @@
Registro detallado
Firmando paquete deinstalación
SMAPI Stardew Valley
- Versión SMAPI: 3.7.5
+ Versión SMAPI: 3.7.6
Nota: Requiere la versión del juego 1.4.5.138 o superior
El cuerpo del juego debe instalarse durante la actualización o instalación
Desempacando
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index b589781..d2845ec 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -61,7 +61,7 @@
Journalisation détaillée
Signature
SMAPI Stardew Valley
- Version SMAPI: 3.7.5
+ Version SMAPI: 3.7.6
Remarques: La version du jeu 1.4.5.138 ou ultérieure est requise.
Le jeu de base est requis lors de la mise à jour / installation.
Déballage
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index b8bd832..c4f4abb 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -61,7 +61,7 @@
Catatan Terperinci
Menandatangani
SMAPI Stardew Valley
- Versi SMAPI: 3.7.5
+ Versi SMAPI: 3.7.6
Catatan: Dibutuhkan Stardew Valley versi 1.4.5.138 atau yang lebih baru.
Permainan dasar diperlukan saat memperbarui/menginstal.
Membongkar
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index fbad1e6..21b097d 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -61,7 +61,7 @@
자세한 로그
설치 패키지 서명
SMAPI Stardew Valley
- SMAPI버전: 3.7.5
+ SMAPI버전: 3.7.6
참고 : 게임 버전 1.4.5.138 이상이 필요합니다
업데이트 또는 설치 중에 게임 본체를 설치해야합니다
포장 풀기
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index da27b8d..910de39 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -61,7 +61,7 @@
Log detalhado
Assinatura
SMAPI Stardew Valley
- Versão SMAPI: 3.7.5
+ Versão SMAPI: 3.7.6
Notas: É necessária a versão do jogo 1.4.5.138 ou posterior.
O jogo base é necessário ao atualizar / instalar.
Desembalar
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 47148c0..9c9a575 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -61,7 +61,7 @@
บันทึกอย่างละเอียด
กำลังลงทะเบียนแอป
SMAPI Stardew Valley
- เวอร์ชั่น SMAPI: 3.7.5
+ เวอร์ชั่น SMAPI: 3.7.6
หมายเหตุ: ต้องการเกมเวอร์ชั่น 1.4.5.138 หรือใหม่กว่า
ต้องการเกมหลักเมื่อทำการอัปเดต / ติดตั้ง
กำลังแกะกล่อง
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 252fce8..7654e05 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -60,7 +60,7 @@
詳細日誌
正在簽名安裝包
SMAPI 星露谷物語
- SMAPI版本: 3.7.5
+ SMAPI版本: 3.7.6
注意:需要 1.4.5.138 以上遊戲版本
更新或安裝期間需要安裝遊戲
正在解包
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 59a1a36..bb99dde 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -60,7 +60,7 @@
详细日志
正在签名安装包
SMAPI星露谷物语
- SMAPI版本: 3.7.5
+ SMAPI版本: 3.7.6
注意:需要不低于1.4.5.138版本的游戏本体
更新或安装期间需要安装游戏本体
正在解包
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c3584f3..3957a46 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -60,7 +60,7 @@
Verbose Logging
Signing
SMAPI Stardew Valley
- SMAPI Version: 3.7.5
+ SMAPI Version: 3.7.6
Notes: Game version 1.4.5.138 or later is required.
The base game is required when updating/installing.
Unpacking