Skip to main content

7 posts tagged with "脚本开发"

View All Tags

· 2 min read
老陈

我们在脚本开发中, 尤其是游戏以及混合应用的开发中, 有些app无法进行截图与控件拉取, 无论我们使用root权限还是无障碍, 我们可以使用xp插件进行解决.

解除截图限制

private const val windowCls = "android.view.Window"

XposedHelpers.findAndHookMethod(
ClassGetter.findClass(windowCls),
"setFlags",
Int::class.java,
Int::class.java,
object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
val flag = param.args[0] as Int
if (flag and 8192 != 0) {
param.args[0] = flag and 8192.inv()
LogUtil.print("绕过截图限制")
}

val mask = param.args[1] as Int
if (mask and 8192 != 0) {
param.args[1] = flag and 8192.inv()
}
}
}
)

禁用腾讯x5浏览器套间, 强制使用原生webview

国内很多app使用腾讯x5浏览器套件, 但是很可能会导致无法拉取控件, 从而无法获取控件上的文本以及按钮位置

XposedBridge.hookAllMethods(
ClassGetter.findClass("com.tencent.smtt.sdk.QbSdk"),
"isX5DisabledSync",
object : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
param.result = true
LogUtil.print("禁用x5——1")
}
})

XposedBridge.hookAllMethods(
ClassGetter.findClass("com.tencent.smtt.sdk.QbSdk"),
"getIsInitX5Environment",
object : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
param.result = false
LogUtil.print("禁用x5——2")
}
})

· 2 min read
老陈

想要在安卓中改机, 最核心的是我们要做到改变几个系统属性值(prop)

我们在安装了magisk后, magisk给我们提供了resetprop的二进制文件

执行如下shell代码, 我们将机型改为红米 k60 pro

resetprop ro.product.manufacturer Xiaomi
resetprop ro.product.brand Redmi
resetprop ro.product.model 22127RK46C
resetprop ro.product.device socrates
resetprop ro.build.product socrates

我们也可以使用Yyds.Auto中的shell代码执行以上命令

执行以上代码后, 我们可以打开设备信息应用进行测试, 查看是否变更机型成功, 这时候我们发现, 改机是没有变化的

那是因为我们的安卓进程都是从克隆出来的, 系统属性已经被读取过了, 我们需要软重启所有安卓进程, 重新读取即可.

killall zygote

当然我们可以使用xposed等方法进行局部刷新修改, 注入以下java代码进行刷新

// yydsxx.com
public class ReflectUtil {
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);

Field modifiersField = Field.class.getDeclaredField("accessFlags");
modifiersField.setAccessible(true);
int originModifier = field.getModifiers();
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
modifiersField.setInt(field, originModifier);
}
}

public class DeviceUtil {
public static String sysProperty(String key, String defValue) {
String res = null;
try {
@SuppressLint("PrivateApi") Class<?> clazz = Class.forName("android.os.SystemProperties");
Method method = clazz.getMethod("get", new Class<?>[]{String.class, String.class});
res = (String) method.invoke(clazz, new Object[]{key, defValue});
if (res == null || res.isEmpty()) {
return defValue;
}
} catch (Exception e) {
LogUtil.print("System property invoke error: " + e);
}
return res;
}
}

ReflectUtil.setFinalStatic(Build::class.java.getField("MANUFACTURER"), DeviceUtil.sysProperty("ro.product.manufacturer", Build.MANUFACTURER))
ReflectUtil.setFinalStatic(Build::class.java.getField("BRAND"), DeviceUtil.sysProperty("ro.product.brand", Build.BRAND))
ReflectUtil.setFinalStatic(Build::class.java.getField("MODEL"), DeviceUtil.sysProperty("ro.product.model", Build.MODEL))
ReflectUtil.setFinalStatic(Build::class.java.getField("DEVICE"), DeviceUtil.sysProperty("ro.product.device", Build.DEVICE))
ReflectUtil.setFinalStatic(Build::class.java.getField("PRODUCT"), DeviceUtil.sysProperty("ro.product.name", Build.PRODUCT))
ReflectUtil.setFinalStatic(Build::class.java.getField("FINGERPRINT"), DeviceUtil.sysProperty("ro.build.fingerprint", Build.FINGERPRINT))
ReflectUtil.setFinalStatic(Build.VERSION::class.java.getField("SDK_INT"), DeviceUtil.sysProperty("ro.build.version.sdk", Build.VERSION.SDK_INT.toString()).toInt())
ReflectUtil.setFinalStatic(Build.VERSION::class.java.getField("INCREMENTAL"), DeviceUtil.sysProperty("ro.build.version.incremental", Build.VERSION.INCREMENTAL))
ReflectUtil.setFinalStatic(Build.VERSION::class.java.getField("RELEASE"), DeviceUtil.sysProperty("ro.build.version.release", Build.VERSION.RELEASE))
ReflectUtil.setFinalStatic(Build.VERSION::class.java.getField("SECURITY_PATCH"), DeviceUtil.sysProperty("ro.build.version.security_patch", Build.VERSION.SECURITY_PATCH))

· One min read
老陈

以下操作需要root权限

清理无用文件

为了提高备份速度, 我们先把微信的一些日志, 更新文件, 小程序, 视频号, web缓存给删掉

rm -rf /data/data/com.tencent.mm/MicroMsg/CheckResUpdate/*
rm -rf /data/data/com.tencent.mm/MicroMsg/appbrand/*
rm -rf /data/data/com.tencent.mm/MicroMsg/webview_tmpl/*
rm -rf /data/data/com.tencent.mm/MicroMsg/luckymoney/*
rm -rf /data/data/com.tencent.mm/app_x*
rm -rf /data/data/com.tencent.mm/tinker
rm -rf /data/data/com.tencent.mm/files/public/*
rm -rf /data/data/com.tencent.mm/files/XNetLib/*
rm -rf /data/data/com.tencent.mm/files/xlog
rm -rf /data/data/com.tencent.mm/files/app_xwalkplugin/*
rm -rf /data/data/com.tencent.mm/cache/*/finder
rm -rf /data/data/com.tencent.mm/cache/*/live

执行备份命令

执行以下命令, 备份并压缩数据到/scdard/mm.tar.gz

tar -zhpcf /sdcard/mm.tar.gz data/user/0/com.tencent.mm

执行还原命令

第一步我们需要微信app的uid, 以正确恢复文件权限

dumpsys package com.tencent.mm | grep userId

输出:userId=10249

chdir /
# 清空现有数据
am force-stop com.tencent.mm
pm clear com.tencent.mm
# 释放备份文件
tar -zxf /sdcard/mm.tar.gz
# 文件权限修复
chown -R 10249:10249 /data/user/0/com.tencent.mm

· One min read
老陈
键码值对照
0KEYCODE_UNKNOWN
1KEYCODE_MENU
2KEYCODE_SOFT_RIGHT
3KEYCODE_HOME
4KEYCODE_BACK
5KEYCODE_CALL
6KEYCODE_ENDCALL
7KEYCODE_0
8KEYCODE_1
9KEYCODE_2
10KEYCODE_3
11KEYCODE_4
12KEYCODE_5
13KEYCODE_6
14KEYCODE_7
15KEYCODE_8
16KEYCODE_9
17KEYCODE_STAR
18KEYCODE_POUND
19KEYCODE_DPAD_UP
20KEYCODE_DPAD_DOWN
21KEYCODE_DPAD_LEFT
22KEYCODE_DPAD_RIGHT
23KEYCODE_DPAD_CENTER
24KEYCODE_VOLUME_UP
25KEYCODE_VOLUME_DOWN
26KEYCODE_POWER
27KEYCODE_CAMERA
28KEYCODE_CLEAR
29KEYCODE_A
30KEYCODE_B
31KEYCODE_C
32KEYCODE_D
33KEYCODE_E
34KEYCODE_F
35KEYCODE_G
36KEYCODE_H
37KEYCODE_I
38KEYCODE_J
39KEYCODE_K
40KEYCODE_L
41KEYCODE_M
42KEYCODE_N
43KEYCODE_O
44KEYCODE_P
45KEYCODE_Q
46KEYCODE_R
47KEYCODE_S
48KEYCODE_T
49KEYCODE_U
50KEYCODE_V
51KEYCODE_W
52KEYCODE_X
53KEYCODE_Y
54KEYCODE_Z
55KEYCODE_COMMA
56KEYCODE_PERIOD
57KEYCODE_ALT_LEFT
58KEYCODE_ALT_RIGHT
59KEYCODE_SHIFT_LEFT
60KEYCODE_SHIFT_RIGHT
61KEYCODE_TAB
62KEYCODE_SPACE
63KEYCODE_SYM
64KEYCODE_EXPLORER
65KEYCODE_ENVELOPE
66KEYCODE_ENTER
67KEYCODE_DEL
68KEYCODE_GRAVE
69KEYCODE_MINUS
70KEYCODE_EQUALS
71KEYCODE_LEFT_BRACKET
72KEYCODE_RIGHT_BRACKET
73KEYCODE_BACKSLASH
74KEYCODE_SEMICOLON
75KEYCODE_APOSTROPHE
76KEYCODE_SLASH
77KEYCODE_AT
78KEYCODE_NUM
79KEYCODE_HEADSETHOOK
80KEYCODE_FOCUS
81KEYCODE_PLUS
82KEYCODE_MENU
83KEYCODE_NOTIFICATION
84KEYCODE_SEARCH
85TAG_LAST_KEYCODE

· 2 min read
老陈

什么是ADB?

ADB全称为Android Debug Bridge, 起到调试桥的作用, 是一个客户端-服务器端程序。其中客户端是用来操作的电脑, 服务端是Android设备。 ADB也是Android SDK中的一个工具, 可以直接操作管理Android模拟器或者真实的Android设备。

为什么要用ADB?

ADB可以直接操作管理手机模拟器或者真实的手机设备(如华为手机)。它的主要功能有:

运行设备的shell(命令行) 管理模拟器或设备的端口映射 计算机和设备之间上传/下载文件 可以对设备的应用进行卸载安装等 在App遇到ANR/Crash等bug时, 可以通过ADB来抓取日志 简而言之, ADB就是连接Android手机与PC端的桥梁, 可以让用户在电脑上对手机进行全面的操作!

整理学习

  • 获取root权限 su

  • 安装包, 不提示adb安装

adb push /Users/caz/yyds_native/app/build/outputs/apk/debug/com.yyds.auto-debug.apk  /data/local/tmp/1.apk && adb shell su -c pm install /data/local/tmp/1.apk
  • 发送文件 adb push

  • 获取文件 adb pull

  • 查看所有系统属性 getprop

  • 写入创建文件 echo 1 > /sdcard

  • 重定向错误流到输出流 echo $a 2&>1

  • 复制文件 cp -rf /sdcard/1 /sdcard/2

  • 移动文件 mv -f /sdcard/1 /sdcard/2

  • 查看文件 cat /sdcard/1.txt

  • 查找文件 find -type f "yyds*"

  • 查找包含某字符串的文件 find -type f "yyds*" | xargs -ril hello

· 6 min read
老陈

Android系统中有众多的系统服务, 其中有三大核心服务:ActivityManagerService、WindowManagerService、PackageManagerService。

系统服务一览表:

1.ActivityManagerService

Android framework框架核心服务, 管理整个框架中任务、进程管理, Intent解析等的核心实现, 管理四大组建的生命周期。

2.WindowManagerService

Android framework框架核心服务, 窗口管理服务。

3.PackageManagerService

Android framework框架核心服务, 用于APK的解析、权限验证、安装等。

4.AccountManagerService

Android账户服务, 提供了对账户、密码、授权的集中管理。

5.AccessibilityManagerService

辅助管理程序截获所有的用户输入, 并根据这些输入给用户一些额外的反馈, 起到辅助的效果, View的点击、焦点等事件分发管理服。

6.AlarmManagerService

提供闹铃和定时器等功能。

7.AppWidgetService

Android中提供Widget的管理和相关服务

8.AssetAtlasService

负责将预加载的bitmap组装成纹理贴图, 生成的纹理贴图可以被用来跨进程使用, 以减少内存。

9.AudioService

AudioFlinger的上层管理封装, 主要是音量、音效、声道及铃声等的管理。

10.BackupManagerService

备份服务。

11.BatteryService

负责监控电池的充电状态、电池电量、电压、温度等信息, 当电池信息发生变化时, 发生广播通知其他关系电池信息的进程和服务。

12.BluetoothManagerService

负责蓝牙后台管理和服务。

13.ClipboardService

剪贴板服务。

14.CommonTimeManagementService

管理本地常见的时间服务的配置, 在网络配置变化时重新配置本地服务。

15.ConnectivityService

网络连接状态服务。

16.ContentService

内容服务, 主要是数据库等提供解决方法的服务。

17.ConsumerIrService

远程控制, 通过红外等控制周围的设备(例如电视等)

18.CountryDetectorService

检测用户国家

19.DevicePolicyManagerService

提供一些系统级别的设置及属性

20.DiskStatsService

磁盘统计服务, 供dumpsys使用

21.DisplayManagerService

用于管理全局显示生命周期, 决定在已连接的物理设备如何配置逻辑显示, 并且通知系统和应用状态的改变。

22.DreamManagerService

屏幕保护。

23.DropBoxManagerService

用于系统运行时日志的存储于管理。

24.IdleMaintenanceService

用于观察设备状态, 在设备空闲时执行维护任务。将一些比较耗时的代价比较高的任务放到设备空闲时执行, 这样保证用户的体验。

25.InputManagerService

以前在WindowManagerService中, 现在独立了出来, 用户处理事件分发。

26.InputMethodManagerService

输入法服务, 打开和关闭输入法。

27.LightsService

光感应传感器服务。

28.LocationManagerService

位置服务, GPS、定位等。

29.LockSettingsService

和锁屏界面中的输入密码, 手势等安全功能有关。可以保存每个user的相关锁屏信息。

30.WallpaperManagerService

壁纸管理服务。

31.MountService

磁盘加载服务程序, 一般要和一个linux daemon程序如vold/mountd等合作起作用, 主要负责监听并广播device的mount/unmount/badremoval等等事件。

32.NetworkManagementService

网络管理服务。ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能。ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务, 实现与网络接口的交互及信息读取。

33.NetworkPolicyManagerService

维护网络使用策略。

34.NetworkStatsService

网络统计相关。

35.NetworkTimeUpdateService

监视网络时间, 当网络时间变化时更新本地时间。

36.NotificationManagerService

通知服务。

37.NsdService

网络服务搜索

38.PrintManagerService

打印服务。

39.PowerManagerService

电源管理服务。

40.RecognitionManagerService

身份识别相关。

41.SamplingProfilerService

用于耗时统计等。

42.SearchManagerService

搜索服务。

43.SchedulingPolicyService

调度策略。

44.SerialService

对串口的设备进行操作

45.StatusBarManagerService

状态栏。

46.TelephonyRegistry

提供电话注册、管理服务, 可以获取电话的链接状态、信号强度等等。

47.TextServicesManagerService

文本服务, 例如文本检查等。

48.TwilightService

指出用户当前所在位置是否为晚上, 被UiModeManager等用来调整夜间模式。

49.UiModeManagerService

管理当前Android设备的夜间模式和行车模式.。

50.UsbService

USB Host和device管理服务。

51.VibratorService

振动器服务。

52.WifiP2pService

Wifi Direct服务。

53.WifiService

Wifi服务。

54.WiredAccessoryManager

监视手机和底座上的耳机