🪝

libxposed の導入方法

2024/11/09に公開

あくまでも移植の準備だけ。
詳しいやり方は、下記を参照してね。
https://github.com/LSPosed/LSPosed/wiki/Develop-Xposed-Modules-Using-Modern-Xposed-API

依存関係のビルド

概要

Maven や Google には公開されていないので、ローカルでビルドする必要があります。
これを Gradle プロジェクトから使うとき、2つの手段があります。

  1. mavenLocal() を使用し、ローカルディスクから参照
  2. ビルドアーティファクトの AAR を使用

常に最新版を使いたいなら前者、手間を省きたい場合は後者と言う考えで良いと思います。

ビルド方法

ライブラリには、

  • api
  • service
  • interface
  • helper
  • helper-ktx

これら5つがあります。

なんかLSPosedの開発者の一人が余りにも杜撰なので、メジャーな更新が来るまでは、僕のリポジトリを載せておきます。
変更内容としては、Gradleと依存関係の更新のみです。

api

bash
git clone git@github.com:s1204IT/libxposed-api --de 1
./gradlew :api:publishApiPublicationToMavenLocal

service

bash
git clone git@github.com:s1204IT/libxposed/s-ervice --de 1
./gradlew :interface:publishInterfacePublicationToMavenLocal
./gradlew :service:publishServicePublicationToMavenLocal

helper

bash
git clone git@github.com:s1204IT/libxposed-helper --de 1
./gradlew :helper:publishHelperPublicationToMavenLocal
./gradlew :helper-ktx:publishHelperKtxPublicationToMavenLocal

使用方法

MavenLocal の場合

settings.gradle
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        mavenLocal {
            content {
                includeGroup("io.github.libxposed")
            }
        }
    }
}
app/build.gradle
dependencies {
    compileOnly 'io.github.libxposed:api:100'
    implementation 'io.github.libxposed:interface:100'
    implementation 'io.github.libxposed:service:100-1.0.0'
    implementation 'io.github.libxposed:helper:100.0.1'
}

Kotlin の場合は、helperhelper-ktx にしてください。

AAR ファイル形式の場合

全てのライブラリをビルドした後、

bash
mkdir -p app/libxposed/
find ~/.m2/repository/io/github/libxposed/ -name "*.aar" -exec cp {} app/libxposed/ \;
app/build.gradle
dependencies {
    compileOnly files('libxposed/api-100.aar')
    implementation files('libxposed/interface-100.aar')
    implementation files('libxposed/service-100-1.0.0.aar')
    implementation files('libxposed/helper-100.0.1.aar')
}

Kotlin の場合は、helperhelper-ktx にしてください。
もしくは、

app/build.gradle
dependencies {
    implementation fileTree(dir: "libxposed", includes: ['*.aar'])
}

APKの容量を特に気にしないのであれば、こっちでも良いと思います。
もっとファイルの容量を気にするのであれば、AAR ファイル内の classes.jar のみを使うと良いです。

ファイルのセットアップ

メタデータとか、xposed_init が変わります。

Java エントリー

旧:app/src/main/assets/xposed_init
新:app/src/main/resources/META-INF/xposed/java_init.list
中身は変わらないです。

ネイティブエントリー

app/src/main/resources/META-INF/xposed/native_init.list
lib**.soを書きます。

フック対象パッケージ

旧:app/src/main/AndroidManifest.xml内のmanifest.meta-data.xposedscope
新:app/src/main/resources/META-INF/xposed/scope.list
中身は変わらないです。

モジュールの概要(説明)

旧:app/src/main/AndroidManifest.xml内のmanifest.meta-data:xposeddescription
新:app/src/main/AndroidManifest.xml内のmanifest.application.android:description
今までは直書きでも出来ましたが、リソース使った方が良いです。

モジュール構成

主にフレームワークのバージョン情報と、指定したフック対象パッケージ以外にスコープ出来るようにするかの設定ファイルです。

app/src/main/resources/META-INF/xposed/module.prop
minApiVersion=100
targetApiVersion=100
staticScope=true

ApiVersion に関しては、libxposed の API バージョンです。これは任意。
staticScope は必須で、意味合いは前述した通り。

ProGuard

これ忘れるとめっちゃダルいのでやってください。

# Xposed
-adaptresourcefilecontents META-INF/xposed/java_init.list
-keepattributes RuntimeVisibleAnnotations

-keep,allowobfuscation,allowoptimization public class * extends io.github.libxposed.api.XposedModule {
    public <init>(...);
    public void onPackageLoaded(...);
    public void onSystemServerLoaded(...);
}
-keep,allowoptimization,allowobfuscation @io.github.libxposed.api.annotations.* class * {
    @io.github.libxposed.api.annotations.BeforeInvocation <methods>;
    @io.github.libxposed.api.annotations.AfterInvocation <methods>;
}
-keep,allowshrinking,allowoptimization,allowobfuscation class ** implements io.github.libxposed.api.XposedInterface$Hooker
-keepclassmembers,allowoptimization class ** implements io.github.libxposed.api.XposedInterface$Hooker {
    public *** before(***);
    public *** after(***);
    public static *** before();
    public static *** before(io.github.libxposed.api.XposedInterface$BeforeHookCallback);
    public static void after();
    public static void after(io.github.libxposed.api.XposedInterface$AfterHookCallback);
    public static void after(io.github.libxposed.api.XposedInterface$AfterHookCallback, ***);
}

# Kotlin
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
	public static void check*(...);
	public static void throw*(...);
}
-assumenosideeffects class java.util.Objects {
    public static ** requireNonNull(...);
}

# Strip debug log
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
}

# Obfuscation
-repackageclasses
-allowaccessmodification

まぁまぁ長いです。
でもちゃんと設定してください。
忘れずに build.gradle にも書いておきましょう。

app/build.gradle
android {
    defaultConfig {
        proguardRules += 'proguard-rules.pro'
    }
}

Java の移植

ここまで済んだら、Java の移植が可能です。
後は各自で頑張ってください🎉

とりあえず、旧版の Xposed (de.robv.android.xposed) との併用は無理なので、まず、完全に Java のコードを移植しきり、その後にマニフェストやアセットの残骸を消しましょう。

Discussion