硕士生
 
- 金币
- 2061
- 好评
- 22
- 信誉
- 105
|
发表于
2025-9-26 07:48:06
来自手机
|
显示全部楼层
来自 四川
本帖最后由 hw1020 于 2025-9-26 10:12 编辑
山有扶苏 发表于 2025-9-26 00:08
大佬,那我要怎么跟ai说 正常说啊,你的需求是什么就怎么说。要么你用我发的那个,那个安装包里的dex2就是可以存档注入什么的,
- Lcom/unity3d/player/UnityPlayerActivity;->onCreate(Landroid/os/Bundle;)V
复制代码
这个方法里加入下面的代码,register这个后面的数字可能需要加大,比如原来那个应该是4,这里我改为了5
特别注意
然后下面的代码放入方法中的合适位置就行
- invoke-virtual {p0}, Lcom/unity3d/player/UnityPlayerActivity;->getApplicationContext()Landroid/content/Context;
-
- move-result-object v0
- #上面两行其实可以不需要直接用p0就行
- const-string v1, "sx"
- # sx为apk assets目录里的zip文件路径
- const-string v2, ""
- #这个是解压后在Android data package 目录的相对路径,为空字符串就是解压到Android data package根目录
-
- invoke-static {v0, v1, v2}, LZipReleaseUtils;->cad(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
复制代码
这个方法就是我写的将assets里的sx zip文件解压到Android data package下的根目录,上面v2为空就是根目录,不为空就是package加上v2的目录,ZipReleaseUtils类里的cadc就是会更新覆盖的的方法,原来的没有,新加的,里面还有类似的cao (释放到Android/obb/package目录下的资源文件)caoc(会更新覆盖的),还有cdd(复制到/data/data/package目录中) cddc(更新会覆盖),调用方法和上面的类似,只是方法名不一样。
寄存器可能在不同位置名称需要改变下,就是要注意不破坏原有的代码逻辑,简单来说就是反编译后的代码与插入代码前反编译的代码相差不大(增加了代码,但没有改变原有代码,比如原有代码xxx.xxx()变成了"".xxx(),或者多了什么奇奇怪怪的?,那就说明加的有问题)
比如这里原来的代码反编译后为
- protected void onCreate(Bundle bundle) {
- requestWindowFeature(1);
- super.onCreate(bundle);
- getIntent().putExtra("unity", updateUnityCommandLineArguments(getIntent().getStringExtra("unity")));
- this.mUnityPlayer = new UnityPlayer(this, this);
- setContentView((View) this.mUnityPlayer);
- this.mUnityPlayer.requestFocus();
- if (Build.VERSION.SDK_INT >= 24) {
- this.mUnityPlayer.setPointerIcon(PointerIcon.getSystemIcon(getBaseContext(), 0));
- }
- this.mUnityPlayer.setOnTouchListener(this);
- this.mUnityPlayer.setOnGenericMotionListener(this);
- }
复制代码
插入后为
- protected void onCreate(Bundle bundle) {
- requestWindowFeature(1);
- super.onCreate(bundle);
- ZipReleaseUtils.cad(getApplicationContext(), "sx", "");
- getIntent().putExtra("unity", updateUnityCommandLineArguments(getIntent().getStringExtra("unity")));
- this.mUnityPlayer = new UnityPlayer(this, this);
- setContentView((View) this.mUnityPlayer);
- this.mUnityPlayer.requestFocus();
- if (Build.VERSION.SDK_INT >= 24) {
- this.mUnityPlayer.setPointerIcon(PointerIcon.getSystemIcon(getBaseContext(), 0));
- }
- this.mUnityPlayer.setOnTouchListener(this);
- this.mUnityPlayer.setOnGenericMotionListener(this);
- }
复制代码
相当于在super后面增加了一行下面的解压文件的代码
- ZipReleaseUtils.cad(getApplicationContext(), "sx", "");
复制代码
如果register 5不够,比如原来为4,就会出错,反编译后查看你就会发现插入的代码变成了
- protected void onCreate(Bundle bundle) {
- requestWindowFeature(1);
- super.onCreate(bundle);
- ZipReleaseUtils.cad(getApplicationContext(), "sx", "");
- "".getIntent().putExtra("unity", "".updateUnityCommandLineArguments("".getIntent().getStringExtra("unity")));
- ((UnityPlayerActivity) "").mUnityPlayer = new UnityPlayer("", "");
- "".setContentView(((UnityPlayerActivity) "").mUnityPlayer);
- ((UnityPlayerActivity) "").mUnityPlayer.requestFocus();
- if (Build.VERSION.SDK_INT >= 24) {
- ((UnityPlayerActivity) "").mUnityPlayer.setPointerIcon(PointerIcon.getSystemIcon("".getBaseContext(), 0));
- }
- ((UnityPlayerActivity) "").mUnityPlayer.setOnTouchListener("");
- ((UnityPlayerActivity) "").mUnityPlayer.setOnGenericMotionListener("");
- }
复制代码
这里你就会发现里面有很多原来的代码变成了
- "".getIntent().putExtra("unity", "".updateUnityCommandLineArguments("".getIntent().getStringExtra("unity")));
复制代码
"".xxxx的。
这就是寄存器不够导致的问题(寄存器够如果意外覆盖了原来的值也可能会出现类似的问题),最后安装打开就会闪退。
我看了下bili的存档,貌似他们的直接用的一个参数的方法,按理说寄存器数量不会有问题,那多半就是你操作有问题,要么他们代码有问题(感觉可能性不大) |
|