Here's me.

分类 安卓 下的文章

IconPackApplyer 是一个 Xposed 模块,支持 AOSP 系统设置图标包,不再看到缭乱不一的应用图标。

Feature

支持 Android 5.0+。
支持使用图标包蒙版功能(高级版)。
支持缩放过大的图标(高级版)。
支持使用已冻结的图标包。
应用黑名单/图标黑名单。

使用说明

1) 安装应用,并在 Xposed Installer 中激活,重启。
2) 选择你喜欢的图标包。
注意:您可能需要清除某些应用的缓存才能看到效果。

本软件可能暂时无法在一些「魔改 ROM」上工作,请自行测试。

使用相关

  • 问:个别应用内显示的图标没有被替换?
  • 答:请尝试清除缓存 或 查看该应用是否被加入黑名单.
  • 问:全部没有效果?
  • 答:请检查 Xposed 是否开启资源钩子.
  • 问:模块更新后提示未激活?
  • 答:请重启系统后重试.
  • 问:我是 OPPO/VIVO/锤子手机,黑名单列表只能读得到几个 App?
  • 答:请在系统权限设置中,打开读取应用列表权限.

付费相关

  • 问:支付后验证订单,却提示未支付?
  • 答:如果您是刚刚完成支付的,那么请等待两分钟后重试.
  • 问:已购买,刷机后还能用吗?
  • 答:可以,请点击付款窗口的"已购买"按钮,输入手机号并验证短信验证码来找回订单.

其他

  • 没了,想到其他的再补上来

Android 系统内有一个名为 “service“ 的命令,在终端内输入 service -h,可以得知其用法:

Usage: service [-h|-?]
    service list
    service check SERVICE
    service call SERVICE CODE [i32 INT | s16 STR] ...
Options:
  i32: Write the integer INT into the send parcel.
  s16: Write the UTF-16 string STR into the send parcel.

运行 service list 得到可用列表:
photo_2018-06-08_21-32-20.jpg

我们本需要的运行的是

IPackageManager.setApplicationEnabledSetting(String,int,int,String);

查阅上面的 list,知道了对应的 service 是 package 。

有趣的是, service call SERVICE CODE [i32 INT | s16 STR] 中的 CODE,在不同安卓机器上是不同的,但我们可以通过反射获取到:

@SuppressLint("PrivateApi")
    private static int getCode() {
        Class localObject = Class.forName("android.content.pm.IPackageManager$Stub");
        Field localField = localObject.getDeclaredField("TRANSACTION_setApplicationEnabledSetting");
        return localField.getInt(localObject);
    }
在 Android 9 以上,无法使用非 SDK 接口,所以我们使用另一个奇技淫巧来读取。这里不再赘述。

获取到 CODE 之后即可构造字符串

str = "service call package " + CODE + " s16 " + packageName + " i32 " + (freeze ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER : PackageManager.COMPONENT_ENABLED_STATE_ENABLED);

然后到随便一个是 UID.SHELL 或是 ROOT 权限的进程里跑就行了。

Q&A:
Q:为什么不直接用 “pm disable-user package Name”呢?
A:很慢。

当然了,也可以使用 service 命令做一些奇技淫巧的事情,比如不申请权限就能获取 IMEI,不申请权限就能发送短信等等。但是你的应用得有 ROOT 或是 SHELL 权限。

使用此原理的软件有:小黑屋,冰箱。