libxposed の導入方法
あくまでも移植の準備だけ。
詳しいやり方は、下記を参照してね。
https://github.com/LSPosed/LSPosed/wiki/Develop-Xposed-Modules-Using-Modern-Xposed-API
依存関係のビルド
概要
Maven や Google には公開されていないので、ローカルでビルドする必要があります。
これを Gradle プロジェクトから使うとき、2つの手段があります。
-
mavenLocal()
を使用し、ローカルディスクから参照 - ビルドアーティファクトの AAR を使用
常に最新版を使いたいなら前者、手間を省きたい場合は後者と言う考えで良いと思います。
ビルド方法
ライブラリには、
- api
- service
- interface
- helper
- helper-ktx
これら5つがあります。
なんかLSPosedの開発者の一人が余りにも杜撰なので、メジャーな更新が来るまでは、僕のリポジトリを載せておきます。
変更内容としては、Gradleと依存関係の更新のみです。
api
git clone git@github.com:s1204IT/libxposed-api --de 1
./gradlew :api:publishApiPublicationToMavenLocal
service
git clone git@github.com:s1204IT/libxposed/s-ervice --de 1
./gradlew :interface:publishInterfacePublicationToMavenLocal
./gradlew :service:publishServicePublicationToMavenLocal
helper
git clone git@github.com:s1204IT/libxposed-helper --de 1
./gradlew :helper:publishHelperPublicationToMavenLocal
./gradlew :helper-ktx:publishHelperKtxPublicationToMavenLocal
使用方法
MavenLocal の場合
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
mavenLocal {
content {
includeGroup("io.github.libxposed")
}
}
}
}
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 の場合は、helper
を helper-ktx
にしてください。
AAR ファイル形式の場合
全てのライブラリをビルドした後、
mkdir -p app/libxposed/
find ~/.m2/repository/io/github/libxposed/ -name "*.aar" -exec cp {} app/libxposed/ \;
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 の場合は、helper
を helper-ktx
にしてください。
もしくは、
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
今までは直書きでも出来ましたが、リソース使った方が良いです。
モジュール構成
主にフレームワークのバージョン情報と、指定したフック対象パッケージ以外にスコープ出来るようにするかの設定ファイルです。
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
にも書いておきましょう。
android {
defaultConfig {
proguardRules += 'proguard-rules.pro'
}
}
Java の移植
ここまで済んだら、Java の移植が可能です。
後は各自で頑張ってください🎉
とりあえず、旧版の Xposed (de.robv.android.xposed
) との併用は無理なので、まず、完全に Java のコードを移植しきり、その後にマニフェストやアセットの残骸を消しましょう。
Discussion