针对Unity开发的工程
FakerAndroid基本使用说明:https://github.com/Efaker/FakerAndroid/blob/main/CHINESE.md
针对il2cpp打包的Unity工程
首先将apk和FakerAndroid.jar 放在同一个目录
-
将apk反编译成Android Studio工程
//语法 //java -jar FakerAndroid.jar fk <apkpath> -o <outdir> java -jar FakerAndroid.jar fk game.apk -o game
-
使用Android Studio打开工程,将启动Activity替换成FakerActivity
-
在src\cpp目录下打开native-lib添加hook通知事件(通常需要hook的事件在
il2cpp-functions.h
)//例如捕捉游戏帧事件 Java_com_faker_android_FakerApp_fakeApp(JNIEnv *env, jobject thiz, jobject application) { ... init_il2cpp(base); ... fakeCpp((void*)UISystemProfilerApi_BeginSample, (void*)hook_UISystemProfilerApi_BeginSample, reinterpret_cast<void**>(&UISystemProfilerApi_BeginSample)); } //步骤到游戏帧事件之后,调用callJava("OnFrame")通知FakerActivity //callJava 工具已经帮忙实现了,callJava 内部调用FakerActivity的onJniCall函数 void hook_UISystemProfilerApi_BeginSample(void* __this, UISystemProfilerApi_SampleType__Enum type, MethodInfo* method) { static auto tick = GetTickCount(); if (GetTickCount() - tick > 1000) { callJava("OnFrame"); tick = GetTickCount(); } return UISystemProfilerApi_BeginSample(__this, type,0); }
-
FakerActivity里面处理OnFrame事件
//Hook之后会调用onJniCall事件,onJniCall将事件转换到了主线程的callJava里面去 //所以此时我们可以在FakerActivity的callJava添加代码处理逻辑 private void callJava(String msg){ if(msg.equals("OnFrame")){ //do smothing } }
-
将事件处理结果回调到native-lib里面去(如果需要的话)
//这里可以参照FakerAndroid的registerCallBack事件,添加自己的事件
-
添加自己的Activity,这个过程和正常开发Android Studio逻辑一模一样,就不讲解了。
-
app\src\main\jniLibs
目录可以查看游戏支持的cpu架构和加载的so,app\libs
可以查看依赖的aar和jar -
编译生成apk即可
针对MONO打包的Unity工程
此时通过上述步骤我们发现cpp的目录结构少了很多头文件,只有简单的一个faker.h,通过上述hook方法貌似行不通,此时只能重新编译处理mono脚本Assembly-CSharp.dll
。
使用工具dnspy打开Assembly-CSharp.dll
找到关键点并且修改,右键编辑类-》编译,之后保存模块就行
Mono和Android通信,依然采用上述方法调用Android层的onJniCall
mono调用Android中Activity的方法
private static AndroidJavaClass _androidJavaClass;
public static void callAndroid(string msg)
{
if (GameManager._androidJavaClass == null)
{
GameManager._androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
}
GameManager._androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity").Call("onJniCall", new object[]
{
msg
});
}
Android调用mono方法
public static void addCurrency(int addCurrency){
UnityPlayer.UnitySendMessage("GameManager", "AddCurrency",String.valueOf(addCurrency));
}
//其中AddCurrency为GameManager中的方法,非静态方法
//public void AddCurrency(string msg)
//{
// CurrencyManager.AddCurrency(int.Parse(msg));
//}