Core upgrade (#213)

Co-authored-by: LoveSy <shana@zju.edu.cn>
This commit is contained in:
Howard Wu 2023-06-29 02:17:00 +08:00 committed by GitHub
parent 5d927f1dd2
commit 941726d559
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 151 additions and 132 deletions

View File

@ -5,7 +5,7 @@ on:
push:
branches: [ master ]
paths:
- manager/src/main/res/values/strings.xml
- manager/src/main/res/values/strings.xml
jobs:
synchronize-with-crowdin:

View File

@ -15,6 +15,11 @@ jobs:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
env:
CCACHE_COMPILERCHECK: '%compiler% -dumpmachine; %compiler% -dumpversion'
CCACHE_NOHASHDIR: 'true'
CCACHE_HARDLINK: 'true'
CCACHE_BASEDIR: '${{ github.workspace }}'
steps:
- name: Checkout
@ -34,62 +39,55 @@ jobs:
echo ${{ secrets.KEY_STORE }} | base64 --decode > key.jks
fi
- name: Set up JDK 11
- name: Checkout libxposed/api
uses: actions/checkout@v3
with:
repository: libxposed/api
path: libxposed/api
- name: Checkout libxposed/service
uses: actions/checkout@v3
with:
repository: libxposed/service
path: libxposed/service
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: '11'
java-version: '17'
distribution: 'temurin'
cache: 'gradle'
- name: Cache gradle dependencies
uses: actions/cache@v3
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
!~/.gradle/caches/build-cache-*
key: gradle-deps-core-${{ hashFiles('**/build.gradle.kts') }}
restore-keys: |
gradle-deps
gradle-home-cache-cleanup: true
- name: Cache gradle build
uses: actions/cache@v3
- name: Set up ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
path: |
~/.gradle/caches/build-cache-*
~/.gradle/buildOutputCleanup/cache.properties
key: gradle-builds-core-${{ github.sha }}
restore-keys: |
gradle-builds
max-size: 2G
key: ${{ runner.os }}
restore-keys: ${{ runner.os }}
save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
- name: Cache native build
uses: actions/cache@v3
with:
path: |
~/.ccache
patch-loader/build/.lto-cache
key: native-cache-${{ github.sha }}
restore-keys: native-cache-
- name: Install dep
- name: Build dependencies
working-directory: libxposed
run: |
sudo apt-get install -y ccache
ccache -o max_size=1G
ccache -o hash_dir=false
ccache -o compiler_check='%compiler% -dumpmachine; %compiler% -dumpversion'
ccache -zp
cd api
echo 'org.gradle.jvmargs=-Xmx2048m' >> gradle.properties
./gradlew :api:publishApiPublicationToMavenLocal
cd ..
cd service
echo 'org.gradle.jvmargs=-Xmx2048m' >> gradle.properties
./gradlew :interface:publishInterfacePublicationToMavenLocal
- name: Build with Gradle
run: |
[ $(du -s ~/.gradle/wrapper | awk '{ print $1 }') -gt 250000 ] && rm -rf ~/.gradle/wrapper/* || true
find ~/.gradle/caches -exec touch -d "2 days ago" {} + || true
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
echo 'android.native.buildOutput=verbose' >> gradle.properties
./gradlew buildAll
ccache -s
- name: Upload Debug artifact
uses: actions/upload-artifact@v3

2
.gitmodules vendored
View File

@ -5,7 +5,7 @@
[submodule "core"]
path = core
url = https://github.com/LSPosed/LSPosed.git
branch = lspatch
branch = master
[submodule "patch/libs/manifest-editor"]
path = patch/libs/manifest-editor
url = https://github.com/WindySha/ManifestEditor.git

View File

@ -14,8 +14,8 @@ dependencies {
implementation("com.google.code.findbugs:jsr305:3.0.2")
implementation("org.bouncycastle:bcpkix-jdk15on:1.70")
implementation("org.bouncycastle:bcprov-jdk15on:1.70")
api("com.google.guava:guava:31.0.1-jre")
api("com.android.tools.build:apksig:7.1.2")
compileOnlyApi("com.google.auto.value:auto-value-annotations:1.9")
annotationProcessor("com.google.auto.value:auto-value:1.9")
api("com.google.guava:guava:32.0.1-jre")
api("com.android.tools.build:apksig:8.0.2")
compileOnlyApi("com.google.auto.value:auto-value-annotations:1.10.1")
annotationProcessor("com.google.auto.value:auto-value:1.10.1")
}

View File

@ -6,8 +6,8 @@ import org.eclipse.jgit.internal.storage.file.FileRepository
import org.eclipse.jgit.storage.file.FileRepositoryBuilder
plugins {
id("com.android.application") apply false
id("com.android.library") apply false
alias(libs.plugins.agp.lib) apply false
alias(libs.plugins.agp.app) apply false
}
buildscript {
@ -17,7 +17,7 @@ buildscript {
}
dependencies {
classpath("org.eclipse.jgit:org.eclipse.jgit:6.3.0.202209071007-r")
classpath(kotlin("gradle-plugin", version = "1.7.20"))
classpath(kotlin("gradle-plugin", version = "1.8.21"))
}
}
@ -54,8 +54,8 @@ val androidTargetSdkVersion by extra(33)
val androidCompileSdkVersion by extra(33)
val androidCompileNdkVersion by extra("25.1.8937393")
val androidBuildToolsVersion by extra("33.0.1")
val androidSourceCompatibility by extra(JavaVersion.VERSION_11)
val androidTargetCompatibility by extra(JavaVersion.VERSION_11)
val androidSourceCompatibility by extra(JavaVersion.VERSION_17)
val androidTargetCompatibility by extra(JavaVersion.VERSION_17)
tasks.register<Delete>("clean") {
delete(rootProject.buildDir)

2
core

@ -1 +1 @@
Subproject commit 5666dca1e3b83e9b664bfcd096370b1a7da6eff1
Subproject commit cb32c70951e959855125a0b60f78b5dacbd3e153

View File

@ -1,8 +1,3 @@
android.experimental.enableNewResourceShrinker=true
android.experimental.enableNewResourceShrinker.preciseShrinking=true
android.enableAppCompileTimeRClass=true
android.nonTransitiveRClass=true
android.enableR8.fullMode=true
android.useAndroidX=true
agpVersion=7.4.0

Binary file not shown.

View File

@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

19
gradlew vendored
View File

@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@ -80,13 +80,10 @@ do
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${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='"-Xmx64m" "-Xms64m"'
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -143,12 +140,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in

1
gradlew.bat vendored
View File

@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

View File

@ -27,7 +27,7 @@ fun Jar.configure(variant: String) {
into("assets") {
from("src/main/assets")
from("${rootProject.projectDir}/out/assets")
from("${rootProject.projectDir}/out/assets/$variant")
}
exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "META-INF/*.MF", "META-INF/*.txt", "META-INF/versions/**")

View File

@ -1,3 +1,5 @@
import java.util.Locale
val defaultManagerPackageName: String by rootProject.extra
val apiCode: Int by rootProject.extra
val verCode: Int by rootProject.extra
@ -6,7 +8,7 @@ val coreVerCode: Int by rootProject.extra
val coreVerName: String by rootProject.extra
plugins {
id("com.android.application")
alias(libs.plugins.agp.app)
id("com.google.devtools.ksp")
id("dev.rikka.tools.refine")
id("kotlin-parcelize")
@ -29,23 +31,33 @@ android {
}
release {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
all {
sourceSets[name].assets.srcDirs(rootProject.projectDir.resolve("out/assets/$name"))
}
}
kotlinOptions {
jvmTarget = "11"
jvmTarget = "17"
}
kotlin {
jvmToolchain(17)
}
buildFeatures {
compose = true
buildConfig = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.3.2"
kotlinCompilerExtensionVersion = "1.4.7"
}
sourceSets["main"].assets.srcDirs(rootProject.projectDir.resolve("out/assets"))
namespace = "org.lsposed.lspatch"
applicationVariants.all {
@ -59,8 +71,8 @@ android {
afterEvaluate {
android.applicationVariants.forEach { variant ->
val variantLowered = variant.name.toLowerCase()
val variantCapped = variant.name.capitalize()
val variantLowered = variant.name.lowercase()
val variantCapped = variant.name.replaceFirstChar { it.uppercase() }
task<Copy>("copy${variantCapped}Assets") {
dependsOn(":meta-loader:copy$variantCapped")
@ -68,7 +80,7 @@ afterEvaluate {
tasks["merge${variantCapped}Assets"].dependsOn(this)
into("$buildDir/intermediates/assets/$variantLowered/merge${variantCapped}Assets")
from("${rootProject.projectDir}/out/assets")
from("${rootProject.projectDir}/out/assets/${variant.name}")
}
task<Copy>("build$variantCapped") {
@ -86,38 +98,38 @@ dependencies {
implementation(projects.share.android)
implementation(projects.share.java)
val roomVersion = "2.4.3"
val roomVersion = "2.5.2"
val accompanistVersion = "0.27.0"
val composeDestinationsVersion = "1.7.25-beta"
implementation(platform("androidx.compose:compose-bom:2022.10.00"))
val composeDestinationsVersion = "1.9.42-beta"
implementation(platform("androidx.compose:compose-bom:2023.06.01"))
annotationProcessor("androidx.room:room-compiler:$roomVersion")
compileOnly("dev.rikka.hidden:stub:3.4.3")
compileOnly("dev.rikka.hidden:stub:4.2.0")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.customview:customview:1.2.0-alpha02")
debugImplementation("androidx.customview:customview-poolingcontainer:1.0.0")
implementation("androidx.activity:activity-compose:1.6.1")
implementation("androidx.activity:activity-compose:1.7.2")
implementation("androidx.compose.material:material-icons-extended")
implementation("androidx.compose.material3:material3")
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1")
implementation("androidx.navigation:navigation-compose:2.5.3")
implementation("androidx.preference:preference:1.2.0")
implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
implementation("androidx.navigation:navigation-compose:2.6.0")
implementation(libs.androidx.preference)
implementation("androidx.room:room-ktx:$roomVersion")
implementation("androidx.room:room-runtime:$roomVersion")
implementation("com.google.accompanist:accompanist-navigation-animation:$accompanistVersion")
implementation("com.google.accompanist:accompanist-pager:$accompanistVersion")
implementation("com.google.accompanist:accompanist-swiperefresh:$accompanistVersion")
implementation("com.google.android.material:material:1.7.0")
implementation("com.google.code.gson:gson:2.10")
implementation("dev.rikka.shizuku:api:12.2.0")
implementation("dev.rikka.shizuku:provider:12.2.0")
implementation("dev.rikka.tools.refine:runtime:3.1.1")
implementation(libs.material)
implementation(libs.gson)
implementation("dev.rikka.shizuku:api:13.1.2")
implementation("dev.rikka.shizuku:provider:13.1.2")
implementation("dev.rikka.tools.refine:runtime:4.3.0")
implementation("io.github.raamcosta.compose-destinations:core:$composeDestinationsVersion")
implementation("me.zhanghai.android.appiconloader:appiconloader:1.5.0")
implementation("org.lsposed.hiddenapibypass:hiddenapibypass:4.3")
implementation(libs.appiconloader)
implementation(libs.hiddenapibypass)
ksp("androidx.room:room-compiler:$roomVersion")
ksp("io.github.raamcosta.compose-destinations:ksp:$composeDestinationsVersion")
}

View File

@ -6,3 +6,5 @@
-keepclassmembers class org.lsposed.patch.LSPatch {
private <fields>;
}
-dontwarn com.google.auto.value.AutoValue$Builder
-dontwarn com.google.auto.value.AutoValue

View File

@ -16,3 +16,5 @@
-keepclassmembers class org.lsposed.patch.LSPatch {
private <fields>;
}
-dontwarn com.google.auto.value.AutoValue$Builder
-dontwarn com.google.auto.value.AutoValue

View File

@ -15,7 +15,7 @@ object ManagerService : ILSPApplicationService.Stub() {
private const val TAG = "ManagerService"
override fun requestModuleBinder(name: String): IBinder {
override fun getLegacyModulesList(): MutableList<Module> {
TODO("Not yet implemented")
}
@ -32,10 +32,6 @@ object ManagerService : ILSPApplicationService.Stub() {
TODO("Not yet implemented")
}
override fun requestRemotePreference(packageName: String, userId: Int, callback: IBinder?): Bundle {
TODO("Not yet implemented")
}
override fun requestInjectedManagerBinder(binder: List<IBinder>?): ParcelFileDescriptor? {
return null
}

View File

@ -25,7 +25,7 @@ import org.lsposed.lspatch.ui.util.LocalSnackbarHost
class MainActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class)
@OptIn(ExperimentalAnimationApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
@ -55,7 +55,7 @@ private fun BottomBar(navController: NavHostController) {
?: NavGraphs.root.startAppDestination
var topDestination by rememberSaveable { mutableStateOf(currentDestination.route) }
LaunchedEffect(currentDestination) {
val queue = navController.backQueue
val queue = navController.currentBackStack.value
if (queue.size == 2) topDestination = queue[1].destination.route!!
else if (queue.size > 2) topDestination = queue[2].destination.route!!
}

View File

@ -1,9 +1,10 @@
import java.util.Locale
plugins {
id("com.android.application")
alias(libs.plugins.agp.app)
}
android {
defaultConfig {
multiDexEnabled = false
}
@ -18,8 +19,8 @@ android {
}
androidComponents.onVariants { variant ->
val variantCapped = variant.name.capitalize()
val variantLowered = variant.name.toLowerCase()
val variantCapped = variant.name.replaceFirstChar { it.uppercase() }
val variantLowered = variant.name.lowercase()
task<Copy>("copyDex$variantCapped") {
dependsOn("assemble$variantCapped")
@ -28,7 +29,7 @@ androidComponents.onVariants { variant ->
"$buildDir/intermediates/dex/$variantLowered/mergeDex$variantCapped"
from(dexOutPath)
rename("classes.dex", "metaloader.dex")
into("${rootProject.projectDir}/out/assets/lspatch")
into("${rootProject.projectDir}/out/assets/${variant.name}/lspatch")
}
task("copy$variantCapped") {
@ -43,5 +44,5 @@ androidComponents.onVariants { variant ->
dependencies {
compileOnly(projects.hiddenapi.stubs)
implementation(projects.share.java)
implementation("org.lsposed.hiddenapibypass:hiddenapibypass:4.3")
implementation(libs.hiddenapibypass)
}

View File

@ -2,3 +2,6 @@
public static byte[] dex;
<init>();
}
-dontwarn androidx.annotation.NonNull
-dontwarn androidx.annotation.Nullable
-dontwarn androidx.annotation.VisibleForTesting

View File

@ -1,5 +1,7 @@
import java.util.Locale
plugins {
id("com.android.application")
alias(libs.plugins.agp.app)
}
android {
@ -7,6 +9,10 @@ android {
multiDexEnabled = false
}
buildFeatures {
buildConfig = true
}
buildTypes {
release {
isMinifyEnabled = false
@ -23,13 +29,13 @@ android {
}
androidComponents.onVariants { variant ->
val variantCapped = variant.name.capitalize()
val variantCapped = variant.name.replaceFirstChar { it.uppercase() }
task<Copy>("copyDex$variantCapped") {
dependsOn("assemble$variantCapped")
from("$buildDir/intermediates/dex/${variant.name}/mergeDex$variantCapped/classes.dex")
rename("classes.dex", "loader.dex")
into("${rootProject.projectDir}/out/assets/lspatch")
into("${rootProject.projectDir}/out/assets/${variant.name}/lspatch")
}
task<Copy>("copySo$variantCapped") {
@ -40,7 +46,7 @@ androidComponents.onVariants { variant ->
"include" to listOf("**/liblspatch.so")
)
)
into("${rootProject.projectDir}/out/assets/lspatch/so")
into("${rootProject.projectDir}/out/assets/${variant.name}/lspatch/so")
}
task("copy$variantCapped") {
@ -61,5 +67,5 @@ dependencies {
implementation(projects.share.android)
implementation(projects.share.java)
implementation("com.google.code.gson:gson:2.10")
implementation(libs.gson)
}

View File

@ -85,7 +85,7 @@ public class LSPApplication {
}
disableProfile(context);
Startup.initXposed(false, ActivityThread.currentProcessName(), service);
Startup.initXposed(false, ActivityThread.currentProcessName(), ActivityThread.currentApplication().getPackageCodePath(), service);
Log.i(TAG, "Bootstrap Xposed");
Startup.bootstrapXposed();
// WARN: Since it uses `XResource`, the following class should not be initialized

View File

@ -1,10 +1,10 @@
package org.lsposed.lspatch.service;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Log;
import org.lsposed.lspatch.loader.util.FileUtils;
@ -58,7 +58,7 @@ public class LocalApplicationService extends ILSPApplicationService.Stub {
}
@Override
public IBinder requestModuleBinder(String name) {
public List<Module> getLegacyModulesList() throws RemoteException {
return null;
}
@ -72,11 +72,6 @@ public class LocalApplicationService extends ILSPApplicationService.Stub {
return new File(Environment.getDataDirectory(), "data/" + packageName + "/shared_prefs/").getAbsolutePath();
}
@Override
public Bundle requestRemotePreference(String packageName, int userId, IBinder callback) {
return null;
}
@Override
public ParcelFileDescriptor requestInjectedManagerBinder(List<IBinder> binder) {
return null;

View File

@ -6,7 +6,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
@ -75,7 +74,8 @@ public class RemoteApplicationService implements ILSPApplicationService {
}
boolean success = latch.await(1, TimeUnit.SECONDS);
if (!success) throw new TimeoutException("Bind service timeout");
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InterruptedException | TimeoutException e) {
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException |
InterruptedException | TimeoutException e) {
Toast.makeText(context, "Manager died", Toast.LENGTH_SHORT).show();
var r = new RemoteException("Failed to get manager binder");
r.initCause(e);
@ -84,8 +84,8 @@ public class RemoteApplicationService implements ILSPApplicationService {
}
@Override
public IBinder requestModuleBinder(String name) {
return service == null ? null : service.asBinder();
public List<Module> getLegacyModulesList() throws RemoteException {
return service == null ? new ArrayList<>() : service.getLegacyModulesList();
}
@Override
@ -98,11 +98,6 @@ public class RemoteApplicationService implements ILSPApplicationService {
return new File(Environment.getDataDirectory(), "data/" + packageName + "/shared_prefs/").getAbsolutePath();
}
@Override
public Bundle requestRemotePreference(String packageName, int userId, IBinder callback) throws RemoteException {
return service == null ? null : service.requestRemotePreference(packageName, userId, callback);
}
@Override
public IBinder asBinder() {
return service == null ? null : service.asBinder();

View File

@ -20,7 +20,7 @@ dependencies {
implementation(projects.apkzlib)
implementation(projects.share.java)
implementation("commons-io:commons-io:2.11.0")
implementation("commons-io:commons-io:2.13.0")
implementation("com.beust:jcommander:1.82")
implementation("com.google.code.gson:gson:2.10")
implementation("com.google.code.gson:gson:2.10.1")
}

View File

@ -1,17 +1,14 @@
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
pluginManagement {
val agpVersion: String by settings
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
plugins {
id("com.android.library") version agpVersion
id("com.android.application") version agpVersion
id("com.google.devtools.ksp") version "1.7.20-1.0.7"
id("dev.rikka.tools.refine") version "3.1.1"
id("com.google.devtools.ksp") version "1.8.21-1.0.11"
id("dev.rikka.tools.refine") version "4.3.0"
}
}
@ -20,6 +17,16 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
mavenLocal {
content {
includeGroup("io.github.libxposed")
}
}
}
versionCatalogs {
create("libs") {
from(files("core/gradle/libs.versions.toml"))
}
}
}

View File

@ -1,5 +1,5 @@
plugins {
id("com.android.library")
alias(libs.plugins.agp.lib)
}
android {