├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── .gitmodules
├── .idea
├── .gitignore
├── .name
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── compiler.xml
├── gradle.xml
├── misc.xml
└── vcs.xml
├── License
├── Readme.md
├── app
├── .gitignore
├── CMakeLists.txt
├── build.gradle
├── conanfile.txt
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── moe
│ │ └── madoka
│ │ └── umapyogin_android
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ ├── UmaPyoginFiles
│ │ │ └── resources
│ │ │ │ └── umamusumelocalify
│ │ └── xposed_init
│ ├── cpp
│ │ └── UmaPyogin.cpp
│ ├── java
│ │ └── moe
│ │ │ └── madoka
│ │ │ └── umapyogin_android
│ │ │ ├── MainActivity.kt
│ │ │ └── UmaPyogin.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ └── ic_launcher_background.xml
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── values-night
│ │ └── themes.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── test
│ └── java
│ └── moe
│ └── madoka
│ └── umapyogin_android
│ └── ExampleUnitTest.kt
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Android CI
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | build:
7 |
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@v3
12 | with:
13 | submodules: recursive
14 | - name: set up android development environment
15 | uses: android-actions/setup-android@v2
16 |
17 | - name: checkout conan-android_ndk
18 | uses: actions/checkout@v3
19 | with:
20 | repository: akemimadoka/conan-android_ndk
21 | path: conan-android_ndk
22 | - name: install dependencies
23 | run: |
24 | pip3 install --upgrade conan==1.59.0 requests
25 | conan profile new default --detect
26 | conan config init
27 | conan export conan-android_ndk
28 | conan config install conan-android_ndk/android.profile -tf profiles
29 | sdkmanager --install "cmake;3.22.1"
30 | echo "cmake.dir=/usr/local/lib/android/sdk/cmake/3.22.1" > local.properties
31 |
32 | - name: Grant execute permission for gradlew
33 | run: chmod +x gradlew
34 | - name: Build with Gradle
35 | run: ./gradlew build
36 | - uses: actions/upload-artifact@v2
37 | with:
38 | name: UmaPyoginAndroid
39 | path: app/build/outputs/apk/debug/app-debug.apk
40 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 | local.properties
16 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "Nougat_dlfunctions"]
2 | path = Nougat_dlfunctions
3 | url = https://github.com/avs333/Nougat_dlfunctions.git
4 | [submodule "And64InlineHook"]
5 | path = And64InlineHook
6 | url = https://github.com/akemimadoka/And64InlineHook.git
7 | [submodule "Trainers-Legend-G-TRANS"]
8 | path = Trainers-Legend-G-TRANS
9 | url = https://github.com/MinamiChiwa/Trainers-Legend-G-TRANS.git
10 | [submodule "UmaPyogin"]
11 | path = UmaPyogin
12 | url = https://github.com/akemimadoka/UmaPyogin.git
13 | [submodule "Trainers-Legend-G-TRANS-zh-tw"]
14 | path = Trainers-Legend-G-TRANS-zh-tw
15 | url = https://github.com/yotv2000tw/Trainers-Legend-G-TRANS-zh-tw.git
16 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | UmaPyogin-Android
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | xmlns:android
18 |
19 | ^$
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | xmlns:.*
29 |
30 | ^$
31 |
32 |
33 | BY_NAME
34 |
35 |
36 |
37 |
38 |
39 |
40 | .*:id
41 |
42 | http://schemas.android.com/apk/res/android
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | .*:name
52 |
53 | http://schemas.android.com/apk/res/android
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | name
63 |
64 | ^$
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 | style
74 |
75 | ^$
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 | .*
85 |
86 | ^$
87 |
88 |
89 | BY_NAME
90 |
91 |
92 |
93 |
94 |
95 |
96 | .*
97 |
98 | http://schemas.android.com/apk/res/android
99 |
100 |
101 | ANDROID_ATTRIBUTE_ORDER
102 |
103 |
104 |
105 |
106 |
107 |
108 | .*
109 |
110 | .*
111 |
112 |
113 | BY_NAME
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/License:
--------------------------------------------------------------------------------
1 | Copyright 2022 akemimadoka
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | UmaPyogin-Android
2 | ====
3 |
4 | [UmaPyogin](https://github.com/akemimadoka/UmaPyogin) 的 Android 实现
5 |
6 | 构建
7 | ----
8 | 需要安装 conan,并事先配置好 [conan-android_ndk](https://github.com/akemimadoka/conan-android_ndk)
9 |
10 | 注意
11 | ----
12 | Android 11 下,因系统安全限制,仅有 edxposed 和 lsposed 能够读取应用配置,因此若你的设备在 Android 11 以上,并且正在使用如太极等非必须 root 的 xposed 框架时,你将可能无法通过插件配置禁用插件或禁用解锁 FPS 功能
13 |
14 | 当前不支持 armv7 设备,请等待适配
15 |
16 | 程序会尝试在游戏的目录下解压本地化数据,因此会导致游戏占用空间略微变大,并且不会随着插件的卸载而删除,这个问题预计在将来解决
17 |
18 | 解锁 FPS 功能会导致剧情的 AUTO 失效,若需要使用 AUTO,请不要使用解锁 FPS 功能
19 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | keystore.properties
3 |
--------------------------------------------------------------------------------
/app/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.20)
2 |
3 | project(UmaPyogin C CXX)
4 |
5 | if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
6 | message(STATUS "Downloading conan.cmake")
7 | file(DOWNLOAD "https://raw.githubusercontent.com/akemimadoka/cmake-conan/develop/conan.cmake"
8 | "${CMAKE_BINARY_DIR}/conan.cmake" SHOW_PROGRESS
9 | STATUS _download_status)
10 | list(GET _download_status 0 _download_status_code)
11 | list(GET _download_status 1 _download_status_msg)
12 | if(NOT _download_status_code EQUAL 0)
13 | file(REMOVE "${CMAKE_BINARY_DIR}/conan.cmake")
14 | message(FATAL_ERROR "Failed to download conan.cmake, status code is ${_download_status_code}, msg is ${_download_status_msg}")
15 | endif()
16 | endif()
17 |
18 | include(${CMAKE_BINARY_DIR}/conan.cmake)
19 |
20 | conan_check(REQUIRED)
21 |
22 | execute_process(COMMAND ${CONAN_CMD} export ../UmaPyogin)
23 |
24 | conan_cmake_run(
25 | CONANFILE conanfile.txt
26 | BASIC_SETUP CMAKE_TARGETS
27 | BUILD missing
28 | PROFILE_AUTO all
29 | PROFILE android.profile
30 | OPTIONS android_ndk:NDKRootPath=${CMAKE_ANDROID_NDK}
31 | )
32 |
33 | set(And64InlineHookSources
34 | ../And64InlineHook/And64InlineHook.cpp
35 | ../And64InlineHook/And64InlineHook.hpp
36 | )
37 |
38 | set(Nougat_dlfunctionsSources
39 | ../Nougat_dlfunctions/jni/fake_dlfcn.c
40 | )
41 |
42 | add_library(UmaPyogin SHARED
43 | src/main/cpp/UmaPyogin.cpp
44 | ${And64InlineHookSources}
45 | ${Nougat_dlfunctionsSources}
46 | )
47 |
48 | target_include_directories(UmaPyogin PRIVATE ../And64InlineHook)
49 | target_link_libraries(UmaPyogin PRIVATE log ${CONAN_TARGETS})
50 | target_compile_features(UmaPyogin PRIVATE cxx_std_20)
51 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | id 'org.jetbrains.kotlin.android'
4 | }
5 |
6 | android {
7 | compileSdk 33
8 | ndkVersion "25.2.9519653"
9 |
10 | defaultConfig {
11 | applicationId "moe.madoka.umapyogin_android"
12 | minSdk 21
13 | targetSdk 33
14 | versionCode 1
15 | versionName "1.3"
16 |
17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
18 |
19 | externalNativeBuild {
20 | cmake {
21 | abiFilters 'arm64-v8a'
22 | }
23 | }
24 | }
25 |
26 | buildTypes {
27 | release {
28 | minifyEnabled false
29 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
30 | }
31 | }
32 | externalNativeBuild {
33 | cmake {
34 | path "CMakeLists.txt"
35 | }
36 | }
37 | compileOptions {
38 | sourceCompatibility JavaVersion.VERSION_1_8
39 | targetCompatibility JavaVersion.VERSION_1_8
40 | }
41 | kotlinOptions {
42 | jvmTarget = '1.8'
43 | }
44 | dataBinding {
45 | enabled = true
46 | }
47 | sourceSets {
48 | main {
49 | assets {
50 | srcDirs += ["build/intermediates/umapyogin_extra_assets"]
51 | }
52 | }
53 | }
54 | }
55 |
56 | dependencies {
57 | compileOnly 'de.robv.android.xposed:api:82'
58 | compileOnly 'de.robv.android.xposed:api:82:sources'
59 | implementation 'androidx.core:core-ktx:1.9.0'
60 | implementation 'androidx.appcompat:appcompat:1.6.1'
61 | implementation 'com.google.android.material:material:1.8.0'
62 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
63 | testImplementation 'junit:junit:4.13.2'
64 | androidTestImplementation 'androidx.test.ext:junit:1.1.5'
65 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
66 | }
67 |
68 | def translateDataDir = buildSC == "true" ? "Trainers-Legend-G-TRANS" : "Trainers-Legend-G-TRANS-zh-tw"
69 |
70 | task copyStoryLocalizedData(type: Copy) {
71 | from("../$translateDataDir/localized_data/stories") {
72 | include("**/*.json")
73 | }
74 | into "build/intermediates/umapyogin_extra_assets/UmaPyoginFiles/stories"
75 | }
76 |
77 | task copyStaticLocalizedData(type: Copy) {
78 | from "../$translateDataDir/localized_data/static.json"
79 | into "build/intermediates/umapyogin_extra_assets/UmaPyoginFiles"
80 | }
81 |
82 | task copyDatabaseLocalizedData(type: Copy) {
83 | from("../$translateDataDir/localized_data") {
84 | include "text_data.json", "character_system_text.json", "race_jikkyo_comment.json", "race_jikkyo_message.json"
85 | }
86 | into "build/intermediates/umapyogin_extra_assets/UmaPyoginFiles/database"
87 | }
88 |
89 | task copyLocalizedData {
90 | }
91 |
92 | copyLocalizedData.dependsOn copyStoryLocalizedData
93 | copyLocalizedData.dependsOn copyStaticLocalizedData
94 | copyLocalizedData.dependsOn copyDatabaseLocalizedData
95 |
96 | preBuild.dependsOn copyLocalizedData
97 |
--------------------------------------------------------------------------------
/app/conanfile.txt:
--------------------------------------------------------------------------------
1 | [requires]
2 | UmaPyogin/0.1
3 |
4 | [generators]
5 | cmake
6 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/app/src/androidTest/java/moe/madoka/umapyogin_android/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package moe.madoka.umapyogin_android
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("moe.madoka.umapyogin_android", appContext.packageName)
23 | }
24 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
17 |
18 |
21 |
22 |
25 |
26 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/app/src/main/assets/UmaPyoginFiles/resources/umamusumelocalify:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/assets/UmaPyoginFiles/resources/umamusumelocalify
--------------------------------------------------------------------------------
/app/src/main/assets/xposed_init:
--------------------------------------------------------------------------------
1 | moe.madoka.umapyogin_android.UmaPyogin
--------------------------------------------------------------------------------
/app/src/main/cpp/UmaPyogin.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include
4 | #include
5 | #include
6 | #include
7 |
8 | #include
9 |
10 | extern "C"
11 | {
12 | void *fake_dlopen(const char *libpath, int flags);
13 | void *fake_dlsym(void *handle, const char *name);
14 | int fake_dlclose(void *handle);
15 | }
16 |
17 | namespace
18 | {
19 | class AndroidHookInstaller : public UmaPyogin::HookInstaller
20 | {
21 | public:
22 | explicit AndroidHookInstaller(const std::string& il2cppLibraryPath)
23 | : m_Il2CppLibrary(fake_dlopen(il2cppLibraryPath.c_str(), RTLD_LAZY))
24 | {
25 | }
26 |
27 | ~AndroidHookInstaller() override {
28 | fake_dlclose(m_Il2CppLibrary);
29 | }
30 |
31 | void InstallHook(UmaPyogin::OpaqueFunctionPointer addr, UmaPyogin::OpaqueFunctionPointer hook,
32 | UmaPyogin::OpaqueFunctionPointer* orig) override
33 | {
34 | A64HookFunction(reinterpret_cast(addr), reinterpret_cast(hook), reinterpret_cast(orig));
35 | }
36 |
37 | UmaPyogin::OpaqueFunctionPointer LookupSymbol(const char* name) override
38 | {
39 | return reinterpret_cast(fake_dlsym(m_Il2CppLibrary, name));
40 | }
41 |
42 | private:
43 | void* m_Il2CppLibrary;
44 | };
45 | }
46 |
47 | extern "C"
48 | JNIEXPORT void JNICALL
49 | Java_moe_madoka_umapyogin_1android_UmaPyogin_initHook(JNIEnv *env, jclass clazz, jstring basePath, jstring targetLibraryPath,
50 | jboolean unlock_fps) {
51 | const auto targetLibraryPathChars = env->GetStringUTFChars(targetLibraryPath, nullptr);
52 | const std::string targetLibraryPathStr = targetLibraryPathChars;
53 | env->ReleaseStringUTFChars(targetLibraryPath, targetLibraryPathChars);
54 | const auto basePathChars = env->GetStringUTFChars(basePath, nullptr);
55 | const std::string basePathStr = basePathChars;
56 | env->ReleaseStringUTFChars(basePath, basePathChars);
57 |
58 | auto& plugin = UmaPyogin::Plugin::GetInstance();
59 | plugin.SetLogHandler([](UmaPyogin::Log::Level level, const char* msg) {
60 | __android_log_write(level == UmaPyogin::Log::Level::Error ? ANDROID_LOG_ERROR : ANDROID_LOG_INFO, "UmaPyogin", msg);
61 | });
62 | plugin.LoadConfig(UmaPyogin::Config{
63 | .StaticLocalizationFilePath = basePathStr + "/static.json",
64 | .StoryLocalizationDirPath = basePathStr + "/stories",
65 | .TextDataDictPath = basePathStr + "/database/text_data.json",
66 | .CharacterSystemTextDataDictPath = basePathStr + "/database/character_system_text.json",
67 | .RaceJikkyoCommentDataDictPath = basePathStr + "/database/race_jikkyo_comment.json",
68 | .RaceJikkyoMessageDataDictPath = basePathStr + "/database/race_jikkyo_message.json",
69 | .ExtraAssetBundlePath = basePathStr + "/resources/umamusumelocalify",
70 | .ReplaceFontPath = "assets/bundledassets/umamusumelocalify/fonts/MSYH.TTC",
71 | .OverrideFPS = unlock_fps ? 60 : 0,
72 | });
73 | plugin.InstallHook(std::make_unique(targetLibraryPathStr));
74 | }
75 |
--------------------------------------------------------------------------------
/app/src/main/java/moe/madoka/umapyogin_android/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package moe.madoka.umapyogin_android
2 |
3 | import android.annotation.SuppressLint
4 | import android.content.Context
5 | import android.content.SharedPreferences
6 | import androidx.appcompat.app.AppCompatActivity
7 | import android.os.Bundle
8 | import androidx.databinding.DataBindingUtil
9 | import moe.madoka.umapyogin_android.databinding.ActivityMainBinding
10 |
11 | data class PreferenceKey(val name: String, val defaultValue: T)
12 |
13 | fun SharedPreferences.get(key: PreferenceKey): Boolean {
14 | return getBoolean(key.name, key.defaultValue)
15 | }
16 |
17 | fun SharedPreferences.get(key: PreferenceKey): Int {
18 | return getInt(key.name, key.defaultValue)
19 | }
20 |
21 | fun SharedPreferences.get(key: PreferenceKey): Long {
22 | return getLong(key.name, key.defaultValue)
23 | }
24 |
25 | fun SharedPreferences.get(key: PreferenceKey): Float {
26 | return getFloat(key.name, key.defaultValue)
27 | }
28 |
29 | fun SharedPreferences.get(key: PreferenceKey): String? {
30 | return getString(key.name, key.defaultValue)
31 | }
32 |
33 | fun SharedPreferences.get(key: PreferenceKey?>): Set? {
34 | return getStringSet(key.name, key.defaultValue)
35 | }
36 |
37 | fun SharedPreferences.Editor.put(key: PreferenceKey, value: Boolean) {
38 | putBoolean(key.name, value)
39 | }
40 |
41 | fun SharedPreferences.Editor.put(key: PreferenceKey, value: Int) {
42 | putInt(key.name, value)
43 | }
44 |
45 | fun SharedPreferences.Editor.put(key: PreferenceKey, value: Long) {
46 | putLong(key.name, value)
47 | }
48 |
49 | fun SharedPreferences.Editor.put(key: PreferenceKey, value: Float) {
50 | putFloat(key.name, value)
51 | }
52 |
53 | fun SharedPreferences.Editor.put(key: PreferenceKey, value: String?) {
54 | putString(key.name, value)
55 | }
56 |
57 | fun SharedPreferences.Editor.put(key: PreferenceKey?>, value: Set?) {
58 | putStringSet(key.name, value)
59 | }
60 |
61 | data class UmaPyoginConfig(var enabled: Boolean, var unlockFPS: Boolean)
62 |
63 | interface ConfigListener {
64 | fun onEnabledChanged(value: Boolean)
65 | fun onUnlockFPSChanged(value: Boolean)
66 | }
67 |
68 | class MainActivity : AppCompatActivity(), ConfigListener {
69 | lateinit var config: UmaPyoginConfig
70 | lateinit var preferences: SharedPreferences
71 |
72 | override fun onCreate(savedInstanceState: Bundle?) {
73 | super.onCreate(savedInstanceState)
74 | setContentView(R.layout.activity_main)
75 |
76 | @Suppress("DEPRECATION")
77 | @SuppressLint("WorldReadableFiles")
78 | preferences = applicationContext.getSharedPreferences(
79 | BuildConfig.APPLICATION_ID,
80 | Context.MODE_WORLD_READABLE
81 | )
82 |
83 | val binding =
84 | DataBindingUtil.setContentView(this, R.layout.activity_main)
85 | config = UmaPyoginConfig(
86 | enabled = preferences.get(PREF_ENABLED),
87 | unlockFPS = preferences.get(PREF_UNLOCK_FPS),
88 | )
89 | binding.config = config
90 | binding.listener = this
91 | }
92 |
93 | override fun onEnabledChanged(value: Boolean) {
94 | val editor = preferences.edit()
95 | editor.put(PREF_ENABLED, value)
96 | editor.apply()
97 | }
98 |
99 | override fun onUnlockFPSChanged(value: Boolean) {
100 | val editor = preferences.edit()
101 | editor.put(PREF_UNLOCK_FPS, value)
102 | editor.apply()
103 | }
104 |
105 | companion object {
106 | val PREF_ENABLED = PreferenceKey("Enabled", true)
107 | val PREF_UNLOCK_FPS = PreferenceKey("UnlockFPS", true)
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/app/src/main/java/moe/madoka/umapyogin_android/UmaPyogin.kt:
--------------------------------------------------------------------------------
1 | package moe.madoka.umapyogin_android
2 |
3 | import android.annotation.SuppressLint
4 | import android.app.AndroidAppHelper
5 | import android.content.res.XModuleResources
6 | import android.util.Log
7 | import de.robv.android.xposed.*
8 | import de.robv.android.xposed.callbacks.XC_LoadPackage
9 | import java.io.File
10 | import java.io.IOException
11 | import java.io.InputStream
12 |
13 | class UmaPyogin : IXposedHookLoadPackage, IXposedHookZygoteInit {
14 | override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
15 | if (lpparam.packageName != "jp.co.cygames.umamusume") {
16 | return
17 | }
18 |
19 | val cls = lpparam.classLoader.loadClass("com.unity3d.player.UnityPlayer")
20 | XposedHelpers.findAndHookMethod(
21 | cls,
22 | "loadNative",
23 | String::class.java,
24 | object : XC_MethodHook() {
25 | @SuppressLint("UnsafeDynamicallyLoadedCode")
26 | override fun afterHookedMethod(param: MethodHookParam) {
27 | super.afterHookedMethod(param)
28 |
29 | Log.i(TAG, "UnityPlayer.loadNative")
30 |
31 | if (alreadyInitialized) {
32 | return
33 | }
34 |
35 | val pref =
36 | XSharedPreferences(BuildConfig.APPLICATION_ID, BuildConfig.APPLICATION_ID)
37 | if (!pref.file.canRead() && !pref.makeWorldReadable()) {
38 | Log.e(TAG, "Cannot load preference, all config will use default value")
39 | }
40 | val enabled = pref.get(MainActivity.PREF_ENABLED)
41 | val unlockFPS = pref.get(MainActivity.PREF_UNLOCK_FPS)
42 |
43 | if (!enabled) {
44 | return
45 | }
46 |
47 | val app = AndroidAppHelper.currentApplication()
48 | val filesDir = app.applicationContext.filesDir
49 | val umaPyoginFiles = File(filesDir, "UmaPyoginFiles")
50 | val versionFile = File(umaPyoginFiles, "version.txt")
51 | val shouldCopyAssets = if (!umaPyoginFiles.exists()) {
52 | umaPyoginFiles.mkdirs()
53 | versionFile.writeText(BuildConfig.VERSION_NAME)
54 | true
55 | } else {
56 | if (!versionFile.exists()) {
57 | umaPyoginFiles.delete()
58 | umaPyoginFiles.mkdirs()
59 | versionFile.writeText(BuildConfig.VERSION_NAME)
60 | true
61 | } else {
62 | val versionText = versionFile.readText()
63 | Log.e(TAG, "versionFile recorded version as $versionText")
64 | if (versionText == BuildConfig.VERSION_NAME) {
65 | false
66 | } else {
67 | umaPyoginFiles.delete()
68 | umaPyoginFiles.mkdirs()
69 | versionFile.writeText(BuildConfig.VERSION_NAME)
70 | true
71 | }
72 | }
73 | }
74 |
75 | if (shouldCopyAssets) {
76 | val assets = XModuleResources.createInstance(modulePath, null).assets
77 | fun forAllAssetFiles(
78 | basePath: String,
79 | action: (String, InputStream?) -> Unit
80 | ) {
81 | val assetFiles = assets.list(basePath)!!
82 | for (file in assetFiles) {
83 | try {
84 | assets.open("$basePath/$file")
85 | } catch (e: IOException) {
86 | action("$basePath/$file", null)
87 | forAllAssetFiles("$basePath/$file", action)
88 | continue
89 | }.use {
90 | action("$basePath/$file", it)
91 | }
92 | }
93 | }
94 | forAllAssetFiles("UmaPyoginFiles") { path, file ->
95 | val outFile = File(filesDir, path)
96 | if (file == null) {
97 | outFile.mkdirs()
98 | } else {
99 | outFile.outputStream().use { out ->
100 | file.copyTo(out)
101 | }
102 | }
103 | }
104 | }
105 |
106 | // TODO: 解决硬编码,兼容 armv7
107 | System.load("${File(modulePath).parent}/lib/arm64/libUmaPyogin.so")
108 | initHook(
109 | umaPyoginFiles.absolutePath,
110 | "${app.applicationInfo.nativeLibraryDir}/libil2cpp.so",
111 | unlockFPS
112 | )
113 |
114 | alreadyInitialized = true
115 | }
116 | })
117 | }
118 |
119 | override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam) {
120 | modulePath = startupParam.modulePath
121 | }
122 |
123 | private lateinit var modulePath: String
124 | private var alreadyInitialized = false
125 |
126 | companion object {
127 | @JvmStatic
128 | external fun initHook(basePath: String, targetLibraryPath: String, unlockFPS: Boolean)
129 |
130 | const val TAG = "UmaPyogin"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
16 |
17 |
24 |
25 |
28 |
29 |
36 |
37 |
38 |
41 |
42 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | UmaPyogin-Android
3 | 马儿跳!
4 | 启用插件
5 | 解锁 FPS
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/app/src/test/java/moe/madoka/umapyogin_android/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package moe.madoka.umapyogin_android
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | id 'com.android.application' version '7.2.0' apply false
4 | id 'com.android.library' version '7.2.0' apply false
5 | id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
6 | }
7 |
8 | task clean(type: Delete) {
9 | delete rootProject.buildDir
10 | }
11 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Kotlin code style for this project: "official" or "obsolete":
19 | kotlin.code.style=official
20 | # Enables namespacing of each library's R class so that its R class includes only the
21 | # resources declared in the library itself and none from the library's dependencies,
22 | # thereby reducing the size of the R class for that library
23 | android.nonTransitiveRClass=true
24 |
25 | buildSC=true
26 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akemimadoka/UmaPyogin-Android/d10875697b2ebbeb4cc51dff64bd3117b44a676f/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun May 01 20:38:16 CST 2022
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | google()
5 | mavenCentral()
6 | }
7 | }
8 | dependencyResolutionManagement {
9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
10 | repositories {
11 | google()
12 | mavenCentral()
13 | maven { url "https://api.xposed.info/" }
14 | }
15 | }
16 | rootProject.name = "UmaPyogin-Android"
17 | include ':app'
18 |
--------------------------------------------------------------------------------