Skip to content

Commit

Permalink
feat: 优化工具代码,简化逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
HChenX committed Jan 27, 2025
1 parent 2bf0d48 commit 45fca81
Show file tree
Hide file tree
Showing 23 changed files with 348 additions and 312 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ afterEvaluate {
groupId = 'com.github.HChenX'
artifactId = 'HookTool'
version = defVersion

artifact androidSourcesJar
}
}
Expand Down
6 changes: 5 additions & 1 deletion app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@

-keep class * extends com.hchen.hooktool.BaseHC
-keep class com.hchen.hooktool.HCEntrance
-keep class com.hchen.hooktool.HCState
-keep class com.hchen.hooktool.HCState {
static boolean isEnabled;
static java.lang.String mFramework;
static int mVersion;
}
15 changes: 10 additions & 5 deletions app/src/main/java/com/hchen/hooktool/BaseHC.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ protected void onApplicationAfter(Context context) {
}

/**
* 发生崩溃时回调,不要在这里继续执行 hook 逻辑
* 发生崩溃时回调,可用于清理操作;不要在这里继续执行 hook 或可能引发崩溃的逻辑
*/
protected void onThrowable(Throwable throwable) {
}
Expand Down Expand Up @@ -128,11 +128,16 @@ final public void onClassLoader(ClassLoader classLoader) {

// Hook Application
final public BaseHC onApplicationCreate() {
if (!enabled()) return this;
try {
if (!enabled()) return this;

if (!mIApplications.contains(this))
mIApplications.add(this);
initApplicationHook();
if (!mIApplications.contains(this))
mIApplications.add(this);
initApplicationHook();
} catch (Throwable e) {
onThrowable(e);
logE(TAG, "Waring! can't hook application!!", e);
}
return this;
}

Expand Down
9 changes: 4 additions & 5 deletions app/src/main/java/com/hchen/hooktool/HCEntrance.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,18 @@ public void onInitZygote(StartupParam startupParam) throws Throwable {
* <p>
* Tip: 因为传入的 lpparam 偶尔会被其他系统应用干扰,所以可以配置排除名单。
*/
public String[] ignoreList() {
public String[] ignorePackageNameList() {
return null;
}

@Override
public final void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (ignoreList() != null) {
if (Arrays.stream(ignoreList()).anyMatch(s -> Objects.equals(s, lpparam.packageName)))
if (ignorePackageNameList() != null) {
if (Arrays.stream(ignorePackageNameList()).anyMatch(s -> Objects.equals(s, lpparam.packageName)))
return;
}

if (HCData.getModulePackageName() != null && !HCData.getModulePackageName().isEmpty()
&& Objects.equals(HCData.getModulePackageName(), lpparam.packageName)) {
if (HCData.getModulePackageName() != null && Objects.equals(HCData.getModulePackageName(), lpparam.packageName)) {
initHCState();
}

Expand Down
12 changes: 6 additions & 6 deletions app/src/main/java/com/hchen/hooktool/HCInit.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ public final class HCInit {
// ------- END --------------

@IntDef(value = {
LOG_NONE,
LOG_I,
LOG_W,
LOG_E,
LOG_D
LOG_NONE,
LOG_I,
LOG_W,
LOG_E,
LOG_D
})
@Retention(RetentionPolicy.SOURCE)
private @interface LogLevel {
Expand Down Expand Up @@ -144,7 +144,7 @@ public BasicData setModulePackageName(@NonNull String modulePackageName) {
}

// 设置日志 TAG。Tip: 建议设置。
public BasicData setTag(String tag) {
public BasicData setTag(@NonNull String tag) {
this.tag = tag;
return this;
}
Expand Down
8 changes: 6 additions & 2 deletions app/src/main/java/com/hchen/hooktool/HCState.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,12 @@
* <p>
* 记得配置混淆,否则不可用:
* <p>
* {@code
* -keep class com.hchen.hooktool.HCState
* <pre>{@code
* -keep class com.hchen.hooktool.HCState {
* static boolean isEnabled;
* static java.lang.String mFramework;
* static int mVersion;
* }
* }
*
* @author 焕晨HChen
Expand Down
48 changes: 24 additions & 24 deletions app/src/main/java/com/hchen/hooktool/ToolTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,23 @@ public void initZygote(IXposedHookZygoteInit.StartupParam startupParam) {
public void init() {
// 链式
chain("com.hchen.demo", method("test")
.hook(new IHook() {
@Override
public void before() {
super.before();
}
})

.method("test1", String.class)
.hook(new IHook() {
@Override
public void after() {
super.after();
}
})

.constructor()
.returnResult(false)
.hook(new IHook() {
@Override
public void before() {
super.before();
}
})

.method("test1", String.class)
.hook(new IHook() {
@Override
public void after() {
super.after();
}
})

.constructor()
.returnResult(false)
);

hookMethod("com.hchen.demo", "test", new IHook() {
Expand Down Expand Up @@ -132,13 +132,13 @@ private static class InitHook extends HCEntrance {
@Override
public HCInit.BasicData initHC(HCInit.BasicData basicData) {
return basicData.setTag("HookTool")
.setLogLevel(HCInit.LOG_D)
.setModulePackageName("com.hchen.demo")
.setPrefsName("myprefs") // 可选
.xPrefsAutoReload(true) // 可选
.initLogExpand(new String[]{
"com.hchen.demo.hook"
});
.setLogLevel(HCInit.LOG_D)
.setModulePackageName("com.hchen.demo")
.setPrefsName("myprefs") // 可选
.xPrefsAutoReload(true) // 可选
.initLogExpand(new String[]{
"com.hchen.demo.hook"
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public static Class<?>[] arrayToClass(ClassLoader classLoader, Object... objs) {
if (o instanceof Class<?> c) {
classes.add(c);
} else if (o instanceof String s) {
Class<?> ct = findClass(s, classLoader).get();
Class<?> ct = findClass(s, classLoader);
if (ct == null) return null;
classes.add(ct);
} else if (o instanceof IHook) {
Expand Down
28 changes: 10 additions & 18 deletions app/src/main/java/com/hchen/hooktool/helper/TryHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
import static com.hchen.hooktool.log.LogExpand.getTag;
import static com.hchen.hooktool.log.XposedLog.logE;

import com.hchen.hooktool.tool.SingleMember;

/**
* 方法执行与异常处理类
*
Expand All @@ -36,13 +34,6 @@ public static <V> Result<V> run(Run<V> supplier) {
return new Result<>(supplier);
}

/*
* 执行并储存执行的结果与抛错。
* */
public static <V> SingleMember<V> createSingleMember(Run<V> supplier) {
return new Result<>(supplier).create();
}

/*
* 简单的执行代码并获取返回值,与此同时主动抛出可能的异常。
*/
Expand Down Expand Up @@ -71,10 +62,6 @@ private void doRun(Run<V> supplier) {
}
}

private SingleMember<V> create() {
return new SingleMember<V>(mResult, mThrowable);
}

// 获取执行结果
public V get() {
return mResult;
Expand All @@ -86,14 +73,19 @@ public V or(V or) {
return or;
}

// 获取抛错
public Throwable getThrowable() {
return mThrowable;
}

// 如果失败返回指定 or 值,并执行异常回调
public V orErr(V or, Err err) {
public V orError(V or, Error error) {
if (isSuccess) return mResult;
err.err(mThrowable);
error.error(mThrowable);
return or;
}

public V orErrMag(V or, String msg) {
public V orErrorMag(V or, String msg) {
if (isSuccess) return mResult;
logE(getTag(), msg, mThrowable);
return or;
Expand All @@ -108,8 +100,8 @@ public boolean isFailed() {
return !isSuccess;
}

public interface Err {
void err(Throwable throwable);
public interface Error {
void error(Throwable throwable);
}
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/hchen/hooktool/hook/IHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

/**
* Hook 动作接口
*
*
* @author 焕晨HChen
*/
public abstract class IHook extends ParamTool {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/hchen/hooktool/log/AndroidLog.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

/**
* 安卓日志
*
*
* @author 焕晨HChen
*/
public final class AndroidLog {
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/java/com/hchen/hooktool/log/LogExpand.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ public void accept(StackTraceElement stackTraceElement) {
String field = stackTraceElement.getFileName();
int line = stackTraceElement.getLineNumber();
stringBuilder.append("\nat ").append(clazz).append(".")
.append(method).append("(")
.append(field).append(":")
.append(line).append(")");
.append(method).append("(")
.append(field).append(":")
.append(line).append(")");
}
});
return stringBuilder.toString();
Expand Down Expand Up @@ -145,7 +145,7 @@ public void detailedLogs() {
StringBuilder log = new StringBuilder();
for (int i = 0; i < param.args.length; i++) {
log.append(" (").append(param.args[i] == null ? "null" : param.args[i].getClass().getSimpleName())
.append(")->").append("[").append(paramToString(param.args[i])).append("]\n");
.append(")->").append("[").append(paramToString(param.args[i])).append("]\n");
}
logI(TAG, "Method called! Class: [" + className + "], Method: [" + methodName + "]\nParam: {\n" + log + "}");
}
Expand Down
18 changes: 9 additions & 9 deletions app/src/main/java/com/hchen/hooktool/tool/ChainTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ public ChainTool() {
}

public static void chain(String clazz, ChainTool chain) {
chain.doFind(findClass(clazz).get());
chain.doFind(findClass(clazz));
}

public static void chain(String clazz, ClassLoader classLoader, ChainTool chain) {
chain.doFind(findClass(clazz, classLoader).get());
chain.doFind(findClass(clazz, classLoader));
}

public static void chain(Class<?> clazz, ChainTool chain) {
Expand Down Expand Up @@ -137,19 +137,19 @@ private void doFind(Class<?> clazz) {
case TYPE_METHOD -> {
if (cacheData.mCheckExist)
if (!existsMethod(clazz, cacheData.mName, cacheData.mParams)) continue;
members.add(new ChainData(findMethod(clazz, cacheData.mName, cacheData.mParams).get()));
members.add(new ChainData(findMethod(clazz, cacheData.mName, cacheData.mParams)));
}
case TYPE_CONSTRUCTOR -> {
if (cacheData.mCheckExist)
if (!existsConstructor(clazz, cacheData.mParams)) continue;
members.add(new ChainData(findConstructor(clazz, cacheData.mParams).get()));
members.add(new ChainData(findConstructor(clazz, cacheData.mParams)));
}
case TYPE_ANY_METHOD ->
members.addAll(Arrays.stream(CoreTool.findAllMethod(clazz, cacheData.mName)).map(
ChainData::new).collect(Collectors.toCollection(ArrayList::new)));
members.addAll(Arrays.stream(CoreTool.findAllMethod(clazz, cacheData.mName)).map(
ChainData::new).collect(Collectors.toCollection(ArrayList::new)));
case TYPE_ANY_CONSTRUCTOR ->
members.addAll(Arrays.stream(CoreTool.findAllConstructor(clazz)).map(
ChainData::new).collect(Collectors.toCollection(ArrayList::new)));
members.addAll(Arrays.stream(CoreTool.findAllConstructor(clazz)).map(
ChainData::new).collect(Collectors.toCollection(ArrayList::new)));
default -> {
logW(getTag(), "Unknown type: " + cacheData.mType + getStackTrace());
members.clear();
Expand All @@ -164,7 +164,7 @@ private void doFind(Class<?> clazz) {
if (memberData.member == null || existingMembers.contains(memberData.member)) {
iterator.remove();
logW(getTag(), "This member maybe repeated or maybe is null, will remove it! " +
"\ndebug: " + UUID + "#member: " + memberData.member);
"\ndebug: " + UUID + "#member: " + memberData.member);
continue;
}
existingMembers.add(memberData.member);
Expand Down
Loading

0 comments on commit 45fca81

Please sign in to comment.