From 904f6e5f3bf8fad0cc1fc03772757d674975cb93 Mon Sep 17 00:00:00 2001 From: xausky Date: Fri, 26 Apr 2019 17:49:14 +0800 Subject: [PATCH 01/24] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 1ca3577f6f31475fc9f791100a7ef28c4ec276e2 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Apr 2019 14:15:13 +0800 Subject: [PATCH 02/24] =?UTF-8?q?=E5=8F=91=E5=B8=83=203.1.0=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=8CAPK=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=94=B9=E4=B8=BA=E4=B8=8D=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E8=99=9A=E6=8B=9F=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 9 +++++---- .../github/xausky/unitymodmanager/MainApplication.java | 2 +- .../github/xausky/unitymodmanager/ShortcutActivity.java | 2 +- .../xausky/unitymodmanager/fragment/HomeFragment.java | 4 ++-- .../xausky/unitymodmanager/fragment/SettingFragment.java | 2 +- app/src/main/res/values-ko-rKR/strings.xml | 6 +++--- app/src/main/res/xml/preferences.xml | 2 +- build.gradle | 1 - 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cdae0ea..4330d79 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,13 +4,14 @@ buildscript { } dependencies { - classpath 'io.fabric.tools:gradle:1.27.0' + classpath 'io.fabric.tools:gradle:1.28.1' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' repositories { + maven { url 'https://jitpack.io' } maven { url 'https://maven.fabric.io/public' } } @@ -20,8 +21,8 @@ android { applicationId "io.github.xausky.unitymodmanager" minSdkVersion 21 targetSdkVersion 23 - versionCode 300 - versionName "3.0.0" + versionCode 310 + versionName "3.1.0" ndk{ abiFilters "armeabi-v7a","x86" } @@ -71,7 +72,7 @@ dependencies { } implementation 'com.github.medyo:android-about-page:1.2.5' //https://github.com/medyo/android-about-page - implementation 'com.github.xausky:VirtualXposed:d5e7545365' + implementation 'com.github.xausky:VirtualXposed:9b9d1d2387' //https://github.com/xausky/VirtualXposed implementation 'com.github.bartwell:ExFilePicker:0c5a7c83ae' //https://github.com/bartwell/ExFilePicker diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java b/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java index 2d471bd..1684272 100755 --- a/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java @@ -25,7 +25,7 @@ public class MainApplication extends Application { protected void attachBaseContext(Context base) { super.attachBaseContext(base); SharedPreferences settings = base.getSharedPreferences(SettingFragment.SETTINGS_PREFERENCE_NAME, Context.MODE_PRIVATE); - if(Integer.valueOf(settings.getString("apk_modify_model", "1")) == HomeFragment.APK_MODIFY_MODEL_VIRTUAL){ + if(Integer.valueOf(settings.getString("apk_modify_model", "0")) == HomeFragment.APK_MODIFY_MODEL_VIRTUAL){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { NativeEngine.disableJit(Build.VERSION.SDK_INT); } diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java b/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java index d00c47b..90f5551 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java @@ -33,7 +33,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); SharedPreferences preferences = getSharedPreferences(SettingFragment.SETTINGS_PREFERENCE_NAME, Context.MODE_PRIVATE); - int apkModifyModel = Integer.valueOf(preferences.getString("apk_modify_model", "1")); + int apkModifyModel = Integer.valueOf(preferences.getString("apk_modify_model", "0")); if(apkModifyModel != APK_MODIFY_MODEL_VIRTUAL){ Toast.makeText(this, R.string.no_virtual_model_shortcut, Toast.LENGTH_LONG).show(); finish(); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java index 35fa9ac..c9c2a27 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java @@ -112,7 +112,7 @@ public class HomeFragment extends BaseFragment implements View.OnClickListener, public BaseFragment setBase(Context base) { settings = base.getSharedPreferences(SettingFragment.SETTINGS_PREFERENCE_NAME, Context.MODE_PRIVATE); packageName = settings.getString(PACKAGE_PREFERENCE_KEY, null); - apkModifyModel = Integer.valueOf(settings.getString("apk_modify_model", "1")); + apkModifyModel = Integer.valueOf(settings.getString("apk_modify_model", "0")); persistentSupport = settings.getBoolean("persistent_support", true); obbSupport = settings.getBoolean("obb_support", false); return super.setBase(base); @@ -123,7 +123,7 @@ public BaseFragment setBase(Context base) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { context = inflater.getContext(); settings = context.getSharedPreferences(SettingFragment.SETTINGS_PREFERENCE_NAME, Context.MODE_PRIVATE); - apkModifyModel = Integer.valueOf(settings.getString("apk_modify_model", "1")); + apkModifyModel = Integer.valueOf(settings.getString("apk_modify_model", "0")); persistentSupport = settings.getBoolean("persistent_support", true); obbSupport = settings.getBoolean("obb_support", false); dialog = new ApplicationChooseDialog(context, this, ALL_APPLICATION_PACKAGE_REGEX, apkModifyModel == APK_MODIFY_MODEL_VIRTUAL, true); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index 1b7a4b3..9f30fdf 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -85,7 +85,7 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { if(s.equals("apk_modify_model")){ - if(Integer.valueOf(sharedPreferences.getString("apk_modify_model", "1")) == HomeFragment.APK_MODIFY_MODEL_VIRTUAL && !VirtualCore.get().isStartup()){ + if(Integer.valueOf(sharedPreferences.getString("apk_modify_model", "0")) == HomeFragment.APK_MODIFY_MODEL_VIRTUAL && !VirtualCore.get().isStartup()){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { NativeEngine.disableJit(Build.VERSION.SDK_INT); } diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index a62f119..0c421c1 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -51,8 +51,8 @@ 먼저 홈 화면에서 클라이언트를 설치해주시고, 설치된 게임 파일이 제거되지 않은지 확인해주십시오. 지원되지 않는 기능입니다. 모드 설치에 실패하였습니다 - The modification of the OBB file failed. Please confirm that the setting client has the corresponding obb file. It is recommended to close the obb support and try again. - Get the root permission fails, please contact the root device or switch to other apk modification modes. + OBB 파일의 수정 하지 못했습니다. 설정 클라이언트 해당 obb 파일에 있는지 확인 하십시오. Obb 지원을 닫고 다시 시도 하는 것이 좋습니다. + 루트 권한 실패 얻을, 하시기 바랍니다 연락 루트 장치 또는 다른 apk 수정 모드 전환. 애플리케이션이 내부 저장소 읽기 및 쓰기 권한을 가지고 있지 않습니다. 모바일 기기의 설정에서 권한 설정을 해주십시오. 이 권한 없이는 애플리케이션이 제대로 작동하지 않습니다. 외부 모드 모니터링 시작: %s 외부 모드 모니터링 정지: %s @@ -114,5 +114,5 @@ Mod [%s] 감압 오류 모듈 파일 손상 되지 않은 확인 하십시오. 가상 모드에서 사용할 수 없는 기능 OnlineMods - Is the legacy mod of the original client detected deleted? + 원래 클라이언트 감지의 레거시 모드 삭제? diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 2092d3b..07bc59f 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -4,7 +4,7 @@ android:key="apk_modify_model" android:title="@string/apk_modify_model_title" android:summary="@string/apk_modify_model_summary" - android:defaultValue="1" + android:defaultValue="0" android:entries="@array/apk_modify_model" android:entryValues="@array/apk_modify_model_values"/> Date: Sat, 27 Apr 2019 23:38:22 +0800 Subject: [PATCH 03/24] Update strings.xml Improved translation. Some translation still looks weird but I think overall translation is better than before. --- app/src/main/res/values/strings.xml | 142 ++++++++++++++-------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ef7e9f..0f5203f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,8 +2,8 @@ Unity Mod Manager Launch Game Home - Mod - Attach + Modules + Add-on Settings System About @@ -17,103 +17,103 @@ Korean - Bebridge - Enable mod: %d\nInstalled mod: %d\nInstalled attach: %d\nVisible applications: %d\nApplications in VirtualApp: %d + Enabled modules: %d\nInstalled modules: %d\nInstalled add-on: %d\nVisible applications: %d\nApplications in VirtualApp: %d Latest Version: %s - Latest Version: ..... + Latest Version: ... Current Version: %s - Click Install Client - Client version:%s + Click to install client. + Client version: %s icon - Processing + Processing... Confirm Cancel Prompt - Are you sure you want to delete [%s] attach? - Are you sure you want to remove [%s] visibility? - Failed to delete attach. - Delete attach successfully. - Remove visibility successfully. + Delete [%s] add-on? + Remove [%s] visibility? + Failed to delete add-on! + Add-on has successfully installed. + App visibility deleted successfully. Unity - Visibility - Warning, module file deletion failed: %s! - Are you sure to delete the module: %s? - Failed to create the directory. Please confirm that the application has external storage read and write permissions. - Same name mod %s already exists, skip import. + App Visibility + WARNING! Failed to delete module file: %s! + Delete module: %s? + Failed to create directory! Please make sure the Storage permission has been granted in Settings. + Import failed! %s is already exists. Please wait - In operation - Please enter the decompression password + In progress... + Enter password %d - Click to generate the mapping file (external resources need to be downloaded first) - Map file record (click to regenerate): %d + Click to generate mapping file (external resources need to download first) + File mapping record (click to regenerate): %d Introduction:\n%s %s - Author:%s - Please go to the home page to install the client first, and make sure the installation source is not uninstalled or deleted. - Unsupported operation. - The installation module failed. Please clear the data again, or go to BiliBili for help. - The modification of the OBB file failed. Please confirm that the setting client has the corresponding obb file. It is recommended to close the obb support and try again. - Get the root permission fails, please contact the root device or switch to other apk modification modes. - The application does not have permission to read and write phone storage, please go to the phone rights management interface to give, otherwise it can not run. - External mod monitoring start: %s - External mod monitoring stop: %s - There is no information available for viewing within the mod. - Please enter the decompression password for module [%s], wrong password tried: %s - Please select the client + Author: %s + Navigate to home to install client first. Make sure the client installation source is not uninstalled or deleted. + Operation denied. + Failed to install module! Please clear the app data and try again, or go to bilibili to seek for help. + Failed to modify OBB file! Please make sure the installed client has corresponding OBB file, or toggle off OBB patch and try again. + Failed to grant root permission! Please make sure your device has been rooted, or switch to another APK resource modification mode and try again. + Failed to grant Phone permission! Please make sure the Phone permission has been granted in Settings. This app wouldn\'t run if Phone permission is not granted. + Start monitoring external module: %s + Stop monitoring external module: %s + No information can be viewed in this module. + Enter password [%s], wrong password tried count: %s + Select a client Select from file Skip - New version release:%s - Update log: %s \n\n If the update fails, you can go to github.com to find the latest download address and update it yourself. - installation failed - Successful installation - After the installation is successful, you can create shortcuts in the settings interface. + New version released: %s + Changelog: %s \n\n If failed to update, please go to https://github.com/xausky/UnityModManager/releases and manually download APK. + Installation failed! + Successfully installed! + Successfully installed! You can tap to create game shortcut in the Settings panel. [Mod Manager] - Failed to create backup directory - Please install the client and download hot update resources first. - The mapping file was generated successfully. - Please make sure there is at least one change source. - my email - my bilibili - my github - Improved translation - Please install the client first to generate the index. - External module directory import mode is not recommended for no mod developers. - An external module change was detected and the game was restarted. - Import mod - Export integration package success: [%s] - Failed to export the integration package. Please make sure that the program can read and write external storage. - APK resource modification model - Choose how to modify the resources in the APK. If you do not modify the mode, you do not modify the APK resource. You can continue to use persistent resource patches. + Failed to create backup directory! + Please install a client and download hotfix first. + File mapping is generated successfully. + Please make sure there have at least one modifiable source. + Email + Bilibili + Github + Improve translation + Please install a client first to generate the index. + External module directory import mode. NOT recommended for non-mod developers. + External module changes detected! game will restart. + Import modules + Successfulled export integration package: [%s] + Failed to export the integration package! Please make sure the Storage permission has been granted in Settings. + APK resource modification mode + Select how to modify the resources in the APK. If you select "No modification", APK resource wouldn\'t be modified, you can continue to use persistent resource patches. Persistent resource patch support - Unity\'s PersistentDataPath path provides resource patch support, such as \"Honkai Impact 3\" UC version. - Export Integration APK file + Provide Unity\'s PersistentDataPath path resource patch support, such as \"Honkai Impact 3\" UC version. + Export Integrated APK file Click to export the patched APK file to out.apk in the internal storage root directory. Create a game shortcut - Create a game shortcut to go directly from the desktop to the game in the virtual environment without first opening the manager. + You can open the game directly from desktop in the virtual environment without opening the manager. Unable to export integrated package No Modify APK mode - No VirtualApp Model cannot create shortcuts. Start using the original icon. + VirtualApp Model doesn\'t exist in manager, create shortcuts failed. You can directly open the app directly in app drawer. - No Modify + No Modification VirtualApp Model - Root Privilege Model (Caution) + Root Privilege Mode (Proceed with caution) 0 1 2 - Android OBB resource file patch support - Android OBB resource file patch support, such as \"Honkai Impact 3\" JP service, SEA service, global service. - Using Obb support without modifying the APK mode may cause the game to fail to start. + Android OBB patch resource file support + ONLY toggle on if your app supports OBB file patching, such as \"Honkai Impact 3\" JP server, SEA server and global server. + Using OBB support without changing APK mode may cause the game fail to start! 0 0 unknown - Conflict files: %s - Display mod file conflict information - Display mod file conflict information for module authors to debug. - The number of valid files in mod [%s] is zero. Please make sure the mapping is generated correctly. - Mod [%s] decompression error, please confirm that the module file is not damaged. - Feature not available in non-virtual mode - OnlineMods - Is the legacy mod of the original client detected deleted? + Conflicted files: %s + View conflicted module file information + View conflicted module file information, this can let module authors easy to debug. + Valid module files [%s] is zero. Please make sure file mapping is generated correctly. + Module [%s] unzip error, please make sure the module file doesn\'t corrupted. + This feature is not available for non-virtual mode. + Online Modules + Does the legacy module has been deleted in original cilent? From dac55d67239b1ec48c98d97a4012a4fffd8b3bd1 Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 5 May 2019 13:34:43 +0800 Subject: [PATCH 04/24] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ----------------------- .github/ISSUE_TEMPLATE/feature_request.md | 20 ------------ 2 files changed, 58 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea7..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. From cfcaa8893265bc37187b87a6771030097e9b14c8 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 8 Jun 2019 17:13:14 +0800 Subject: [PATCH 05/24] =?UTF-8?q?=E5=8F=91=E5=B8=83=203.2.0=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E6=9B=B4=E6=96=B0VXP=E4=BF=AE=E5=A4=8DMIUI?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=83=A8=E5=88=86=E8=B5=84=E6=BA=90=E4=BF=AE=E6=94=B9=E5=87=BA?= =?UTF-8?q?=E9=94=99=EF=BC=8C=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 ++-- app/src/main/cpp/libuabe/BundleFile.cc | 44 +++++++++---------- .../fragment/HomeFragment.java | 4 +- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4330d79..ed8159c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId "io.github.xausky.unitymodmanager" minSdkVersion 21 targetSdkVersion 23 - versionCode 310 - versionName "3.1.0" + versionCode 320 + versionName "3.2.0" ndk{ abiFilters "armeabi-v7a","x86" } @@ -72,12 +72,12 @@ dependencies { } implementation 'com.github.medyo:android-about-page:1.2.5' //https://github.com/medyo/android-about-page - implementation 'com.github.xausky:VirtualXposed:9b9d1d2387' + implementation 'com.github.xausky:VirtualXposed:12332ab93b' //https://github.com/xausky/VirtualXposed implementation 'com.github.bartwell:ExFilePicker:0c5a7c83ae' //https://github.com/bartwell/ExFilePicker implementation 'com.github.xausky:CheckVersionLib:ac25f0874e' //https://github.com/xausky/CheckVersionLib implementation 'com.crashlytics.sdk.android:answers:1.4.7' - implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9' + implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' } diff --git a/app/src/main/cpp/libuabe/BundleFile.cc b/app/src/main/cpp/libuabe/BundleFile.cc index a2a8c11..a60cf72 100644 --- a/app/src/main/cpp/libuabe/BundleFile.cc +++ b/app/src/main/cpp/libuabe/BundleFile.cc @@ -90,37 +90,33 @@ namespace xausky { bundleStream.WriteStringToNull(versionEngine); BinaryStream blocksStream(true); BinaryStream assertStream(true); + BinaryStream tempAssertStream(true); blocksStream.WriteConst(0, 0x10); - int sizeCount = 0; for(std::list::iterator it = files.begin(); it != files.end(); it++){ - sizeCount+=(*it)->stream->size(); + MemoryFile* file = (*it); + file->offset = tempAssertStream.positionOutput(); + (*it)->stream->WriteTo(tempAssertStream); + file->size = file->offset - tempAssertStream.positionOutput(); } - int blockCount = (sizeCount - 1)/maxBlockSize + 1; + int blockCount = (tempAssertStream.positionOutput() - 1)/maxBlockSize + 1; blocksStream.WriteInt32(blockCount); int uncompressedSize = 0; int compressedSize = 0; - int position = 0; - for(std::list::iterator it = files.begin(); it != files.end(); it++){ - MemoryFile* file = (*it); - file->offset = position; - do{ - file->stream->ReadData(uncompressedData, maxBlockSize); - uncompressedSize = file->stream->count(); - if(uncompressedSize > 0){ - blocksStream.WriteInt32(uncompressedSize); - compressedSize = LZ4_compress_HC(uncompressedData, compressedData, uncompressedSize, maxBlockSize + 1024, LZ4HC_CLEVEL_DEFAULT); - if(compressedSize <= 0){ - DecompressDataException e; - throw e; - } - blocksStream.WriteInt32(compressedSize); - blocksStream.WriteInt16(blocksFlag); - assertStream.WriteData(compressedData, compressedSize); - position += uncompressedSize; + do{ + tempAssertStream.ReadData(uncompressedData, maxBlockSize); + uncompressedSize = tempAssertStream.count(); + if(uncompressedSize > 0){ + blocksStream.WriteInt32(uncompressedSize); + compressedSize = LZ4_compress_HC(uncompressedData, compressedData, uncompressedSize, maxBlockSize + 1024, LZ4HC_CLEVEL_DEFAULT); + if(compressedSize <= 0){ + DecompressDataException e; + throw e; } - }while(uncompressedSize > 0 && !file->stream->eof()); - file->size = position - file->offset; - } + blocksStream.WriteInt32(compressedSize); + blocksStream.WriteInt16(blocksFlag); + assertStream.WriteData(compressedData, compressedSize); + } + }while(uncompressedSize > 0 && !tempAssertStream.eof()); blocksStream.WriteInt32(files.size()); for(std::list::iterator it = files.begin(); it != files.end(); it++){ MemoryFile* file = (*it); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java index c9c2a27..cb3f600 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java @@ -165,7 +165,7 @@ private void checkVersion() { AllenVersionChecker .getInstance() .requestVersion() - .setRequestUrl("https://api.github.com/repos/xausky/UnityModManager/releases") + .setRequestUrl("http://umms.xausky.cn/releases/api") .request(new RequestVersionListener() { @Nullable @Override @@ -191,7 +191,7 @@ public UIData onRequestVersionSuccess(String result) { UIData data = UIData.create(); data.setTitle(getString(R.string.new_version_release, latestVersion)); data.setContent(getString(R.string.update_logs, latestRelease.getString("body"))); - data.setDownloadUrl(latestRelease.getJSONArray("assets").getJSONObject(0).getString("browser_download_url")); + data.setDownloadUrl(String.format("http://umms.xausky.cn/releases/download/%s/app-release.apk", latestVersion)); return data; } else { Drawable check = context.getResources().getDrawable(R.drawable.ic_check_circle); From 7977d5329af75ad4d4d36fcccda8e92fe35db2e9 Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 9 Jun 2019 12:40:27 +0800 Subject: [PATCH 06/24] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E4=BF=AE=E6=94=B9=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/libuabe/BundleFile.cc | 7 ++++--- app/src/main/cpp/libuabe/BundleFile.hh | 5 ++--- app/src/main/cpp/libuabe/MemoryFile.hh | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/cpp/libuabe/BundleFile.cc b/app/src/main/cpp/libuabe/BundleFile.cc index a60cf72..33463a5 100644 --- a/app/src/main/cpp/libuabe/BundleFile.cc +++ b/app/src/main/cpp/libuabe/BundleFile.cc @@ -79,10 +79,11 @@ namespace xausky { BinaryStream* fileStream = new BinaryStream(data, size, true); delete[] data; MemoryFile* file = new MemoryFile(name, fileStream); + file->flag = flag; files.push_back(file); } } - void BundleFile::save(BinaryStream& bundleStream, int32_t maxBlockSize, int32_t bundleFlag, int16_t blocksFlag, int32_t fileFlag){ + void BundleFile::save(BinaryStream& bundleStream, int32_t maxBlockSize, int32_t bundleFlag, int16_t blocksFlag){ char uncompressedData[maxBlockSize], compressedData[maxBlockSize + 1024]; bundleStream.WriteStringToNull(fileType); bundleStream.WriteInt32(fileVersion); @@ -96,7 +97,7 @@ namespace xausky { MemoryFile* file = (*it); file->offset = tempAssertStream.positionOutput(); (*it)->stream->WriteTo(tempAssertStream); - file->size = file->offset - tempAssertStream.positionOutput(); + file->size = tempAssertStream.positionOutput() - file->offset; } int blockCount = (tempAssertStream.positionOutput() - 1)/maxBlockSize + 1; blocksStream.WriteInt32(blockCount); @@ -122,7 +123,7 @@ namespace xausky { MemoryFile* file = (*it); blocksStream.WriteInt64(file->offset); blocksStream.WriteInt64(file->size); - blocksStream.WriteInt32(fileFlag); + blocksStream.WriteInt32(file->flag); blocksStream.WriteStringToNull(file->name); } uncompressedSize = blocksStream.size(); diff --git a/app/src/main/cpp/libuabe/BundleFile.hh b/app/src/main/cpp/libuabe/BundleFile.hh index a644c5f..047bce0 100644 --- a/app/src/main/cpp/libuabe/BundleFile.hh +++ b/app/src/main/cpp/libuabe/BundleFile.hh @@ -22,7 +22,7 @@ namespace xausky { }; struct DecompressDataException : std::exception { - const char *what() const noexcept { return "decompress data excption"; } + const char *what() const noexcept { return "Decompress data exception"; } }; class BundleFile { @@ -31,8 +31,7 @@ namespace xausky { void open(BinaryStream &stream); - void save(BinaryStream &stream, int32_t maxBlockSize = 131072, int32_t bundleFlag = 67, - int16_t blocksFlag = 3, int32_t fileFlag = 4); + void save(BinaryStream &stream, int32_t maxBlockSize = 131072, int32_t bundleFlag = 67, int16_t blocksFlag = 3); void patch(map *> &mods); diff --git a/app/src/main/cpp/libuabe/MemoryFile.hh b/app/src/main/cpp/libuabe/MemoryFile.hh index e2a353f..f19f1a4 100644 --- a/app/src/main/cpp/libuabe/MemoryFile.hh +++ b/app/src/main/cpp/libuabe/MemoryFile.hh @@ -9,6 +9,7 @@ namespace xausky { ~MemoryFile(); string name; BinaryStream* stream; + int32_t flag; int64_t offset; int64_t size; }; From fb823ece84e8156474e878d4e06b548845ea827b Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 9 Jun 2019 14:06:42 +0800 Subject: [PATCH 07/24] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=9E=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E6=A8=A1=E5=BC=8F=E5=BC=80=E5=8F=91=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E7=94=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unitymodmanager/fragment/ModFragment.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java index ec1c2cd..21025ac 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java @@ -24,11 +24,8 @@ import org.apache.commons.io.IOUtils; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URL; -import java.net.URLEncoder; import java.util.Collections; import java.util.List; import java.util.TreeSet; @@ -230,7 +227,13 @@ public void onExternalChange() { public void run() { Toast.makeText(context, R.string.checked_external_mod_changed, Toast.LENGTH_LONG).show(); HomeFragment fragment = (HomeFragment)BaseFragment.fragment(R.id.nav_home, ModFragment.this.getActivity().getApplication()); - VirtualCore.get().killApp(fragment.packageName, 0); + if (fragment.apkModifyModel == HomeFragment.APK_MODIFY_MODEL_VIRTUAL){ + VirtualCore.get().killApp(fragment.packageName, 0); + } else { + if(Shell.rootAccess()){ + Shell.su("am force-stop " + fragment.packageName).exec(); + } + } MainActivity activity = (MainActivity)context; needPatch = true; activity.launch(); @@ -244,7 +247,7 @@ public int patch(String apkPath, String baseApkPath, String persistentPath, Stri return ModUtils.RESULT_STATE_ROOT_ERROR; } //暂时禁用SELinux,并且修改目标APK权限为666。 - Shell.Sync.su("setenforce 0", "chmod 666 " + apkPath); + Shell.su("setenforce 0", "chmod 666 " + apkPath).exec(); } try { Log.d(MainApplication.LOG_TAG, "patch: apkPath=" + apkPath + ", baseApkPath=" + baseApkPath + ", apkModifyModel=" + apkModifyModel); @@ -322,7 +325,7 @@ public void run() { }finally { if(apkModifyModel == HomeFragment.APK_MODIFY_MODEL_ROOT){ //修改目标APK权限回644,并且重新启用SELinux。 - Shell.Sync.su("chmod 644 " + apkPath, "setenforce 0"); + Shell.su("chmod 644 " + apkPath, "setenforce 0").exec(); } } } From 29918892e0dd1b0c442cf828f1380d7b80584c58 Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 9 Jun 2019 15:36:04 +0800 Subject: [PATCH 08/24] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Gradle=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 4038070..bcc63ea 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.4.1' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 79a4c98..1d99f1d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Mar 16 10:40:49 CST 2019 +#Sun Jun 09 15:07:53 CST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From 83f09b82e2ae67534cb70389008140f962208357 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Jul 2019 16:23:21 +0800 Subject: [PATCH 09/24] =?UTF-8?q?3.3.0=20=E7=89=88=E6=9C=AC=E5=8F=91?= =?UTF-8?q?=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新安卓兼容组件版本 更新崩溃统计和使用统计服务 修复部分系统不会申请存储权限导致的问题 --- .travis.yml | 1 - app/build.gradle | 34 ++++++-------- app/google-services.json | 40 ++++++++++++++++ app/src/main/AndroidManifest.xml | 5 +- .../xausky/unitymodmanager/MainActivity.java | 46 +++++++++++++++---- .../unitymodmanager/MainApplication.java | 3 -- .../unitymodmanager/ShortcutActivity.java | 2 +- .../adapter/AttachesAdapter.java | 10 ++-- .../unitymodmanager/adapter/ModsAdapter.java | 17 +++---- .../adapter/VisibilityAdapter.java | 10 ++-- .../unitymodmanager/dialog/ConfirmDialog.java | 4 +- .../dialog/PasswordDialog.java | 4 +- .../xausky/unitymodmanager/domain/Mod.java | 3 +- .../fragment/AttachFragment.java | 4 +- .../fragment/HomeFragment.java | 34 ++++---------- .../fragment/InfoFragment.java | 3 +- .../unitymodmanager/fragment/ModFragment.java | 4 +- .../fragment/SettingFragment.java | 4 +- .../fragment/VisibilityFragment.java | 11 ++--- .../unitymodmanager/utils/FabBehavior.java | 9 ++-- app/src/main/res/layout/activity_main.xml | 6 +-- app/src/main/res/layout/attach_fragment.xml | 2 +- app/src/main/res/layout/home_fragment.xml | 16 +++---- app/src/main/res/layout/mod_fragment.xml | 2 +- .../main/res/layout/navigation_content.xml | 12 ++--- .../main/res/layout/visibility_fragment.xml | 2 +- build.gradle | 7 ++- 27 files changed, 162 insertions(+), 133 deletions(-) create mode 100644 app/google-services.json diff --git a/.travis.yml b/.travis.yml index 26bcf6b..83fbf68 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ install: - echo y | sdkmanager "ndk-bundle" script: - curl -u xausky:$SYSKILLER_TOKEN https://syskiller.org/remote.php/webdav/xausky.jks -o ../xausky.jks - - echo apiSecret=$FABRIC_APP_SECRET > app/fabric.properties - ./gradlew assembleRelease deploy: skip_cleanup: true diff --git a/app/build.gradle b/app/build.gradle index ed8159c..18b0728 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,18 +1,9 @@ -buildscript { - repositories { - maven { url 'https://maven.fabric.io/public' } - } - - dependencies { - classpath 'io.fabric.tools:gradle:1.28.1' - } -} apply plugin: 'com.android.application' apply plugin: 'io.fabric' +apply plugin: 'com.google.firebase.firebase-perf' repositories { - maven { url 'https://jitpack.io' } - maven { url 'https://maven.fabric.io/public' } + } android { @@ -21,8 +12,8 @@ android { applicationId "io.github.xausky.unitymodmanager" minSdkVersion 21 targetSdkVersion 23 - versionCode 320 - versionName "3.2.0" + versionCode 330 + versionName "3.3.0" ndk{ abiFilters "armeabi-v7a","x86" } @@ -59,17 +50,15 @@ android { dependencies { implementation 'commons-io:commons-io:2.4' //最新版2.6使用新的JavaFileAPI,无法在目前Android版本上使用。 - implementation 'com.android.support:design:28.0.0' - implementation 'com.android.support:cardview-v7:28.0.0' - implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'com.hzy:libp7zip:1.6.0' //https://github.com/hzy3774/AndroidP7zip implementation 'com.github.topjohnwu:libsu:2.0.2' //https://github.com/topjohnwu/libsu - implementation('com.daimajia.slider:library:1.1.5') { - //https://github.com/daimajia/AndroidImageSlider - exclude group: 'com.android.support', module: 'support-v4' - } + implementation('com.daimajia.slider:library:1.1.5') + //https://github.com/daimajia/AndroidImageSlider implementation 'com.github.medyo:android-about-page:1.2.5' //https://github.com/medyo/android-about-page implementation 'com.github.xausky:VirtualXposed:12332ab93b' @@ -78,6 +67,9 @@ dependencies { //https://github.com/bartwell/ExFilePicker implementation 'com.github.xausky:CheckVersionLib:ac25f0874e' //https://github.com/xausky/CheckVersionLib - implementation 'com.crashlytics.sdk.android:answers:1.4.7' + implementation 'com.google.firebase:firebase-core:17.0.1' + implementation 'com.google.firebase:firebase-perf:18.0.1' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' } + +apply plugin: 'com.google.gms.google-services' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..a56eedd --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,40 @@ +{ + "project_info": { + "project_number": "999756837706", + "firebase_url": "https://unity-mod-manager.firebaseio.com", + "project_id": "unity-mod-manager", + "storage_bucket": "unity-mod-manager.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:999756837706:android:21dd3da8337e5843", + "android_client_info": { + "package_name": "io.github.xausky.unitymodmanager" + } + }, + "oauth_client": [ + { + "client_id": "999756837706-t3gfo4q8adrfknhqm52gmbu7jbnneb3h.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDL7ySG-vDz4_iXaDcRC6SaeJk6rdREucc" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "999756837706-t3gfo4q8adrfknhqm52gmbu7jbnneb3h.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1165bc1..11c10d6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ - diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java b/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java index c257e96..10ce55d 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java @@ -1,21 +1,27 @@ package io.github.xausky.unitymodmanager; +import android.app.Activity; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.design.widget.NavigationView; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBar; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.util.Log; +import androidx.annotation.NonNull; +import com.google.android.material.navigation.NavigationView; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.appcompat.app.ActionBar; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + import android.view.View; import android.view.Menu; import android.view.MenuItem; @@ -26,13 +32,13 @@ import java.io.File; -import io.github.xausky.unitymodmanager.adapter.VisibilityAdapter; import io.github.xausky.unitymodmanager.fragment.BaseFragment; import io.github.xausky.unitymodmanager.fragment.HomeFragment; import io.github.xausky.unitymodmanager.fragment.ModFragment; import io.github.xausky.unitymodmanager.utils.ModUtils; public class MainActivity extends AppCompatActivity { + private static final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"}; private DrawerLayout drawerLayout; private FloatingActionButton actionButton; private NavigationView navigationView; @@ -56,9 +62,29 @@ protected void onNewIntent(Intent intent) { } } + /** + * 检查是否已被授权危险权限 + * @param permissions + * @return + */ + public boolean checkDangerousPermissions(Activity ac, String[] permissions) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return true; + } + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED || ActivityCompat.shouldShowRequestPermissionRationale(ac, permission)) { + return false; + } + } + return true; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!checkDangerousPermissions(this, REQUIRED_PERMISSIONS) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ + this.requestPermissions(REQUIRED_PERMISSIONS, 0); + } setContentView(R.layout.activity_main); SharedPreferences preferences = this.getSharedPreferences("default", MODE_PRIVATE); BaseFragment.initialize(this); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java b/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java index 1684272..4b2dbb7 100755 --- a/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/MainApplication.java @@ -6,12 +6,10 @@ import android.content.SharedPreferences; import android.os.Build; -import com.crashlytics.android.Crashlytics; import com.lody.virtual.client.NativeEngine; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.stub.VASettings; -import io.fabric.sdk.android.Fabric; import io.github.xausky.unitymodmanager.fragment.HomeFragment; import io.github.xausky.unitymodmanager.fragment.SettingFragment; @@ -43,6 +41,5 @@ protected void attachBaseContext(Context base) { @Override public void onCreate() { super.onCreate(); - Fabric.with(this, new Crashlytics()); } } diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java b/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java index 90f5551..ae88103 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/ShortcutActivity.java @@ -5,7 +5,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.widget.Toast; import com.lody.virtual.client.core.VirtualCore; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/adapter/AttachesAdapter.java b/app/src/main/java/io/github/xausky/unitymodmanager/adapter/AttachesAdapter.java index fbb9cc6..48395c3 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/adapter/AttachesAdapter.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/adapter/AttachesAdapter.java @@ -5,11 +5,11 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/adapter/ModsAdapter.java b/app/src/main/java/io/github/xausky/unitymodmanager/adapter/ModsAdapter.java index a945cc3..44f6d7b 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/adapter/ModsAdapter.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/adapter/ModsAdapter.java @@ -6,13 +6,13 @@ import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.Drawable; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; -import android.util.JsonWriter; + +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; + import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -36,7 +36,6 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -52,9 +51,7 @@ import io.github.xausky.unitymodmanager.dialog.PasswordDialog; import io.github.xausky.unitymodmanager.domain.Mod; import io.github.xausky.unitymodmanager.utils.ModUtils; -import io.github.xausky.unitymodmanager.utils.NativeUtils; -import static io.github.xausky.unitymodmanager.utils.NativeUtils.PatchApk; import static io.github.xausky.unitymodmanager.utils.NativeUtils.RESULT_STATE_INTERNAL_ERROR; /** diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/adapter/VisibilityAdapter.java b/app/src/main/java/io/github/xausky/unitymodmanager/adapter/VisibilityAdapter.java index 8812dcf..63975a2 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/adapter/VisibilityAdapter.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/adapter/VisibilityAdapter.java @@ -6,11 +6,11 @@ import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.ItemTouchHelper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/dialog/ConfirmDialog.java b/app/src/main/java/io/github/xausky/unitymodmanager/dialog/ConfirmDialog.java index ceca433..63e051a 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/dialog/ConfirmDialog.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/dialog/ConfirmDialog.java @@ -1,8 +1,8 @@ package io.github.xausky.unitymodmanager.dialog; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import io.github.xausky.unitymodmanager.R; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/dialog/PasswordDialog.java b/app/src/main/java/io/github/xausky/unitymodmanager/dialog/PasswordDialog.java index 5c8b88e..9bd9fe9 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/dialog/PasswordDialog.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/dialog/PasswordDialog.java @@ -1,8 +1,8 @@ package io.github.xausky.unitymodmanager.dialog; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import android.view.View; import android.widget.EditText; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/domain/Mod.java b/app/src/main/java/io/github/xausky/unitymodmanager/domain/Mod.java index 62b8e71..1e9ff10 100755 --- a/app/src/main/java/io/github/xausky/unitymodmanager/domain/Mod.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/domain/Mod.java @@ -1,8 +1,7 @@ package io.github.xausky.unitymodmanager.domain; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; -import java.util.List; import java.util.Set; /** diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/AttachFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/AttachFragment.java index 2ec7760..7e130a6 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/AttachFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/AttachFragment.java @@ -4,8 +4,8 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java index cb3f600..ce2e145 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java @@ -1,28 +1,23 @@ package io.github.xausky.unitymodmanager.fragment; import android.app.Activity; -import android.app.PendingIntent; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.content.pm.PackageParser; -import android.content.pm.ShortcutManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.net.sip.SipRegistrationListener; -import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v4.content.pm.ShortcutInfoCompat; -import android.support.v4.content.pm.ShortcutManagerCompat; -import android.support.v4.graphics.drawable.IconCompat; -import android.support.v7.widget.CardView; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.core.content.pm.ShortcutInfoCompat; +import androidx.core.content.pm.ShortcutManagerCompat; +import androidx.core.graphics.drawable.IconCompat; +import androidx.cardview.widget.CardView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -38,36 +33,25 @@ import com.lody.virtual.remote.InstallResult; import com.lody.virtual.remote.InstalledAppInfo; -import io.github.xausky.unitymodmanager.MainActivity; import io.github.xausky.unitymodmanager.dialog.ConfirmDialog; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.HashMap; import java.util.HashSet; -import javax.net.ssl.HttpsURLConnection; - import io.github.xausky.unitymodmanager.MainApplication; import io.github.xausky.unitymodmanager.R; import io.github.xausky.unitymodmanager.ShortcutActivity; import io.github.xausky.unitymodmanager.dialog.ApplicationChooseDialog; import io.github.xausky.unitymodmanager.utils.ModUtils; import io.github.xausky.unitymodmanager.utils.NativeUtils; -import ru.bartwell.exfilepicker.utils.Utils; /** * Created by xausky on 18-3-3. @@ -165,7 +149,7 @@ private void checkVersion() { AllenVersionChecker .getInstance() .requestVersion() - .setRequestUrl("http://umms.xausky.cn/releases/api") + .setRequestUrl("https://api.github.com/repos/xausky/UnityModManager/releases") .request(new RequestVersionListener() { @Nullable @Override @@ -191,7 +175,7 @@ public UIData onRequestVersionSuccess(String result) { UIData data = UIData.create(); data.setTitle(getString(R.string.new_version_release, latestVersion)); data.setContent(getString(R.string.update_logs, latestRelease.getString("body"))); - data.setDownloadUrl(String.format("http://umms.xausky.cn/releases/download/%s/app-release.apk", latestVersion)); + data.setDownloadUrl(latestRelease.getJSONArray("assets").getJSONObject(0).getString("browser_download_url")); return data; } else { Drawable check = context.getResources().getDrawable(R.drawable.ic_check_circle); @@ -478,7 +462,7 @@ public void run() { if (modFragment.getEnableItemCount() > 0) { modFragment.setNeedPatch(true); } - if (modFragment.getItemCount() > 0 && !HomeFragment.this.getActivity().isFinishing()) { + if (modFragment.getItemCount() > 0 && !((Activity)confirmDialog.getContext()).isFinishing()) { confirmDialog.show(); } } diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/InfoFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/InfoFragment.java index eccbd88..1ee7923 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/InfoFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/InfoFragment.java @@ -1,14 +1,13 @@ package io.github.xausky.unitymodmanager.fragment; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import io.github.xausky.unitymodmanager.R; import mehdi.sakout.aboutpage.AboutPage; -import mehdi.sakout.aboutpage.Element; /** * Created by xausky on 18-3-3. diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java index 21025ac..73118ef 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java @@ -6,8 +6,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index 9f30fdf..65df09e 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -9,8 +9,8 @@ import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; -import android.support.annotation.Nullable; -import android.util.Log; +import androidx.annotation.Nullable; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/VisibilityFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/VisibilityFragment.java index 0b16898..081eac1 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/VisibilityFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/VisibilityFragment.java @@ -3,22 +3,17 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.BottomSheetDialog; -import android.support.v7.widget.RecyclerView; -import android.util.Log; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; -import com.lody.virtual.client.core.InstallStrategy; import com.lody.virtual.client.core.VirtualCore; -import com.lody.virtual.remote.InstallResult; -import io.github.xausky.unitymodmanager.MainApplication; import io.github.xausky.unitymodmanager.R; -import io.github.xausky.unitymodmanager.adapter.AttachesAdapter; import io.github.xausky.unitymodmanager.adapter.VisibilityAdapter; import io.github.xausky.unitymodmanager.dialog.ApplicationChooseDialog; diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/FabBehavior.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/FabBehavior.java index cd6f08c..8263d15 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/utils/FabBehavior.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/FabBehavior.java @@ -2,17 +2,14 @@ import android.animation.Animator; import android.content.Context; -import android.support.design.widget.CoordinatorLayout; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.animation.FastOutSlowInInterpolator; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; +import androidx.interpolator.view.animation.FastOutSlowInInterpolator; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.view.ViewPropertyAnimator; import android.view.animation.Interpolator; -import io.github.xausky.unitymodmanager.MainApplication; - public class FabBehavior extends CoordinatorLayout.Behavior { private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5ea142a..f50c8a1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,4 +1,4 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/attach_fragment.xml b/app/src/main/res/layout/attach_fragment.xml index 11e1c33..9aaca1b 100644 --- a/app/src/main/res/layout/attach_fragment.xml +++ b/app/src/main/res/layout/attach_fragment.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/app/src/main/res/layout/home_fragment.xml b/app/src/main/res/layout/home_fragment.xml index 7e3168e..783b2a4 100644 --- a/app/src/main/res/layout/home_fragment.xml +++ b/app/src/main/res/layout/home_fragment.xml @@ -10,7 +10,7 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> - @@ -40,9 +40,9 @@ android:layout_margin="8dp" android:text="@string/home_current_version" /> - + - - - + - + - @@ -90,7 +90,7 @@ android:layout_height="wrap_content" android:layout_margin="10dp" android:text="@android:string/unknownName" /> - + diff --git a/app/src/main/res/layout/mod_fragment.xml b/app/src/main/res/layout/mod_fragment.xml index 1ac9349..eeccc84 100644 --- a/app/src/main/res/layout/mod_fragment.xml +++ b/app/src/main/res/layout/mod_fragment.xml @@ -2,7 +2,7 @@ - diff --git a/app/src/main/res/layout/navigation_content.xml b/app/src/main/res/layout/navigation_content.xml index 89ca91b..54863d0 100644 --- a/app/src/main/res/layout/navigation_content.xml +++ b/app/src/main/res/layout/navigation_content.xml @@ -1,20 +1,20 @@ - - - - + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/visibility_fragment.xml b/app/src/main/res/layout/visibility_fragment.xml index 5aea0af..4127f6f 100644 --- a/app/src/main/res/layout/visibility_fragment.xml +++ b/app/src/main/res/layout/visibility_fragment.xml @@ -2,7 +2,7 @@ - diff --git a/build.gradle b/build.gradle index bcc63ea..1195513 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,13 @@ buildscript { repositories { google() jcenter() + maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'io.fabric.tools:gradle:1.31.0' + classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.google.gms:google-services:4.3.0' + classpath 'com.google.firebase:perf-plugin:1.3.0' } } @@ -14,6 +18,7 @@ allprojects { repositories { google() jcenter() + maven { url 'https://jitpack.io' } } } From d6610a15b82104a482597fbcf3795f094a67ada2 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Jul 2019 16:43:08 +0800 Subject: [PATCH 10/24] =?UTF-8?q?=E6=9B=B4=E6=96=B0CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 83fbf68..644ba15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: android +dist: trusty android: components: - tools @@ -17,6 +18,4 @@ deploy: file: app/build/outputs/apk/release/app-release.apk on: tags: true - repo: xausky/UnityModManager -after_success: -- curl -u xausky:$SYSKILLER_TOKEN -T app/build/outputs/apk/release/app-release.apk https://syskiller.org/remote.php/webdav/模组管理器/模组管理器-$TRAVIS_BRANCH.apk + repo: xausky/UnityModManager \ No newline at end of file From 107d64a9c1486d7583c4f789b2cb4e3f15a34ed9 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Jul 2019 17:14:22 +0800 Subject: [PATCH 11/24] =?UTF-8?q?=E6=8E=92=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 18b0728..e684d46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,8 +57,11 @@ dependencies { //https://github.com/hzy3774/AndroidP7zip implementation 'com.github.topjohnwu:libsu:2.0.2' //https://github.com/topjohnwu/libsu - implementation('com.daimajia.slider:library:1.1.5') - //https://github.com/daimajia/AndroidImageSlider + implementation('com.daimajia.slider:library:1.1.5') { + //https://github.com/daimajia/AndroidImageSlider + exclude group: 'com.android.support', module: 'support-v4' + exclude group: 'com.android.support', module: 'appcompat-v7' + } implementation 'com.github.medyo:android-about-page:1.2.5' //https://github.com/medyo/android-about-page implementation 'com.github.xausky:VirtualXposed:12332ab93b' From ef67f930b8d2ec4e8790651c1a4bda4b5d2d2a61 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Jul 2019 18:32:22 +0800 Subject: [PATCH 12/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B0=8F=E5=B0=8F=E7=9A=84=E6=A8=AA=E5=B9=85=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=EF=BC=8C=E6=81=B0=E9=A5=AD=E6=81=B0=E9=A5=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 +++----- app/src/main/AndroidManifest.xml | 3 +++ .../github/xausky/unitymodmanager/MainActivity.java | 3 +++ .../unitymodmanager/fragment/HomeFragment.java | 6 ++++++ app/src/main/res/layout/home_fragment.xml | 13 +++++++++++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e684d46..b773984 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,11 +57,8 @@ dependencies { //https://github.com/hzy3774/AndroidP7zip implementation 'com.github.topjohnwu:libsu:2.0.2' //https://github.com/topjohnwu/libsu - implementation('com.daimajia.slider:library:1.1.5') { - //https://github.com/daimajia/AndroidImageSlider - exclude group: 'com.android.support', module: 'support-v4' - exclude group: 'com.android.support', module: 'appcompat-v7' - } + implementation('com.daimajia.slider:library:1.1.5') + //https://github.com/daimajia/AndroidImageSlider implementation 'com.github.medyo:android-about-page:1.2.5' //https://github.com/medyo/android-about-page implementation 'com.github.xausky:VirtualXposed:12332ab93b' @@ -73,6 +70,7 @@ dependencies { implementation 'com.google.firebase:firebase-core:17.0.1' implementation 'com.google.firebase:firebase-perf:18.0.1' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + implementation 'com.google.android.gms:play-services-ads:18.1.1' } apply plugin: 'com.google.gms.google-services' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11c10d6..4768ac8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,9 @@ + diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java b/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java index 10ce55d..c40f8e2 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java @@ -11,6 +11,8 @@ import android.os.Build; import android.os.Bundle; import androidx.annotation.NonNull; + +import com.google.android.gms.ads.MobileAds; import com.google.android.material.navigation.NavigationView; import androidx.core.app.ActivityCompat; @@ -85,6 +87,7 @@ protected void onCreate(Bundle savedInstanceState) { if (!checkDangerousPermissions(this, REQUIRED_PERMISSIONS) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ this.requestPermissions(REQUIRED_PERMISSIONS, 0); } + MobileAds.initialize(this, "ca-app-pub-5364789594685674~8707472956"); setContentView(R.layout.activity_main); SharedPreferences preferences = this.getSharedPreferences("default", MODE_PRIVATE); BaseFragment.initialize(this); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java index ce2e145..b636a9c 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java @@ -28,6 +28,8 @@ import com.allenliu.versionchecklib.v2.AllenVersionChecker; import com.allenliu.versionchecklib.v2.builder.UIData; import com.allenliu.versionchecklib.v2.callback.RequestVersionListener; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdView; import com.lody.virtual.client.core.InstallStrategy; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.remote.InstallResult; @@ -76,6 +78,7 @@ public class HomeFragment extends BaseFragment implements View.OnClickListener, public boolean obbSupport; private ConfirmDialog confirmDialog; private View view; + private AdView mAdView; private TextView summary; private TextView clientState; private TextView currentVersion; @@ -139,6 +142,9 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, e.printStackTrace(); } currentVersion.setText(String.format(getText(R.string.home_current_version).toString(), currentVersionString)); + mAdView = view.findViewById(R.id.adView); + AdRequest adRequest = new AdRequest.Builder().build(); + mAdView.loadAd(adRequest); checkVersion(); } clientUpdate(); diff --git a/app/src/main/res/layout/home_fragment.xml b/app/src/main/res/layout/home_fragment.xml index 783b2a4..c371520 100644 --- a/app/src/main/res/layout/home_fragment.xml +++ b/app/src/main/res/layout/home_fragment.xml @@ -91,6 +91,19 @@ android:layout_margin="10dp" android:text="@android:string/unknownName" /> + + + + From aaf53a3098cd594d1967bb838a0a5a710420fb28 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Jul 2019 20:41:07 +0800 Subject: [PATCH 13/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 -- gradle.properties | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 gradle.properties diff --git a/.gitignore b/.gitignore index cb36f0d..a894657 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,9 @@ *.iml .gradle /local.properties -/gradle.properties /.idea/ .DS_Store build/ /captures .externalNativeBuild -/app/fabric.properties .vscode diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5465fec --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file From 151d60b0b9129226e2ef613217fbeef32744421c Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 27 Jul 2019 20:52:45 +0800 Subject: [PATCH 14/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=B0=E4=BB=93=E5=BA=93=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E4=BE=9BCI=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 安全全靠密码,SysKiller.org 你咋就倒了呢 --- .travis.yml | 1 - README.md | 2 +- app/build.gradle | 2 +- xausky.jks | Bin 0 -> 2231 bytes 4 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 xausky.jks diff --git a/.travis.yml b/.travis.yml index 644ba15..b94a4fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ android: install: - echo y | sdkmanager "ndk-bundle" script: - - curl -u xausky:$SYSKILLER_TOKEN https://syskiller.org/remote.php/webdav/xausky.jks -o ../xausky.jks - ./gradlew assembleRelease deploy: skip_cleanup: true diff --git a/README.md b/README.md index 9acc527..a1a7e50 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Unity模组管理器 -> ⼀个便捷的程序可以修改游戏内资源包括:Unity游戏资源,Wwise音频资源 +> 一个便捷的程序可以修改游戏内资源包括:Unity游戏资源,Wwise音频资源 [![Crowdin](https://d322cqt584bo4o.cloudfront.net/unitymodmanager/localized.svg)](https://crowdin.com/project/unitymodmanager) [![Build Status](https://travis-ci.org/xausky/UnityModManager.svg?branch=master)](https://travis-ci.org/xausky/UnityModManager) diff --git a/app/build.gradle b/app/build.gradle index b773984..f9e6e0c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,7 +25,7 @@ android { } signingConfigs { releaseConfig { - storeFile file("../../xausky.jks") + storeFile file("../xausky.jks") storePassword project.hasProperty("KEYSTORE_PASS") ? KEYSTORE_PASS : System.getenv("KEYSTORE_PASS") keyAlias project.hasProperty("ALIAS_NAME") ? ALIAS_NAME : System.getenv("ALIAS_NAME") keyPassword project.hasProperty("ALIAS_PASS") ? ALIAS_PASS : System.getenv("ALIAS_PASS") diff --git a/xausky.jks b/xausky.jks new file mode 100644 index 0000000000000000000000000000000000000000..b90492c5f0e996aee3c06a518daee443667f079b GIT binary patch literal 2231 zcmcgt`8(8)7M{<{7@4szVMzAuW(H&Z+KtM-?^(yb#UPY2ilG{1mxx3{DSOB|g+U~e zrBGxEh0C=KcfQ|y?{mL@!TsU<@V?J`p65L8InR5J*N@jhAP|^dz+c7agZK4}3MSC8 zXDgn18w6qip@`5U6e|oa3j?5l444A|7(h@WbQ$h9;oR+z zvDrwI^?1IODxl9q^`P~S90IV88MR(m5VLYdN<)zz zA3s^r%HJUTCVR*u`m_tNsq1$1c~{q@W5E|Qf<8V<6d&PsB8uMDTI@|@qNFunfJ9vWx={q4S99u?Ru(CLJ8AL!^S5Da;5qm!jh@mH^i#y?~Nz3E|BD@W+*9-(@`B% zUNuSUogor}#u|gqZ{lB8Y4VD`!d4NoXm@>Hw+xZD^eQsVqJE6xH$6nI8IU-B5yoFr zx}Rs3m^mIS^|cM@(0cBx3#<~|k?;1-DTDE1*!*6px2E_m%slS?*2j#`auz;56TEUC zYz+LYI2{R@8QS>u#N0JyEWx{=Y^wk%`4U=Zj6W8$WUh&Sp+gV^hX_s0cV^?_n0Gto zI#BiLouY?d%J{2#4tC9r{JyQU%UNIJOo2~vO$ZH=482YmS$fY=tZ^DSdl7O>RiEY* z?bAvBaJ3xxFgt(QK8>*IAZ~UI*XIihaCs&>nhZ(!g4FL-w|7RPZ3%e~lssSQi0_~d zZ{}9cnvp(sFK+SRW=QR6LUDQ013zWSz@AB5Td{TA3I)0I8X@@FzQ5fwVzId_mvk@| zv}sXOQhqrccKIT*qg@q;u{oy;#=dv&x}?9$#-4aGRM(rl-El?#fslai3rn6z55?DO ztZMIUgFZd2KK0C*eNMXz%l>Xl;qh{|UUV{OSNN{2%w!o%bay0LyGAcq3%A<&(+s+% zOMPXG%#gUb2uUSnb1nr#*-(-iy(P%d*pT_e zg`zC1_^`cx+z+3WB89X-NA9j>qdnd8$B*~6>nN|9?8HWdze}eo&JuWCPvI|K+MMHi zhR^x1Y%ehNnsYKMnMU?N#6(4P6(%Ur><4bi^Si`T@RBLFb0*?Oqz*|Q3d0%J5FbRl52DM_evskO$+u%q52i@&~2;IfJN58uZ^gRl>k>$*Oq{( zvXBS&^tK2wl&bJp^v&kCK@Ni+s*B@sZMIIEeQ?P!&qmFGG?>Lko*vC8OYMDB%z3^x z_V)fuG>%83cgyl>h>~6ALuy{)xLpxr^sab!vw&wIUAs8nDaqh~`S8NVy`Tp_-+~M_^z^bp^{^$5RcsgmZNVUyQ@y@{*awwfm9N;qcaMHq_1pA5bgQsOP;eZRr5FZwIVEGy?% zOOGnQzz>t-2@xQ$G&jj{k85gs?IfG*G>DMfz-^DT9NRNI_$wG092Hbh>L3s#3`K+l zp@?9cVh9)jgQ0r7KNC+e{Ey*6ar~))aKUZ-1DrfV{pgJ- zAzl`=8VZBKpfJkH7!_w;7G)(A295m>{J+gX1VsOC0sTKfhyWY?aR6{I5dc6$)E);^ z=P6oMtvl-XnlHEGL;fqBiMrD1kh(szj*Y^5UxttJk7_s-izl$F-~FiJa7zmb8sY}w zj38!(aeQ3tgu^5Tw;IuVd19N}JLQd&CH1vS>nuneV%3@3lrVOu`wh1a%>3bb{GD$i z2YOFOg`*KPjkzgW5oekTNRh)OIIp6hIAjF_?qmdO{1!ta*)Ssr3IKD7giQq&M@=qv2KZC-0JO_#7Eac^!Hdnh)Ci zR;$ z4V2ACLz4-{SFt6rxARB3MH?bzE&4A!beZ|%yqRmihj=uu%eB=2U(a*cwsI?gIvY!? zI*cIu1UX+AW=Zct>j9A&t7-CTR@KZ#a-laIE@8gLn<~t;;I3DskM!_4HAqmuDXFX{ F{|hiR$cq2~ literal 0 HcmV?d00001 From 89a142ddf4ed3b5631fbd8bb3ed87da18ad6ca8b Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 29 Dec 2019 20:05:42 +0800 Subject: [PATCH 15/24] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20Hook=20=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E8=B5=84=E6=BA=90=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 ++----- app/google-services.json | 29 +++++++++++++++++++ app/src/main/AndroidManifest.xml | 1 + .../xausky/unitymodmanager/MainActivity.java | 2 +- .../fragment/HomeFragment.java | 5 ++-- .../unitymodmanager/fragment/ModFragment.java | 6 ++-- .../fragment/SettingFragment.java | 2 +- app/src/main/res/values-ja-rJP/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-ru-rRU/strings.xml | 2 ++ app/src/main/res/values-zh-rCN/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 13 files changed, 53 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f9e6e0c..6fd0d7c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,18 +2,14 @@ apply plugin: 'com.android.application' apply plugin: 'io.fabric' apply plugin: 'com.google.firebase.firebase-perf' -repositories { - -} - android { compileSdkVersion 28 defaultConfig { - applicationId "io.github.xausky.unitymodmanager" + applicationId "cn.xausky.umm" minSdkVersion 21 targetSdkVersion 23 - versionCode 330 - versionName "3.3.0" + versionCode 400 + versionName "4.0.0" ndk{ abiFilters "armeabi-v7a","x86" } diff --git a/app/google-services.json b/app/google-services.json index a56eedd..2e4b21f 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -6,6 +6,35 @@ "storage_bucket": "unity-mod-manager.appspot.com" }, "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:999756837706:android:d0c619615d8f02fe4587b3", + "android_client_info": { + "package_name": "cn.xausky.umm" + } + }, + "oauth_client": [ + { + "client_id": "999756837706-t3gfo4q8adrfknhqm52gmbu7jbnneb3h.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDL7ySG-vDz4_iXaDcRC6SaeJk6rdREucc" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "999756837706-t3gfo4q8adrfknhqm52gmbu7jbnneb3h.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, { "client_info": { "mobilesdk_app_id": "1:999756837706:android:21dd3da8337e5843", diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4768ac8..049d436 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java b/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java index c40f8e2..cbd5aae 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/MainActivity.java @@ -177,7 +177,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } public void launch(){ - if(homeFragment.apkModifyModel != HomeFragment.APK_MODIFY_MODEL_NONE && (homeFragment.apkPath == null || homeFragment.baseApkPath == null || !new File(homeFragment.baseApkPath).exists())){ + if(homeFragment.apkModifyModel != HomeFragment.APK_MODIFY_MODEL_NONE && homeFragment.apkModifyModel != HomeFragment.APK_MODIFY_MODEL_HOOK && (homeFragment.apkPath == null || homeFragment.baseApkPath == null || !new File(homeFragment.baseApkPath).exists())){ Toast.makeText(this, R.string.install_source_not_found, Toast.LENGTH_LONG).show(); } else { if(homeFragment.apkModifyModel == HomeFragment.APK_MODIFY_MODEL_NONE && homeFragment.obbSupport){ diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java index b636a9c..a6b23c1 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/HomeFragment.java @@ -66,6 +66,7 @@ public class HomeFragment extends BaseFragment implements View.OnClickListener, public static final int APK_MODIFY_MODEL_NONE = 0; public static final int APK_MODIFY_MODEL_VIRTUAL = 1; public static final int APK_MODIFY_MODEL_ROOT = 2; + public static final int APK_MODIFY_MODEL_HOOK = 3; public String packageName; public String apkPath; public String baseApkPath; @@ -314,7 +315,7 @@ public void ImportMapFile() { private void clientUpdate() { String versionName = null; int versionCode = 0; - if (apkModifyModel == APK_MODIFY_MODEL_ROOT || apkModifyModel == APK_MODIFY_MODEL_NONE) { + if (apkModifyModel == APK_MODIFY_MODEL_ROOT || apkModifyModel == APK_MODIFY_MODEL_NONE || apkModifyModel == APK_MODIFY_MODEL_HOOK) { try { versionName = context.getPackageManager().getPackageInfo(packageName, 0).versionName; versionCode = context.getPackageManager().getPackageInfo(packageName, 0).versionCode; @@ -414,7 +415,7 @@ public void run() { final String resultString; String result = getString(R.string.install_failed); int versionCode = 0; - if (apkModifyModel == APK_MODIFY_MODEL_ROOT || apkModifyModel == APK_MODIFY_MODEL_NONE) { + if (apkModifyModel == APK_MODIFY_MODEL_ROOT || apkModifyModel == APK_MODIFY_MODEL_NONE || apkModifyModel == APK_MODIFY_MODEL_HOOK) { try { String basePath = HomeFragment.this.context.getFilesDir().getAbsolutePath() + "/base.apk"; if (apkModifyModel == APK_MODIFY_MODEL_ROOT) { diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java index 73118ef..13356d4 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/ModFragment.java @@ -241,7 +241,7 @@ public void run() { }); } - public int patch(String apkPath, String baseApkPath, String persistentPath, String obbPath, String baseObbPath, String backupPath, int apkModifyModel, boolean persistentSupport, boolean obbSupport){ + public int patch(String apkPath, String baseApkPath, String persistentPath, String obbPath, String baseObbPath, String backupPath, int apkModifyModel, boolean persistentSupport, boolean obbSupport){ if(apkModifyModel == HomeFragment.APK_MODIFY_MODEL_ROOT){ if(!Shell.rootAccess()){ return ModUtils.RESULT_STATE_ROOT_ERROR; @@ -252,7 +252,7 @@ public int patch(String apkPath, String baseApkPath, String persistentPath, Stri try { Log.d(MainApplication.LOG_TAG, "patch: apkPath=" + apkPath + ", baseApkPath=" + baseApkPath + ", apkModifyModel=" + apkModifyModel); List mods = adapter.getMods(); - File fusionFile = new File(getBase().getCacheDir().getAbsolutePath() + "/fusion"); + File fusionFile = new File(getBase().getFilesDir().getAbsolutePath() + "/fusion"); try { FileUtils.deleteDirectory(fusionFile); } catch (IOException e) { @@ -300,7 +300,7 @@ public int patch(String apkPath, String baseApkPath, String persistentPath, Stri e.printStackTrace(); } } - if(apkModifyModel != HomeFragment.APK_MODIFY_MODEL_NONE){ + if(apkModifyModel == HomeFragment.APK_MODIFY_MODEL_VIRTUAL || apkModifyModel == HomeFragment.APK_MODIFY_MODEL_ROOT){ int result = NativeUtils.PatchApk(baseApkPath, apkPath, fusionFile.getAbsolutePath()); if(result != NativeUtils.RESULT_STATE_OK){ Log.d(MainApplication.LOG_TAG, "Patch APK File Failed: " + result + ",apkPath:" + apkPath + ",baseApkPath:" + baseApkPath); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index 65df09e..546091a 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -58,7 +58,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if(preference.getKey().equals("setting_export_apk")){ HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); - if(homeFragment.apkModifyModel == HomeFragment.APK_MODIFY_MODEL_NONE){ + if(homeFragment.apkModifyModel == HomeFragment.APK_MODIFY_MODEL_NONE || homeFragment.apkModifyModel == HomeFragment.APK_MODIFY_MODEL_HOOK){ Toast.makeText(this.getActivity(), R.string.none_modify_export, Toast.LENGTH_LONG).show(); return super.onPreferenceTreeClick(preferenceScreen, preference); } diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 471ff41..fad6f7a 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -96,11 +96,13 @@ No Modify VirtualApp Model Root Privilege Model (Caution) + Hook Model 0 1 2 + 3 Android OBB resource file patch support Android OBB resource file patch support, such as \"Honkai Impact 3\" JP service, SEA service, global service. diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 0c421c1..3ce05f0 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -95,11 +95,13 @@ 변경 없음 가상어플 방식 루트 권한 방식 (주의) + Hook Model 0 1 2 + 3 안드로이드 OBB 리소스 파일 패치 지원 안드로이드 OBB 리소스 파일 패치 지원 기능. 붕괴3 일본서버, 동남아시아 서버, 혹은 글로벌 서버를 위한 기능입니다. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 4b52bbe..ab0db95 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -95,11 +95,13 @@ Без модификации VirtualApp Root права (осторожно) + Hook Model 0 1 2 + 3 Поддержка патча OBB файла Поддержка патча OBB файла для Honkai Impact 3 JP SEA и global серверов. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 18b639c..01f8f60 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -95,11 +95,13 @@ 不修改 虚拟环境模式 Root权限模式(慎用) + Hook模式 0 1 2 + 3 安卓OBB资源文件补丁支持 安卓OBB资源文件补丁支持,比如《崩坏3》的日服,东南亚服,全球服。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6638a57..2dd2883 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -95,11 +95,13 @@ 不修改 虛擬環境模式 Root權限模式(慎用) + Hook模式 0 1 2 + 3 安卓OBB資源文件補丁支持 安卓OBB資源文件補丁支持,比如《崩壞3》的日服,東南亞服,全球服。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f5203f..8bd53a5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -96,11 +96,13 @@ No Modification VirtualApp Model Root Privilege Mode (Proceed with caution) + Hook Model 0 1 2 + 3 Android OBB patch resource file support ONLY toggle on if your app supports OBB file patching, such as \"Honkai Impact 3\" JP server, SEA server and global server. From 6be3a12b0f55227119c97127aef8287dead5b988 Mon Sep 17 00:00:00 2001 From: xausky Date: Mon, 6 Jan 2020 21:34:25 +0800 Subject: [PATCH 16/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/SettingFragment.java | 34 +++++++++++++++++++ app/src/main/res/values-ja-rJP/strings.xml | 4 +++ app/src/main/res/values-ko-rKR/strings.xml | 4 +++ app/src/main/res/values-ru-rRU/strings.xml | 4 +++ app/src/main/res/values-zh-rCN/strings.xml | 4 +++ app/src/main/res/values-zh-rTW/strings.xml | 4 +++ app/src/main/res/values/strings.xml | 4 +++ app/src/main/res/xml/preferences.xml | 9 ++++- 8 files changed, 66 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index 546091a..2384060 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -1,6 +1,9 @@ package io.github.xausky.unitymodmanager.fragment; import android.app.ProgressDialog; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; @@ -9,6 +12,8 @@ import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; +import android.util.Base64; +import android.util.Log; import androidx.annotation.Nullable; import android.view.LayoutInflater; @@ -20,6 +25,7 @@ import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.stub.VASettings; +import com.topjohnwu.superuser.Shell; import org.apache.commons.io.FileUtils; import java.io.File; @@ -27,6 +33,7 @@ import io.github.xausky.unitymodmanager.R; import io.github.xausky.unitymodmanager.utils.ModUtils; +import org.apache.commons.io.IOUtils; import static io.github.xausky.unitymodmanager.utils.ModUtils.RESULT_STATE_INTERNAL_ERROR; @@ -78,6 +85,33 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen } else { homeFragment.crateShortcut(VirtualCore.get().getInstalledAppInfo(homeFragment.packageName,0)); } + } else if(preference.getKey().equals("copy_login_info")){ + try { + HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); + if (homeFragment.packageName.startsWith("com.kuro")){ + String loginFile = "/data/data/" + homeFragment.packageName + "/database/zz_sdk_db"; + Shell.su("setenforce 0", "chmod 666 " + loginFile).exec(); + ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(FileUtils.readFileToByteArray(new File(loginFile)), Base64.DEFAULT)); + cm.setPrimaryClip(mClipData); + Shell.su("chmod 644 " + loginFile, "setenforce 0").exec(); + } + } catch (Exception e){ + Log.w("UMM","Copy Login Failed.", e); + } + } else if(preference.getKey().equals("import_login_info")){ + try{ + HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); + if (homeFragment.packageName.startsWith("com.kuro")){ + String loginFile = this.getActivity().getFilesDir().getAbsolutePath() + "/zsxmm.login"; + ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); + if(cm.getPrimaryClip() != null){ + FileUtils.writeByteArrayToFile(new File(loginFile), Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); + } + } + } catch (Exception e){ + Log.w("UMM", "Import Login Failed.",e); + } } return super.onPreferenceTreeClick(preferenceScreen, preference); } diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index fad6f7a..de44a47 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -118,4 +118,8 @@ Feature not available in non-virtual mode OnlineMods Is the legacy mod of the original client detected deleted? + Copy Login Information + Copy login information to clipboard to import other devices. Root permission is required. + Import Login Information + Import the login information from the clipboard into the device. diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 3ce05f0..da424ca 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -117,4 +117,8 @@ 가상 모드에서 사용할 수 없는 기능 OnlineMods 원래 클라이언트 감지의 레거시 모드 삭제? + Copy Login Information + Copy login information to clipboard to import other devices. Root permission is required. + Import Login Information + Import the login information from the clipboard into the device. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index ab0db95..75b7a71 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -117,4 +117,8 @@ Функция не доступна в режиме non виртуального Моды на сервере (китайском) Is the legacy mod of the original client detected deleted? + Copy Login Information + Copy login information to clipboard to import other devices. Root permission is required. + Import Login Information + Import the login information from the clipboard into the device. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 01f8f60..9806336 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -117,4 +117,8 @@ 非虚拟模式下功能不可用 在线模组 检测到的原客户端的旧模组是否删除? + 复制登录信息 + 复制登录信息到剪切板以便于导入其他设备,需要Root权限。 + 导入登录信息 + 将剪切板里的登录信息导入本设备。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2dd2883..4116885 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -117,4 +117,8 @@ 非虛擬模式下功能不可用 在線模組 檢測到的原客戶端的舊模組是否刪除? + 复制登录信息 + 复制登录信息到剪切板以便于导入其他设备,需要Root权限。 + 导入登录信息 + 将剪切板里的登录信息导入本设备。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8bd53a5..de2e6be 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -118,4 +118,8 @@ This feature is not available for non-virtual mode. Online Modules Does the legacy module has been deleted in original cilent? + Copy Login Information + Copy login information to clipboard to import other devices. Root permission is required. + Import Login Information + Import the login information from the clipboard into the device. diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 07bc59f..65c46fa 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -30,5 +30,12 @@ android:key="create_shortcut" android:title="@string/create_shortcut_title" android:summary="@string/create_shortcut_summary" /> - + + \ No newline at end of file From 99e0e2005a017a765f65094db324adcab243d91a Mon Sep 17 00:00:00 2001 From: xausky Date: Mon, 6 Jan 2020 22:15:54 +0800 Subject: [PATCH 17/24] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/SettingFragment.java | 24 +++++-- .../unitymodmanager/utils/CompressUtil.java | 69 +++++++++++++++++++ app/src/main/res/values-ja-rJP/strings.xml | 7 ++ app/src/main/res/values-ko-rKR/strings.xml | 7 ++ app/src/main/res/values-ru-rRU/strings.xml | 18 ++--- app/src/main/res/values-zh-rCN/strings.xml | 7 ++ app/src/main/res/values-zh-rTW/strings.xml | 7 ++ app/src/main/res/values/strings.xml | 7 ++ 8 files changed, 132 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index 2384060..b3ecc03 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -30,8 +30,10 @@ import java.io.File; import java.io.IOException; +import java.util.zip.GZIPInputStream; import io.github.xausky.unitymodmanager.R; +import io.github.xausky.unitymodmanager.utils.CompressUtil; import io.github.xausky.unitymodmanager.utils.ModUtils; import org.apache.commons.io.IOUtils; @@ -88,29 +90,39 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen } else if(preference.getKey().equals("copy_login_info")){ try { HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); - if (homeFragment.packageName.startsWith("com.kuro")){ - String loginFile = "/data/data/" + homeFragment.packageName + "/database/zz_sdk_db"; + if (homeFragment.packageName.startsWith("com.kurogame")){ + String loginFile = "/data/data/" + homeFragment.packageName + "/databases/zz_sdk_db"; Shell.su("setenforce 0", "chmod 666 " + loginFile).exec(); ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(FileUtils.readFileToByteArray(new File(loginFile)), Base64.DEFAULT)); + ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(CompressUtil.compress(FileUtils.readFileToByteArray(new File(loginFile))), Base64.DEFAULT)); cm.setPrimaryClip(mClipData); Shell.su("chmod 644 " + loginFile, "setenforce 0").exec(); + Toast.makeText(this.getActivity(), R.string.copy_login_success, Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(this.getActivity(), R.string.copy_login_failed_unsupported, Toast.LENGTH_LONG).show(); } } catch (Exception e){ Log.w("UMM","Copy Login Failed.", e); + Toast.makeText(this.getActivity(), R.string.copy_login_failed, Toast.LENGTH_LONG).show(); } } else if(preference.getKey().equals("import_login_info")){ try{ HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); - if (homeFragment.packageName.startsWith("com.kuro")){ - String loginFile = this.getActivity().getFilesDir().getAbsolutePath() + "/zsxmm.login"; + if (homeFragment.packageName.startsWith("com.kurogame")){ + String loginFile = this.getActivity().getFilesDir().getAbsolutePath() + "/com.kurogame.login"; ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); if(cm.getPrimaryClip() != null){ - FileUtils.writeByteArrayToFile(new File(loginFile), Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); + FileUtils.writeByteArrayToFile(new File(loginFile), CompressUtil.decompress(Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT))); + } else { + Toast.makeText(this.getActivity(), R.string.import_login_failed_empty, Toast.LENGTH_LONG).show(); } + Toast.makeText(this.getActivity(), R.string.import_login_success, Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(this.getActivity(), R.string.import_login_failed_unsupported, Toast.LENGTH_LONG).show(); } } catch (Exception e){ Log.w("UMM", "Import Login Failed.",e); + Toast.makeText(this.getActivity(), R.string.import_login_failed, Toast.LENGTH_LONG).show(); } } return super.onPreferenceTreeClick(preferenceScreen, preference); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java new file mode 100644 index 0000000..ea35cd8 --- /dev/null +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java @@ -0,0 +1,69 @@ +package io.github.xausky.unitymodmanager.utils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.zip.Deflater; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.Inflater; + +public class CompressUtil { + public static byte[] compress(byte[] data) { + byte[] output = new byte[0]; + Deflater compresser = new Deflater(); + compresser.reset(); + compresser.setInput(data); + compresser.finish(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); + try { + byte[] buf = new byte[1024]; + while (!compresser.finished()) { + int i = compresser.deflate(buf); + bos.write(buf, 0, i); + } + output = bos.toByteArray(); + } catch (Exception e) { + output = data; + e.printStackTrace(); + } finally { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + compresser.end(); + return output; + } + + //解压缩 字节数组 + public static byte[] decompress(byte[] data) { + byte[] output = new byte[0]; + + Inflater decompresser = new Inflater(); + decompresser.reset(); + decompresser.setInput(data); + + ByteArrayOutputStream o = new ByteArrayOutputStream(data.length); + try { + byte[] buf = new byte[1024]; + while (!decompresser.finished()) { + int i = decompresser.inflate(buf); + o.write(buf, 0, i); + } + output = o.toByteArray(); + } catch (Exception e) { + output = data; + e.printStackTrace(); + } finally { + try { + o.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + decompresser.end(); + return output; + } +} diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index de44a47..f0cc888 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -122,4 +122,11 @@ Copy login information to clipboard to import other devices. Root permission is required. Import Login Information Import the login information from the clipboard into the device. + Copying login information succeeded! + Copying login information failed, unsupported game! + Failed to copy login information, make sure Root permissions and game are logged in! + Failed to import login information, it seems that there is no login information in Clipboard! + Importing login information succeeded! + Failed to import login information, unsupported games! + Failed to import login information! diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index da424ca..6997555 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -121,4 +121,11 @@ Copy login information to clipboard to import other devices. Root permission is required. Import Login Information Import the login information from the clipboard into the device. + Copying login information succeeded! + Copying login information failed, unsupported game! + Failed to copy login information, make sure Root permissions and game are logged in! + Failed to import login information, it seems that there is no login information in Clipboard! + Importing login information succeeded! + Failed to import login information, unsupported games! + Failed to import login information! diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 75b7a71..6b7b684 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -1,5 +1,4 @@ - - + Менеджер модов Unity Запустить игру @@ -95,13 +94,13 @@ Без модификации VirtualApp Root права (осторожно) - Hook Model + Hook Model 0 1 2 - 3 + 3 Поддержка патча OBB файла Поддержка патча OBB файла для Honkai Impact 3 JP SEA и global серверов. @@ -117,8 +116,11 @@ Функция не доступна в режиме non виртуального Моды на сервере (китайском) Is the legacy mod of the original client detected deleted? - Copy Login Information - Copy login information to clipboard to import other devices. Root permission is required. - Import Login Information - Import the login information from the clipboard into the device. + Copying login information succeeded! + Copying login information failed, unsupported game! + Failed to copy login information, make sure Root permissions and game are logged in! + Failed to import login information, it seems that there is no login information in Clipboard! + Importing login information succeeded! + Failed to import login information, unsupported games! + Failed to import login information! diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9806336..a0333a0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -121,4 +121,11 @@ 复制登录信息到剪切板以便于导入其他设备,需要Root权限。 导入登录信息 将剪切板里的登录信息导入本设备。 + 复制登录信息成功! + 复制登录信息失败,不支持的游戏! + 复制登录信息失败,确保Root权限和游戏已经登录! + 导入登录信息失败,好像剪切板没有登录信息哦! + 导入登录信息成功! + 导入登录信息失败,不支持的游戏! + 导入登录信息失败! diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4116885..6c41ccd 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -121,4 +121,11 @@ 复制登录信息到剪切板以便于导入其他设备,需要Root权限。 导入登录信息 将剪切板里的登录信息导入本设备。 + 复制登录信息成功! + 复制登录信息失败,不支持的游戏! + 复制登录信息失败,确保Root权限和游戏已经登录! + 导入登录信息失败,好像剪切板没有登录信息哦! + 导入登录信息成功! + 导入登录信息失败,不支持的游戏! + 导入登录信息失败! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de2e6be..14e1c2a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -122,4 +122,11 @@ Copy login information to clipboard to import other devices. Root permission is required. Import Login Information Import the login information from the clipboard into the device. + Copying login information succeeded! + Copying login information failed, unsupported game! + Failed to copy login information, make sure Root permissions and game are logged in! + Failed to import login information, it seems that there is no login information in Clipboard! + Importing login information succeeded! + Failed to import login information, unsupported games! + Failed to import login information! From 2b3889df7b55fa9af7142f48f6c0ad802ea87d06 Mon Sep 17 00:00:00 2001 From: xausky Date: Tue, 7 Jan 2020 21:39:35 +0800 Subject: [PATCH 18/24] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSQLite=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=85=BC=E5=AE=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 13 ++++--- .../fragment/SettingFragment.java | 10 ++++-- .../unitymodmanager/utils/CompressUtil.java | 36 +++++++++++++++++++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6fd0d7c..e86e2dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,17 +14,20 @@ android { abiFilters "armeabi-v7a","x86" } } + + + externalNativeBuild { ndkBuild { path file("src/main/cpp/Android.mk") } - } + }pnp signingConfigs { releaseConfig { storeFile file("../xausky.jks") - storePassword project.hasProperty("KEYSTORE_PASS") ? KEYSTORE_PASS : System.getenv("KEYSTORE_PASS") - keyAlias project.hasProperty("ALIAS_NAME") ? ALIAS_NAME : System.getenv("ALIAS_NAME") - keyPassword project.hasProperty("ALIAS_PASS") ? ALIAS_PASS : System.getenv("ALIAS_PASS") + storePassword 'a7523003' + keyAlias = 'default' + keyPassword 'a7523003' } } buildTypes { @@ -32,7 +35,9 @@ android { signingConfig signingConfigs.releaseConfig } debug { + debuggable true jniDebuggable true + signingConfig signingConfigs.releaseConfig } } lintOptions { diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index b3ecc03..dbd2b29 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -5,6 +5,8 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.SharedPreferences; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; @@ -94,7 +96,7 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen String loginFile = "/data/data/" + homeFragment.packageName + "/databases/zz_sdk_db"; Shell.su("setenforce 0", "chmod 666 " + loginFile).exec(); ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(CompressUtil.compress(FileUtils.readFileToByteArray(new File(loginFile))), Base64.DEFAULT)); + ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(CompressUtil.backupKuroGame(loginFile), Base64.DEFAULT)); cm.setPrimaryClip(mClipData); Shell.su("chmod 644 " + loginFile, "setenforce 0").exec(); Toast.makeText(this.getActivity(), R.string.copy_login_success, Toast.LENGTH_LONG).show(); @@ -109,13 +111,15 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen try{ HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); if (homeFragment.packageName.startsWith("com.kurogame")){ - String loginFile = this.getActivity().getFilesDir().getAbsolutePath() + "/com.kurogame.login"; + String loginFile = "/data/data/" + homeFragment.packageName + "/databases/zz_sdk_db"; + Shell.su("setenforce 0", "chmod 666 " + loginFile).exec(); ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); if(cm.getPrimaryClip() != null){ - FileUtils.writeByteArrayToFile(new File(loginFile), CompressUtil.decompress(Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT))); + CompressUtil.restoreKuroGame(loginFile, Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); } else { Toast.makeText(this.getActivity(), R.string.import_login_failed_empty, Toast.LENGTH_LONG).show(); } + Shell.su("chmod 644 " + loginFile, "setenforce 0").exec(); Toast.makeText(this.getActivity(), R.string.import_login_success, Toast.LENGTH_LONG).show(); } else { Toast.makeText(this.getActivity(), R.string.import_login_failed_unsupported, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java index ea35cd8..58ed13d 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java @@ -1,8 +1,16 @@ package io.github.xausky.unitymodmanager.utils; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.OutputStream; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.Inflater; @@ -66,4 +74,32 @@ public static byte[] decompress(byte[] data) { decompresser.end(); return output; } + + public static byte[] backupKuroGame(String file) { + StringBuilder builder = new StringBuilder(); + try (SQLiteDatabase db = SQLiteDatabase.openDatabase(file, null, SQLiteDatabase.OPEN_READONLY); + Cursor cursor = db.rawQuery("SELECT user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type FROM sdkuser;", null)) { + while (cursor.moveToNext()) { + for (int i = 0; i < cursor.getColumnCount(); i++) { + builder.append(cursor.getString(i)); + if(i + 1 < cursor.getColumnCount()){ + builder.append(','); + } + } + while (!cursor.isLast()){ + builder.append('\n'); + } + } + } + return builder.toString().getBytes(); + } + + public static void restoreKuroGame(String file, byte[] data) { + String accounts = new String(data); + try (SQLiteDatabase db = SQLiteDatabase.openDatabase(file, null, SQLiteDatabase.OPEN_READWRITE)) { + for (String account : accounts.split("\n")){ + db.execSQL("INSERT INTO sdkuser(user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", account.split(",")); + } + } + } } From d5f457a134d117f0820eeb0e65887bd3258d44ae Mon Sep 17 00:00:00 2001 From: xausky Date: Tue, 7 Jan 2020 23:28:44 +0800 Subject: [PATCH 19/24] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/build.gradle | 5 +- .../fragment/SettingFragment.java | 12 +-- .../unitymodmanager/utils/CompressUtil.java | 87 +++++++++++++++---- 4 files changed, 75 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index a894657..4d20eac 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ build/ /captures .externalNativeBuild .vscode +build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index e86e2dd..152a8a6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,14 +14,11 @@ android { abiFilters "armeabi-v7a","x86" } } - - - externalNativeBuild { ndkBuild { path file("src/main/cpp/Android.mk") } - }pnp + } signingConfigs { releaseConfig { storeFile file("../xausky.jks") diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index dbd2b29..9a7da84 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -93,12 +93,9 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen try { HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); if (homeFragment.packageName.startsWith("com.kurogame")){ - String loginFile = "/data/data/" + homeFragment.packageName + "/databases/zz_sdk_db"; - Shell.su("setenforce 0", "chmod 666 " + loginFile).exec(); ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(CompressUtil.backupKuroGame(loginFile), Base64.DEFAULT)); + ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(CompressUtil.backupKuroGame(homeFragment.packageName), Base64.DEFAULT)); cm.setPrimaryClip(mClipData); - Shell.su("chmod 644 " + loginFile, "setenforce 0").exec(); Toast.makeText(this.getActivity(), R.string.copy_login_success, Toast.LENGTH_LONG).show(); } else { Toast.makeText(this.getActivity(), R.string.copy_login_failed_unsupported, Toast.LENGTH_LONG).show(); @@ -111,16 +108,13 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen try{ HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); if (homeFragment.packageName.startsWith("com.kurogame")){ - String loginFile = "/data/data/" + homeFragment.packageName + "/databases/zz_sdk_db"; - Shell.su("setenforce 0", "chmod 666 " + loginFile).exec(); ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); if(cm.getPrimaryClip() != null){ - CompressUtil.restoreKuroGame(loginFile, Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); + CompressUtil.restoreKuroGame(homeFragment.packageName, Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); + Toast.makeText(this.getActivity(), R.string.import_login_success, Toast.LENGTH_LONG).show(); } else { Toast.makeText(this.getActivity(), R.string.import_login_failed_empty, Toast.LENGTH_LONG).show(); } - Shell.su("chmod 644 " + loginFile, "setenforce 0").exec(); - Toast.makeText(this.getActivity(), R.string.import_login_success, Toast.LENGTH_LONG).show(); } else { Toast.makeText(this.getActivity(), R.string.import_login_failed_unsupported, Toast.LENGTH_LONG).show(); } diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java index 58ed13d..8ed15d9 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java @@ -3,6 +3,13 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import com.topjohnwu.superuser.Shell; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.json.JSONException; +import org.json.JSONObject; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; @@ -11,6 +18,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.StringJoiner; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.Inflater; @@ -75,31 +83,76 @@ public static byte[] decompress(byte[] data) { return output; } - public static byte[] backupKuroGame(String file) { - StringBuilder builder = new StringBuilder(); - try (SQLiteDatabase db = SQLiteDatabase.openDatabase(file, null, SQLiteDatabase.OPEN_READONLY); - Cursor cursor = db.rawQuery("SELECT user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type FROM sdkuser;", null)) { - while (cursor.moveToNext()) { - for (int i = 0; i < cursor.getColumnCount(); i++) { - builder.append(cursor.getString(i)); - if(i + 1 < cursor.getColumnCount()){ - builder.append(','); + public static byte[] backupKuroGame(String packageName) { + String accountsDatabaseFile = "/data/data/" + packageName + "/databases/zz_sdk_db"; + String deviceIdFile = "/data/data/" + packageName + "/shared_prefs/devicesyn.xml"; + try { + unprotectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + JSONObject root = new JSONObject(); + StringBuilder builder = new StringBuilder(); + try (SQLiteDatabase db = SQLiteDatabase.openDatabase(accountsDatabaseFile, null, SQLiteDatabase.OPEN_READONLY); + Cursor cursor = db.rawQuery("SELECT user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type FROM sdkuser;", null)) { + while (cursor.moveToNext()) { + for (int i = 0; i < cursor.getColumnCount(); i++) { + builder.append(cursor.getString(i)); + if (i + 1 < cursor.getColumnCount()) { + builder.append(','); + } + } + if (!cursor.isLast()) { + builder.append('\n'); } } - while (!cursor.isLast()){ - builder.append('\n'); + } + root.put("accounts", builder.toString()); + root.put("device", FileUtils.readFileToString(new File(deviceIdFile))); + return root.toString().getBytes(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + protectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + } + } + + public static void restoreKuroGame(String packageName, byte[] data) { + String accountsDatabaseFile = "/data/data/" + packageName + "/databases/zz_sdk_db"; + String deviceIdFile = "/data/data/" + packageName + "/shared_prefs/devicesyn.xml"; + try { + unprotectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + JSONObject root = new JSONObject(new String(data)); + String accounts = root.getString("accounts"); + try (SQLiteDatabase db = SQLiteDatabase.openDatabase(accountsDatabaseFile, null, SQLiteDatabase.OPEN_READWRITE)) { + for (String account : accounts.split("\n")){ + db.execSQL("INSERT INTO sdkuser(user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", account.split(",")); } } + FileUtils.writeStringToFile(new File(deviceIdFile), root.getString("device")); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + protectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + } + } + + public static void unprotectFilesWithRoot(String ...files){ + StringBuilder builder = new StringBuilder(); + for (int i = 1; i <= files.length; i++){ + builder.append(files[i - 1]); + if (i < files.length){ + builder.append(" "); + } } - return builder.toString().getBytes(); + Shell.su("setenforce 0", "chmod 666 " + builder.toString()).exec(); } - public static void restoreKuroGame(String file, byte[] data) { - String accounts = new String(data); - try (SQLiteDatabase db = SQLiteDatabase.openDatabase(file, null, SQLiteDatabase.OPEN_READWRITE)) { - for (String account : accounts.split("\n")){ - db.execSQL("INSERT INTO sdkuser(user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", account.split(",")); + public static void protectFilesWithRoot(String ...files){ + StringBuilder builder = new StringBuilder(); + for (int i = 1; i <= files.length; i++){ + builder.append(files[i - 1]); + if (i < files.length){ + builder.append(" "); } } + Shell.su("setenforce 1", "chmod 644 " + builder.toString()).exec(); } } From b68c6dbca30cead97fc370c4cfc9607d309d2cc2 Mon Sep 17 00:00:00 2001 From: xausky Date: Sat, 11 Jan 2020 16:07:53 +0800 Subject: [PATCH 20/24] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/SettingFragment.java | 14 ++- .../{CompressUtil.java => BackupUtil.java} | 100 ++++-------------- 2 files changed, 25 insertions(+), 89 deletions(-) rename app/src/main/java/io/github/xausky/unitymodmanager/utils/{CompressUtil.java => BackupUtil.java} (50%) diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java index 9a7da84..a457f6b 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/fragment/SettingFragment.java @@ -5,8 +5,6 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.SharedPreferences; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; @@ -27,18 +25,16 @@ import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.stub.VASettings; -import com.topjohnwu.superuser.Shell; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; -import java.util.zip.GZIPInputStream; import io.github.xausky.unitymodmanager.R; -import io.github.xausky.unitymodmanager.utils.CompressUtil; +import io.github.xausky.unitymodmanager.utils.BackupUtil; import io.github.xausky.unitymodmanager.utils.ModUtils; -import org.apache.commons.io.IOUtils; +import static android.content.Context.CONTEXT_IGNORE_SECURITY; import static io.github.xausky.unitymodmanager.utils.ModUtils.RESULT_STATE_INTERNAL_ERROR; /** @@ -94,7 +90,8 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen HomeFragment homeFragment = (HomeFragment) BaseFragment.fragment(R.id.nav_home, this.getActivity().getApplication()); if (homeFragment.packageName.startsWith("com.kurogame")){ ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(CompressUtil.backupKuroGame(homeFragment.packageName), Base64.DEFAULT)); + Context targetContext = this.getActivity().createPackageContext(homeFragment.packageName, CONTEXT_IGNORE_SECURITY); + ClipData mClipData = ClipData.newPlainText("XMMLogin", Base64.encodeToString(BackupUtil.backupKuroGame(targetContext), Base64.DEFAULT)); cm.setPrimaryClip(mClipData); Toast.makeText(this.getActivity(), R.string.copy_login_success, Toast.LENGTH_LONG).show(); } else { @@ -110,7 +107,8 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen if (homeFragment.packageName.startsWith("com.kurogame")){ ClipboardManager cm = (ClipboardManager) this.getActivity().getSystemService(Context.CLIPBOARD_SERVICE); if(cm.getPrimaryClip() != null){ - CompressUtil.restoreKuroGame(homeFragment.packageName, Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); + Context targetContext = this.getActivity().createPackageContext(homeFragment.packageName, CONTEXT_IGNORE_SECURITY); + BackupUtil.restoreKuroGame(targetContext, Base64.decode(cm.getPrimaryClip().getItemAt(0).getText().toString(), Base64.DEFAULT)); Toast.makeText(this.getActivity(), R.string.import_login_success, Toast.LENGTH_LONG).show(); } else { Toast.makeText(this.getActivity(), R.string.import_login_failed_empty, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java similarity index 50% rename from app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java rename to app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java index 8ed15d9..8a0902e 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/utils/CompressUtil.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java @@ -1,91 +1,26 @@ package io.github.xausky.unitymodmanager.utils; +import android.app.backup.SharedPreferencesBackupHelper; +import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import com.google.android.gms.common.util.SharedPreferencesUtils; import com.topjohnwu.superuser.Shell; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.json.JSONException; import org.json.JSONObject; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.StringJoiner; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.Inflater; -public class CompressUtil { - public static byte[] compress(byte[] data) { - byte[] output = new byte[0]; - Deflater compresser = new Deflater(); - compresser.reset(); - compresser.setInput(data); - compresser.finish(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); - try { - byte[] buf = new byte[1024]; - while (!compresser.finished()) { - int i = compresser.deflate(buf); - bos.write(buf, 0, i); - } - output = bos.toByteArray(); - } catch (Exception e) { - output = data; - e.printStackTrace(); - } finally { - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - compresser.end(); - return output; - } - - //解压缩 字节数组 - public static byte[] decompress(byte[] data) { - byte[] output = new byte[0]; - - Inflater decompresser = new Inflater(); - decompresser.reset(); - decompresser.setInput(data); +import static android.content.Context.MODE_PRIVATE; - ByteArrayOutputStream o = new ByteArrayOutputStream(data.length); - try { - byte[] buf = new byte[1024]; - while (!decompresser.finished()) { - int i = decompresser.inflate(buf); - o.write(buf, 0, i); - } - output = o.toByteArray(); - } catch (Exception e) { - output = data; - e.printStackTrace(); - } finally { - try { - o.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - decompresser.end(); - return output; - } +public class BackupUtil { - public static byte[] backupKuroGame(String packageName) { - String accountsDatabaseFile = "/data/data/" + packageName + "/databases/zz_sdk_db"; - String deviceIdFile = "/data/data/" + packageName + "/shared_prefs/devicesyn.xml"; + public static byte[] backupKuroGame(Context context) { + String accountsDatabaseFile = context.getDatabasePath("zz_sdk_db").getAbsolutePath(); + String deviceIdFile = context.getFilesDir().getAbsolutePath() + "/shared_prefs/devicesyn.xml"; try { unprotectFilesWithRoot(accountsDatabaseFile, deviceIdFile); JSONObject root = new JSONObject(); @@ -105,7 +40,9 @@ public static byte[] backupKuroGame(String packageName) { } } root.put("accounts", builder.toString()); - root.put("device", FileUtils.readFileToString(new File(deviceIdFile))); + SharedPreferences sharedPreferences = context.getSharedPreferences("devicesyn", MODE_PRIVATE); + String deviceId = sharedPreferences.getString("device_id", null); + root.put("device_id", deviceId); return root.toString().getBytes(); } catch (Exception e) { throw new RuntimeException(e); @@ -114,9 +51,9 @@ public static byte[] backupKuroGame(String packageName) { } } - public static void restoreKuroGame(String packageName, byte[] data) { - String accountsDatabaseFile = "/data/data/" + packageName + "/databases/zz_sdk_db"; - String deviceIdFile = "/data/data/" + packageName + "/shared_prefs/devicesyn.xml"; + public static void restoreKuroGame(Context context, byte[] data) { + String accountsDatabaseFile = context.getDatabasePath("zz_sdk_db").getAbsolutePath(); + String deviceIdFile = context.getFilesDir().getAbsolutePath() + "/shared_prefs/devicesyn.xml"; try { unprotectFilesWithRoot(accountsDatabaseFile, deviceIdFile); JSONObject root = new JSONObject(new String(data)); @@ -126,7 +63,8 @@ public static void restoreKuroGame(String packageName, byte[] data) { db.execSQL("INSERT INTO sdkuser(user_id,login_id,login_name,password,auto_login,last_login_time,login_type,local_login_count,user_type) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", account.split(",")); } } - FileUtils.writeStringToFile(new File(deviceIdFile), root.getString("device")); + SharedPreferences sharedPreferences = context.getSharedPreferences("devicesyn", MODE_PRIVATE); + sharedPreferences.edit().putString("fake_device_id", root.getString("device_id")).commit(); } catch (Exception e) { throw new RuntimeException(e); } finally { @@ -134,7 +72,7 @@ public static void restoreKuroGame(String packageName, byte[] data) { } } - public static void unprotectFilesWithRoot(String ...files){ + private static void unprotectFilesWithRoot(String ...files){ StringBuilder builder = new StringBuilder(); for (int i = 1; i <= files.length; i++){ builder.append(files[i - 1]); @@ -145,7 +83,7 @@ public static void unprotectFilesWithRoot(String ...files){ Shell.su("setenforce 0", "chmod 666 " + builder.toString()).exec(); } - public static void protectFilesWithRoot(String ...files){ + private static void protectFilesWithRoot(String ...files){ StringBuilder builder = new StringBuilder(); for (int i = 1; i <= files.length; i++){ builder.append(files[i - 1]); From 497391e69c18a62310700f77a9d1854a0eb8d86b Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 12 Jan 2020 11:24:28 +0800 Subject: [PATCH 21/24] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=98=E5=8F=8C?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/github/xausky/unitymodmanager/utils/BackupUtil.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java index 8a0902e..d236d0a 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java @@ -1,19 +1,14 @@ package io.github.xausky.unitymodmanager.utils; -import android.app.backup.SharedPreferencesBackupHelper; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import com.google.android.gms.common.util.SharedPreferencesUtils; import com.topjohnwu.superuser.Shell; -import org.apache.commons.io.FileUtils; import org.json.JSONObject; -import java.io.File; - import static android.content.Context.MODE_PRIVATE; public class BackupUtil { @@ -64,7 +59,7 @@ public static void restoreKuroGame(Context context, byte[] data) { } } SharedPreferences sharedPreferences = context.getSharedPreferences("devicesyn", MODE_PRIVATE); - sharedPreferences.edit().putString("fake_device_id", root.getString("device_id")).commit(); + sharedPreferences.edit().putString("device_id", root.getString("device_id")).commit(); } catch (Exception e) { throw new RuntimeException(e); } finally { From 05859c9c9a2b5c4757eab301909c1b945dce4948 Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 12 Jan 2020 11:31:50 +0800 Subject: [PATCH 22/24] =?UTF-8?q?=E6=9B=B4=E6=96=B0=204.1.0=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- app/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 4d20eac..5d6783a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ build/ /captures .externalNativeBuild .vscode -build \ No newline at end of file +build +release \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 152a8a6..5563f0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "cn.xausky.umm" minSdkVersion 21 targetSdkVersion 23 - versionCode 400 - versionName "4.0.0" + versionCode 410 + versionName "4.1.0" ndk{ abiFilters "armeabi-v7a","x86" } From 92b4778747acbdb45bd57b4450fcbf41e6578106 Mon Sep 17 00:00:00 2001 From: xausky Date: Sun, 12 Jan 2020 16:23:40 +0800 Subject: [PATCH 23/24] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E7=99=BB=E5=BD=95=E4=BF=A1=E6=81=AF=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 ++-- .../xausky/unitymodmanager/utils/BackupUtil.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5563f0f..511bb56 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "cn.xausky.umm" minSdkVersion 21 targetSdkVersion 23 - versionCode 410 - versionName "4.1.0" + versionCode 411 + versionName "4.1.1" ndk{ abiFilters "armeabi-v7a","x86" } diff --git a/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java b/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java index d236d0a..4ad89e8 100644 --- a/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java +++ b/app/src/main/java/io/github/xausky/unitymodmanager/utils/BackupUtil.java @@ -17,7 +17,7 @@ public static byte[] backupKuroGame(Context context) { String accountsDatabaseFile = context.getDatabasePath("zz_sdk_db").getAbsolutePath(); String deviceIdFile = context.getFilesDir().getAbsolutePath() + "/shared_prefs/devicesyn.xml"; try { - unprotectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + unprotectFilesWithRoot(accountsDatabaseFile + "*", deviceIdFile); JSONObject root = new JSONObject(); StringBuilder builder = new StringBuilder(); try (SQLiteDatabase db = SQLiteDatabase.openDatabase(accountsDatabaseFile, null, SQLiteDatabase.OPEN_READONLY); @@ -42,7 +42,7 @@ public static byte[] backupKuroGame(Context context) { } catch (Exception e) { throw new RuntimeException(e); } finally { - protectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + protectFilesWithRoot(accountsDatabaseFile + "*", deviceIdFile); } } @@ -50,7 +50,7 @@ public static void restoreKuroGame(Context context, byte[] data) { String accountsDatabaseFile = context.getDatabasePath("zz_sdk_db").getAbsolutePath(); String deviceIdFile = context.getFilesDir().getAbsolutePath() + "/shared_prefs/devicesyn.xml"; try { - unprotectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + unprotectFilesWithRoot(accountsDatabaseFile + "*", deviceIdFile); JSONObject root = new JSONObject(new String(data)); String accounts = root.getString("accounts"); try (SQLiteDatabase db = SQLiteDatabase.openDatabase(accountsDatabaseFile, null, SQLiteDatabase.OPEN_READWRITE)) { @@ -63,7 +63,7 @@ public static void restoreKuroGame(Context context, byte[] data) { } catch (Exception e) { throw new RuntimeException(e); } finally { - protectFilesWithRoot(accountsDatabaseFile, deviceIdFile); + protectFilesWithRoot(accountsDatabaseFile + "*", deviceIdFile); } } @@ -86,6 +86,6 @@ private static void protectFilesWithRoot(String ...files){ builder.append(" "); } } - Shell.su("setenforce 1", "chmod 644 " + builder.toString()).exec(); + Shell.su("setenforce 1", "chmod 600 " + builder.toString()).exec(); } } From 5252c9652bc3ae66dfa0526afa62ccd988328d78 Mon Sep 17 00:00:00 2001 From: xausky Date: Mon, 13 Jan 2020 18:11:28 +0800 Subject: [PATCH 24/24] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 511bb56..97d94c3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,9 +22,9 @@ android { signingConfigs { releaseConfig { storeFile file("../xausky.jks") - storePassword 'a7523003' - keyAlias = 'default' - keyPassword 'a7523003' + storePassword project.hasProperty("KEYSTORE_PASS") ? KEYSTORE_PASS : System.getenv("KEYSTORE_PASS") + keyAlias project.hasProperty("ALIAS_NAME") ? ALIAS_NAME : System.getenv("ALIAS_NAME") + keyPassword project.hasProperty("ALIAS_PASS") ? ALIAS_PASS : System.getenv("ALIAS_PASS") } } buildTypes {