FakerAndroid 项目实操

针对Unity开发的工程
FakerAndroid基本使用说明:https://github.com/Efaker/FakerAndroid/blob/main/CHINESE.md

针对il2cpp打包的Unity工程
首先将apk和FakerAndroid.jar 放在同一个目录

  1. 将apk反编译成Android Studio工程

    //语法 
    //java -jar FakerAndroid.jar fk <apkpath> -o <outdir>
    java -jar FakerAndroid.jar fk game.apk -o game
    

在这里插入图片描述

  1. 使用Android Studio打开工程,将启动Activity替换成FakerActivity

  2. 在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);
    }
    
  3. FakerActivity里面处理OnFrame事件

    //Hook之后会调用onJniCall事件,onJniCall将事件转换到了主线程的callJava里面去
    //所以此时我们可以在FakerActivity的callJava添加代码处理逻辑
    
    private void callJava(String msg){
    	if(msg.equals("OnFrame")){
    		//do smothing
    	}
    }
    
  4. 将事件处理结果回调到native-lib里面去(如果需要的话)

    //这里可以参照FakerAndroid的registerCallBack事件,添加自己的事件
    
  5. 添加自己的Activity,这个过程和正常开发Android Studio逻辑一模一样,就不讲解了。

    在这里插入图片描述

  6. app\src\main\jniLibs目录可以查看游戏支持的cpu架构和加载的so,app\libs可以查看依赖的aar和jar

  7. 编译生成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));
//}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值