first commit

main
DESKTOP-G4KQC8P\xiangy 2 years ago
commit a6b5a0a9c4

@ -0,0 +1,53 @@
name: Android CI
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache Gradle
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-manager-${{ github.sha }}
restore-keys: |
gradle-
- name: Build with Gradle
run: |
echo 'org.gradle.caching=true' >> gradle.properties
echo 'org.gradle.parallel=true' >> gradle.properties
echo 'org.gradle.vfs.watch=true' >> gradle.properties
echo 'org.gradle.jvmargs=-Xmx2048m' >> gradle.properties
chmod 777 ./gradlew
./gradlew assembleRelease
- uses: r0adkll/sign-android-release@v1
name: Sign app APK
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
#env:
#// override default build-tools version (29.0.3) -- optional
#BUILD_TOOLS_VERSION: "30.0.2"
# Example use of `signedReleaseFile` output -- not needed
- uses: actions/upload-artifact@v2
with:
name: Signed app bundle
path: ${{steps.sign_app.outputs.signedReleaseFile}}

15
.gitignore vendored

@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

3
.idea/.gitignore vendored

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

@ -0,0 +1 @@
淘米水

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<targetSelectedWithDropDown>
<Target>
<type value="QUICK_BOOT_TARGET" />
<deviceKey>
<Key>
<type value="VIRTUAL_DEVICE_PATH" />
<value value="C:\Users\xiangy\.android\avd\Pixel_3a_API_34_extension_level_7_x86_64.avd" />
</Key>
</deviceKey>
</Target>
</targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-10-31T07:16:31.542968200Z" />
</component>
</project>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-17" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://jcenter.bintray.com" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven2" />
<option name="name" value="maven2" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.7.20" />
</component>
</project>

@ -0,0 +1,9 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

@ -0,0 +1,8 @@
# mi_water
a lsposed module for miui 一款基于lsposed的去除miui系统中各种不友好使用限制的模块
淘米水
一款基于lsposed开发的针对miui系统的插件
实现了去除系统自带广告去除app安装限制等功能
基于GPLV2协议公开源码

1
app/.gitignore vendored

@ -0,0 +1 @@
/build

@ -0,0 +1,52 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
defaultConfig {
applicationId "cn.coderstory.miui.water"
minSdkVersion 28
targetSdkVersion 33
versionCode 15
versionName "1.7.6"
}
packagingOptions {
jniLibs {
excludes += ['META-INF/**']
}
resources {
excludes += ['META-INF/**']
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
buildFeatures {
viewBinding true
}
lint {
abortOnError false
}
namespace 'cn.coderstory.miui.water'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.preference:preference-ktx:1.2.0'
compileOnly 'de.robv.android.xposed:api:82'
implementation "com.github.topjohnwu.libsu:core:3.1.2"
}

@ -0,0 +1,5 @@
-keep class cn.coderstory.miui.water.MainHook
-repackageclasses
-allowaccessmodification
-overloadaggressively

Binary file not shown.

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "cn.coderstory.miui.water",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 15,
"versionName": "1.7.6",
"outputFile": "app-release.apk"
}
],
"elementType": "File"
}

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="false"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="MissingApplicationIcon">
<activity
android:name="cn.coderstory.miui.water.SettingsActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="de.robv.android.xposed.category.MODULE_SETTINGS" />
</intent-filter>
</activity>
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="@string/module_description" />
<meta-data
android:name="xposedminversion"
android:value="93" />
<meta-data
android:name="xposedscope"
android:resource="@array/scope" />
</application>
</manifest>

@ -0,0 +1 @@
cn.coderstory.miui.water.MainHook

@ -0,0 +1,192 @@
package cn.coderstory.miui.water
import android.content.pm.ApplicationInfo
import android.widget.TextView
import de.robv.android.xposed.*
import de.robv.android.xposed.callbacks.XC_LoadPackage
import java.net.URL
class MainHook : XposedHelper(), IXposedHookLoadPackage {
var prefs = XSharedPreferences(BuildConfig.APPLICATION_ID, "conf")
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
if (lpparam.packageName.equals("com.android.thememanager")) {
if (prefs.getBoolean("removeThemeAd", true)) {
hookAllMethods(
"com.android.thememanager.basemodule.ad.model.AdInfoResponse",
lpparam.classLoader,
"isAdValid",
XC_MethodReplacement.returnConstant(false)
)
hookAllMethods(
"com.android.thememanager.basemodule.ad.model.AdInfoResponse",
lpparam.classLoader,
"checkAndGetAdInfo",
XC_MethodReplacement.returnConstant(null)
)
}
}
if (lpparam.packageName.equals("com.miui.packageinstaller")) {
if (prefs.getBoolean("removeInstallerAd", true)) {
XposedHelpers.findAndHookConstructor(
"com.miui.packageInstaller.model.CloudParams",
lpparam.classLoader,
object : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
var obj = param.thisObject;
XposedHelpers.setBooleanField(obj, "showAdsBefore", false);
XposedHelpers.setBooleanField(obj, "showAdsAfter", false);
XposedHelpers.setBooleanField(obj, "singletonAuthShowAdsBefore", false);
XposedHelpers.setBooleanField(obj, "singletonAuthShowAdsAfter", true);
XposedHelpers.setBooleanField(obj, "useSystemAppRules", true);
XposedHelpers.setBooleanField(obj, "showSafeModeTip", false);
XposedHelpers.setBooleanField(obj, "openButton", true);
XposedHelpers.setObjectField(obj, "safeType", "1");
}
})
}
if (prefs.getBoolean("removeInstallerAuth", true)) {
findAndHookMethod(
"java.net.URL",
lpparam.classLoader,
"openConnection",
object : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
var obj: URL = param.thisObject as URL
XposedBridge.log("current host is ${obj.host}")
if (obj.host.equals("api-installer.pt.xiaomi.com") || obj.host.equals("preview-api.installer.xiaomi.com")) {
XposedHelpers.setObjectField(obj, "host", "www.baidu.com");
}
}
})
}
if (prefs.getBoolean("removeInstallerLimit", true)) {
findAndHookMethod(
"android.net.Uri",
lpparam.classLoader,
"parse", String::class.java,
object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
if (param.args[0].toString().contains("com.miui.securitycenter")) {
param.args[0] = "ddddd"
}
}
})
// return (arg2.flags & 1) > 0 || arg2.uid < 10000;
findAndHookMethod(
"com.android.packageinstaller.e",
lpparam.classLoader,
"a", ApplicationInfo::class.java,
object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
param.result = true
}
})
// 隐藏开启纯净模式提示
// SafeModeTipViewObject safeModeTipViewObject = new SafeModeTipViewObject(h10, pureModeElderTipViewObject.f5884m, null, null, 12, null);
// safeModeTipViewObject.a(); a方法里的调用
findAndHookMethod(
"com.miui.packageInstaller.ui.listcomponets.f0",
lpparam.classLoader,
"a",
object : XC_MethodHook() {
@Throws(Throwable::class)
override fun afterHookedMethod(param: MethodHookParam) {
super.afterHookedMethod(param)
XposedHelpers.setBooleanField(param.thisObject, "l", false);
}
})
}
}
if (lpparam.packageName.equals("com.android.mms")) {
if (prefs.getBoolean("removeMmsAd", true)) {
hookAllMethods(
"com.miui.smsextra.http.RequestResult",
lpparam.classLoader,
"data",
object : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
var result = param.result
if (result.toString().contains("modules")) {
param.result = "{}";
}
}
}
)
hookAllMethods(
"com.miui.smsextra.ui.UnderstandButton",
lpparam.classLoader,
"requestAD",
XC_MethodReplacement.returnConstant(false)
)
}
}
if (lpparam.packageName.equals("com.miui.systemAdSolution")) {
if (prefs.getBoolean("removeSplashAd2", false)) {
findAndHookMethod(
"com.xiaomi.ad.entity.cloudControl.cn.CNDeskFolderControlInfo",
lpparam.classLoader,
"isCloseAd",
XC_MethodReplacement.returnConstant(true)
)
findAndHookMethod(
"com.xiaomi.ad.common.pojo.AdType",
lpparam.classLoader,
"valueOf",
Int::class.java,
XC_MethodReplacement.returnConstant(0)
)
}
}
if (lpparam.packageName.equals("com.miui.securitycenter")) {
if (prefs.getBoolean("disableWaiting", true)) {
findAndHookMethod("android.widget.TextView",
lpparam.classLoader,
"setEnabled",
Boolean::class.java,
object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
param.args[0] = true
}
})
findAndHookMethod("android.widget.TextView",
lpparam.classLoader,
"setText",
CharSequence::class.java,
TextView.BufferType::class.java,
Boolean::class.java,
Int::class.java,
object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
if (param.args.isNotEmpty() && param.args[0]?.toString()
?.startsWith("确定(") == true
) {
param.args[0] = "确定"
}
}
})
}
}
// Global
if (findClassWithOutLog("com.xiaomi.ad.server.AdLauncher", lpparam.classLoader) != null) {
findAndHookMethod(
"com.xiaomi.ad.server.AdLauncher",
lpparam.classLoader,
"initCrashMonitor",
XC_MethodReplacement.returnConstant(false)
)
}
}
}

@ -0,0 +1,59 @@
package cn.coderstory.miui.water
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.content.DialogInterface
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import com.topjohnwu.superuser.Shell
class SettingsActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
checkEdXposed()
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container, SettingsFragment())
.commit()
}
}
@SuppressLint("WorldReadableFiles")
private fun checkEdXposed() {
try {
getSharedPreferences("conf", MODE_WORLD_READABLE)
} catch (exception: SecurityException) {
AlertDialog.Builder(this)
.setMessage(getString(R.string.not_supported))
.setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> finish() }
.setNegativeButton(R.string.ignore, null)
.show()
}
}
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.prefs, rootKey)
}
override fun onPreferenceTreeClick(preference: Preference): Boolean {
if(preference.key == "removeSplashAd" ){
if((preference as SwitchPreference).isChecked){
Shell.su("rm -rf /storage/emulated/0/Android/data/com.miui.systemAdSolution/files/miad")
.exec()
Shell.su("touch /storage/emulated/0/Android/data/com.miui.systemAdSolution/files/miad")
.exec()
}else{
Shell.su("rm -rf /storage/emulated/0/Android/data/com.miui.systemAdSolution/files/miad")
.exec()
}
}
return super.onPreferenceTreeClick(preference)
}
}
}

@ -0,0 +1,76 @@
package cn.coderstory.miui.water
import de.robv.android.xposed.XC_MethodHook
import de.robv.android.xposed.XposedBridge
import de.robv.android.xposed.XposedHelpers
open class XposedHelper {
companion object {
fun findAndHookMethod(
p1: String?,
lpparam: ClassLoader?,
p2: String?,
vararg parameterTypesAndCallback: Any?
) {
try {
if (findClass(p1, lpparam) != null) {
XposedHelpers.findAndHookMethod(p1, lpparam, p2, *parameterTypesAndCallback)
}
} catch (e: Throwable) {
XposedBridge.log(e)
}
}
fun hookAllMethods(
p1: String?,
lpparam: ClassLoader?,
methodName: String?,
parameterTypesAndCallback: XC_MethodHook?
) {
try {
val packageParser = findClass(p1, lpparam)
XposedBridge.hookAllMethods(packageParser, methodName, parameterTypesAndCallback)
} catch (e: Throwable) {
XposedBridge.log(e)
}
}
private fun findClass(className: String?, classLoader: ClassLoader?): Class<*>? {
try {
return XposedHelpers.findClass(className,classLoader)
} catch (e: Throwable) {
XposedBridge.log(e)
}
return null
}
fun hookAllConstructors(p1: String?, classLoader: ClassLoader?,parameterTypesAndCallback: XC_MethodHook) {
try {
val packageParser = findClass(p1, classLoader)
hookAllConstructors(packageParser, parameterTypesAndCallback)
} catch (e: Throwable) {
XposedBridge.log(e)
}
}
private fun hookAllConstructors(
hookClass: Class<*>?,
callback: XC_MethodHook
): Set<XC_MethodHook.Unhook>? {
return try {
XposedBridge.hookAllConstructors(hookClass, callback)
} catch (e: Throwable) {
XposedBridge.log(e)
null
}
}
fun findClassWithOutLog(className: String?, classLoader: ClassLoader?): Class<*>? {
try {
return className?.let { Class.forName(it, false, classLoader) }
} catch (e: Exception) {
// 忽略
}
return null
}
}
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

@ -0,0 +1,8 @@
<resources>
<style name="AppTheme" parent="android:Theme.Material">
<item name="android:colorAccent">#3F51B5</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>
</resources>

@ -0,0 +1,22 @@
<resources>
<string name="app_name">淘米水</string>
<string name="module_description">MIUI广告救星</string>
<string name="corepatch">本插件兼容MIUI 13\n基于红米K40 MIUI 13.0.7版本适配\nPower By CoderStory</string>
<string name="removeInstallerAd">安装包管理器</string>
<string name="removeInstallerAuth">禁用账户验证</string>
<string name="removeInstallerAuth_summary">安装非商店应用时不再需要输入MIUI账户密码.</string>
<string name="removeInstallerAd_summary">移除应用安装界面的广告和去除应用商店相关按钮.</string>
<string name="removeThemeAd">主题美化</string>
<string name="removeThemeAd_summary">清除主题美化App中的广告</string>
<string name="removeInstallerLimit">安装限制</string>
<string name="removeInstallerLimit_summary">移除一些应用安装限制比如系统app无法直接安装被标记为危险的应用无法安装等</string>
<string name="removeSplashAd">开屏广告</string>
<string name="removeSplashAd_summary">去除系统App上的开屏广告, 需root权限</string>
<string name="disableWaiting">去除5s/10s限制</string>
<string name="disableWaiting_summary">去掉开启无障碍等功能必须等待10秒的危险提示</string>
<string name="removeMmsAd">短信去广告</string>
<string name="removeMmsAd_summary">去掉短信下方输入框位置的广告按钮和短信内容下方的推广按钮</string>
<string name="settings">设置</string>
<string name="ignore">忽略</string>
<string name="not_supported">您似乎正在使用过时的 LSPosed 版本或 LSPosed 未激活,请更新 LSPosed 或者激活后再试。</string>
</resources>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="scope">
<item>com.android.thememanager</item>
<item>com.miui.packageinstaller</item>
<item>com.miui.securitycenter</item>
<item>com.miui.analytics</item>
<item>com.android.traceur</item>
<item>com.miui.systemAdSolution</item>
<item>com.android.mms</item>
</string-array>
</resources>

@ -0,0 +1,24 @@
<resources>
<string name="app_name">Mi Water</string>
<string name="module_description">LSPosed Module For MIUI</string>
<string name="corepatch">This version is for miui 13 only.</string>
<string name="removeThemeAd">MIUI Theme</string>
<string name="removeThemeAd_summary">Remove AD from Theme.</string>
<string name="removeInstallerAuth">disable verify account</string>
<string name="removeInstallerAuth_summary">disable verify account when install app which not exist on the official store.</string>
<string name="removeInstallerAd">Package Installer</string>
<string name="removeInstallerAd_summary">Remove AD from Package Installer.</string>
<string name="removeInstallerLimit">install limit</string>
<string name="removeInstallerLimit_summary">remove some limits on install apk</string>
<string name="removeSplashAd">remove splash AD</string>
<string name="removeSplashAd_summary">remove splash ad with miui app (need root permission)</string>
<string name="disableWaiting">remove limit for enable some futures in miui</string>
<string name="disableWaiting_summary">Removed the restriction of having to wait 10 seconds before the function can be turned on</string>
<string name="removeMmsAd">remove ad with mms</string>
<string name="removeMmsAd_summary">It seems ads will no longer appear with English language</string>
<string name="weibo_link" translatable="false">260345842</string>
<string name="blog_link" translatable="false">https://blog.coderstory.cn</string>
<string name="settings">Settings</string>
<string name="ignore">Ignore</string>
<string name="not_supported">It seems that you are using an out dated version of LSPosed or LSPosed is not activated, please update LSPosed or try again after activated.</string>
</resources>

@ -0,0 +1,8 @@
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light.LightStatusBar">
<item name="android:colorAccent">#3F51B5</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>
</resources>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
android:summary="@string/corepatch"
app:iconSpaceReserved="false" />
<PreferenceCategory
android:title="@string/settings"
app:iconSpaceReserved="false">
<SwitchPreference
android:defaultValue="true"
android:key="removeThemeAd2"
android:summary="@string/removeThemeAd_summary"
android:title="@string/removeThemeAd"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="removeInstallerAd"
android:summary="@string/removeInstallerAd_summary"
android:title="@string/removeInstallerAd"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="removeInstallerAuth"
android:summary="@string/removeInstallerAuth_summary"
android:title="@string/removeInstallerAuth"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="removeInstallerLimit"
android:summary="@string/removeInstallerLimit_summary"
android:title="@string/removeInstallerLimit"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="false"
android:key="removeSplashAd"
android:summary="@string/removeSplashAd_summary"
android:title="@string/removeSplashAd"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="disableWaiting"
android:summary="@string/disableWaiting_summary"
android:title="@string/disableWaiting"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="removeMmsAd"
android:summary="@string/removeMmsAd_summary"
android:title="@string/removeMmsAd"
app:iconSpaceReserved="false" />
</PreferenceCategory>
</PreferenceScreen>

@ -0,0 +1,25 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.7.20'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://jcenter.bintray.com" }
maven { url 'https://jitpack.io' }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

@ -0,0 +1,28 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1500m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
#systemProp.http.proxyHost=127.0.0.1
#systemProp.http.proxyPort=8889
#systemProp.https.proxyHost=127.0.0.1
#systemProp.https.proxyPort=8889
#

Binary file not shown.

@ -0,0 +1,6 @@
#Wed Jun 09 21:06:45 CST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

172
gradlew vendored

@ -0,0 +1,172 @@
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

84
gradlew.bat vendored

@ -0,0 +1,84 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

Binary file not shown.

@ -0,0 +1,2 @@
rootProject.name = "淘米水"
include ':app'
Loading…
Cancel
Save