无Context调用services

无Context调用 Services 的一点经验分享

##从DisplayManagerGlobal入手
这是一个单例,但却能构造出IDisplayManager对象。
public static DisplayManagerGlobal getInstance() {
synchronized (DisplayManagerGlobal.class) {
if (sInstance == null) {
IBinder b = ServiceManager.getService(Context.DISPLAY_SERVICE);
if (b != null) {
sInstance = new DisplayManagerGlobal(IDisplayManager.Stub.asInterface(b));
}
}
return sInstance;
}
}

    private static IServiceManager getIServiceManager() {
    if (sServiceManager != null) {
        return sServiceManager;
    }
    // Find the service manager
    sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
    return sServiceManager;
}

所以在没有Acitivity的Context的时候,我们也可以用这种方法来反射出各种service

也就是平时我们所看到的

其实还有第二种方法,反射出系统的Context,然后通过这个Context getService,

无论是以上哪一种方法,都会有一个限制,

例如createDisplay方法

会校验uid查询出来的packagename和context中拿到的packagename是否一致

而反射出的context的packagename是android

而我们如果通过shell运行的dex,packagename是com.android.shell

实现经历

虽然在无 root 的情况下支持 adb 不是一个特别大众的需求,但是我仍在为此做努力,这个已经是前两周实现了,但是没时间写相关文章。

解释一下 adb 编译成 arm64 二进制后,为什么不能无 root 通过 OTG 去连接另一台设备,因为 adb 在最初设计就没有考虑会运行在安卓设备上,在安卓上,进程不能直接读写 /dev/bus/usb 节点,而在 PC 上是扫描这个节点(linux),这和安卓其它一堆动态权限类似,安卓为了做权限控制,修改了了 Linux 内核,加了 Linux 原本不会有的限制,例如 Linux 上普通进程本就是可以读写 usb 的,但在安卓上,我们只能通过编写 java 代码动态申请安卓权限,然后用 android 的 java api 去读写。
所以c语言层不能读写 usb,而 java 可以,而这二者如何结合,就是问题所在,也是实现的难点所在。

所以在之前的 ADB KIT中,我也是这样做的,并用 java 代码实现了部分 adb 协议,包括握手,鉴权,文件上传,软件安装,终端交互。这部分是开源的,文章在掘金 -> https://juejin.cn/post/7034799230086545445,所以我对 adb 本身的理解,本就已经超出绝大部分人了,你们给我提的思路和建议,都是我四五年前能想到的东西了,我们做东西要的是实现,而不是谁都能想到的想法。

但是这种效率极低,上传文件龟速,不也不太清楚是为什么,可能是我实现得不好,也可能是 java 效率本就不如 c。
并且协议很难实现完整,例如投屏所需要的关键协议,adb forward 等

最终方案,将 termux-adb 进行了改造,结合 termux-api,在命令行中实现动态申请 usb 权限,然后获得文件的描述符,然后 hook adb 在代码中的 open opendir 等方法,让它以为读取到的就是串口设备,这样的效率是极高的。

经过了很久的尝试,花了我的一整个周末,熬了几个大夜,说实话,我不太想把这作为一个免费的功能,但是最终,它是免费的,在当前版本是,我不会限制你使用的版本,如果后续它成为一个付费的功能,你也可以使用历史版本。

总是会有人来说,“都是用的开源的东西你凭什么收费,都是能查到的资料写的你凭什么收费,尽管不是能查到的资料,那你也是凭现有的资料总结出来的,你凭什么收费”,有个人之前在酷安的评论区一直喷我这点(最近又来一个),我屏蔽后去我的B站喷,这世上最可怕的生物,是人。

我就收费了,我写个 hello world 我也收费999元怎么了?你敢说我错了?没逼着你买,我的软件都是我付出过极多精力的东西,很多都一直免费到现在,我上班工资一个月几w,下班还要来伺候这群人(指的态度不好的),真是不讨好。当然友好的用户,我还是很愿意为他们提供好的软件的。

如果我喜欢某一个软件,我希望它是收费的,如果它一直免费,我反而会担心,用爱发电总有终止的那一天,除非开发者财富自由,不然开发者总是会陷入一个困境“写这个又没钱,要不我不写好好上班算了”。

的确,目前我所开发的软件,都给我带来很多的精神内耗,加上最近了解了一下我升职后的工资,大概升两职后,工资大概能到4w一个月,我为什么不把自己写软件的精力也投入到工作上呢?然后一天一天。

哦最后关于我的软件为什么还不收费,是因为一个软件要收费,需要做的事情也是很多的,后端接口,鉴权方式等,最近公司的压力太大,我能拿来自己开发的时间极少。

我不太清楚甲壳虫和bug的方式,但我敢说,目前 ADB KIT OTG 的效率是大于它俩的。

如何使用

1.保证需要调试的设备开启了 USB 调试
2.使用 OTG 数据线连接两个设备
这个地方有个小坑, type c to c 的线总是没办法区分谁连谁,全靠运气,所以有条件的可以用 USB to Type c 再加一个 OTG转接头解决

ADB KIT 将绝大部分的工作都自己完成了,使用 OTG 调试设备几乎和 PC 连接 Android 一样

数据线插上,然后打开 ADB KIT
如图,注意点确定哈,点完后,被调试的设备会出现 ADB 的弹窗,也注意点确定哈(如果是MIUI没点到这个弹窗,后面都不会弹了,重启和开关 USB 调试可以解决)

无 Root 使用 ADB 带来的好处

只要自己有两个设备即可激活 Shizuku、Scene、冰箱等软件,就算需要激活的设备没有自带的无线调试
可以更方便的为其他的设备安装/卸载软件,上传文件,例如车机,手表

无界也马上支持无 Root OTG 控制另一台安卓(车机,手表),最近工作压力稍微有点大,精力缺乏。

终于,ADB KIT、Uncon支持无root OTG

实现经历

虽然在无 root 的情况下支持 adb 不是一个特别大众的需求,但是我仍在为此做努力,这个已经是前两周实现了,但是没时间写相关文章。

解释一下 adb 编译成 arm64 二进制后,为什么不能无 root 通过 OTG 去连接另一台设备,因为 adb 在最初设计就没有考虑会运行在安卓设备上,在安卓上,进程不能直接读写 /dev/bus/usb 节点,而在 PC 上是扫描这个节点(linux),这和安卓其它一堆动态权限类似,安卓为了做权限控制,修改了了 Linux 内核,加了 Linux 原本不会有的限制,例如 Linux 上普通进程本就是可以读写 usb 的,但在安卓上,我们只能通过编写 java 代码动态申请安卓权限,然后用 android 的 java api 去读写。
所以c语言层不能读写 usb,而 java 可以,而这二者如何结合,就是问题所在,也是实现的难点所在。

所以在之前的 ADB KIT中,我也是这样做的,并用 java 代码实现了部分 adb 协议,包括握手,鉴权,文件上传,软件安装,终端交互。这部分是开源的,文章在掘金 -> https://juejin.cn/post/7034799230086545445,所以我对 adb 本身的理解,本就已经超出绝大部分人了,你们给我提的思路和建议,都是我四五年前能想到的东西了,我们做东西要的是实现,而不是谁都能想到的想法。

但是这种效率极低,上传文件龟速,不也不太清楚是为什么,可能是我实现得不好,也可能是 java 效率本就不如 c。
并且协议很难实现完整,例如投屏所需要的关键协议,adb forward 等

最终方案,将 termux-adb 进行了改造,结合 termux-api,在命令行中实现动态申请 usb 权限,然后获得文件的描述符,然后 hook adb 在代码中的 open opendir 等方法,让它以为读取到的就是串口设备,这样的效率是极高的。

经过了很久的尝试,花了我的一整个周末,熬了几个大夜,说实话,我不太想把这作为一个免费的功能,但是最终,它是免费的,在当前版本是,我不会限制你使用的版本,如果后续它成为一个付费的功能,你也可以使用历史版本。

总是会有人来说,“都是用的开源的东西你凭什么收费,都是能查到的资料写的你凭什么收费,尽管不是能查到的资料,那你也是凭现有的资料总结出来的,你凭什么收费”,有个人之前在酷安的评论区一直喷我这点(最近又来一个),我屏蔽后去我的B站喷,这世上最可怕的生物,是人。

我就收费了,我写个 hello world 我也收费999元怎么了?你敢说我错了?没逼着你买,我的软件都是我付出过极多精力的东西,很多都一直免费到现在,我上班工资一个月几w,下班还要来伺候这群人(指的态度不好的),真是不讨好。当然友好的用户,我还是很愿意为他们提供好的软件的。

如果我喜欢某一个软件,我希望它是收费的,如果它一直免费,我反而会担心,用爱发电总有终止的那一天,除非开发者财富自由,不然开发者总是会陷入一个困境“写这个又没钱,要不我不写好好上班算了”。

的确,目前我所开发的软件,都给我带来很多的精神内耗,加上最近了解了一下我升职后的工资,大概升两职后,工资大概能到4w一个月,我为什么不把自己写软件的精力也投入到工作上呢?然后一天一天。

哦最后关于我的软件为什么还不收费,是因为一个软件要收费,需要做的事情也是很多的,后端接口,鉴权方式等,最近公司的压力太大,我能拿来自己开发的时间极少。

我不太清楚甲壳虫和bug的方式,但我敢说,目前 ADB KIT OTG 的效率是大于它俩的。

如何使用

1.保证需要调试的设备开启了 USB 调试
2.使用 OTG 数据线连接两个设备
这个地方有个小坑, type c to c 的线总是没办法区分谁连谁,全靠运气,所以有条件的可以用 USB to Type c 再加一个 OTG转接头解决

ADB KIT 将绝大部分的工作都自己完成了,使用 OTG 调试设备几乎和 PC 连接 Android 一样

数据线插上,然后打开 ADB KIT
如图,注意点确定哈,点完后,被调试的设备会出现 ADB 的弹窗,也注意点确定哈(如果是MIUI没点到这个弹窗,后面都不会弹了,重启和开关 USB 调试可以解决)

无 Root 使用 ADB 带来的好处

只要自己有两个设备即可激活 Shizuku、Scene、冰箱等软件,就算需要激活的设备没有自带的无线调试
可以更方便的为其他的设备安装/卸载软件,上传文件,例如车机,手表

无界也马上支持无 Root OTG 控制另一台安卓(车机,手表),最近工作压力稍微有点大,精力缺乏。

Android双屏异显简单上手

获得 Display

1.一、使用MediaRouter选择演示显示

1
2
3
4
5
6
7
8
MediaRouter mediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
if (presentationDisplay != null) {
// ***
}
}
阅读更多

梦魇兽软件反馈指南

软件反馈

目前个人软件两个群,总共2000多人,处理反馈信息压力属实太大,时不时一个好友请求过来,几句话啥也说不明白就开始慰问我全家。

酷安私信也是,我平时工作偶尔就想放松一下,当个社区刷一下,就发现私信态度不好的,评论态度不好的,态度不好还指责我的,说其他的开发者是又厉害有热心,我的确做不到…

所以后续我QQ禁止加好友,酷安禁止私聊。

后续反馈优先处理邮箱(mengyanshou@gmail.com)和Github Issue中的信息。

不要一上来就一段简单的文字,说这是为什么为什么!我甚至都不知道你使用的软件是哪一个

反馈带上最基本的信息。

手机系统类型:MIUI,Flyme

Android 版本:10,11,12

所使用的软件版本:以应用在系统内为主,就是你在桌面长按软件进入应用详情看到的那个

复现逻辑:如果是bug,你得让我复现,我才能通过调试代码进行修复

开发维护多难

魇·工具箱代码是1.7w行

速享是1.6w行

ADB KIT 是1.7w行

Uncon 是1.6w行

Code FA 的代码很少,相比上面几个可以忽略不计

除了闭源的魇·工具箱和 Uncon 以外,其他项目都是开源的,觉得不真实的话可以自己去对应的开源地址看。

每个工程有大量的上下文,所以我每次维护一个软件,都有一些时间是在读之前的代码,我如果一天维护一个软件,可能才把当前代码读懂,就该维护下一个软件了。

所以我基本是好几周专一维护同一个软件。

维护的时间

由于我目前**的问题比较严重,平时下班基本没有精力再写代码,周末也是很少的时间维护,所以大家购买会员慎重考虑。

一些闲话

我在滴滴加实习工作了一年,也和多个部门协作过,至今我没有遇见一个人还用业余时间搞个人项目的,一个也没有!

也许在他们眼中我才是那个傻子。明明拿着比大多数同龄人都要高的工资,却要一边上班一边伺候我的用户。

平时上班本就烦躁,一些一加群就@我啥也说不明白的人,我真的会更烦躁。

个人软件对我的意义

是爱好,是执念,我遇见一些需求场景找不到好的软件,我便会尝试自己开发,当前脑子里面还有非常多的想开发的软件。

自然是因为时间不允许,所以才没开发。

我也想不工作专心写自己的项目,可我还需要生活,需要还债。

Flutter实战项目-Android生态互联

背景

目前各大厂商的多设备协同大都做得差强人意,并且都只是自己生态下的产物,不能实现跨生态互联。

为什么厂商不真正将生态覆盖到其他设备?是技术支持不够吗?
技术不是问题,以每个厂商的实力,像鸿蒙的互联,小米妙想,应该是能够跨厂商互联的,但是这样做了,用户就不会为了使用这项功能,
而对整个生态的设备消费了,这甚至会直接影响设备的销量,例如我有小米手机,华为平板,如果华为平板已经支持小米妙想的话,我再买小米平板的概率就被降低了。

软件截图

在视频渲染上,

屏幕的渲染氛围硬解和软件,在前面的版本,是通过 C/C++ 自实现代码,

从大的视角看 Uncon

Flutter 承载了前面的视图界面,用户最先看到的主页,菜单,响应各种动画

ROM工具现存情况调研

1.TIK

开源免费 bash+python
优点:安卓通用工具箱,支持大量格式ROM分解、合成()

阅读更多