在完成组件化方案的整理,落地实践后。
按照之前的设想,现在开始对插件化,热补丁技术做新的探索工作。

就目前的插件化方案,个人认为较好的方向是基于Gradle的方式做。
这种编译时的对代码做”手术”方案,兼容侵入性更优。

道高一尺,魔高一丈

感觉就像基因编辑手术的事情一样。
从细胞层面根本的解决问题,打造刀枪不入之躯。
但生物作为会进化的东西,道高一尺魔高一丈,感觉这也会不断的加速病毒的进化
正如超级细菌的出现,不断的用抗生素筛选除了最强细菌。

而目前的插件化框架,主流的整体思路是一致的,
对系统服务做HOOK处理,从而做到欺上瞒下的能力。

从而允许我们去对四大组件做新增。

无限的兼容黑洞

早期像DroidPlugin框架,会有大配的适配逻辑,
手Q插件框架内部也有类似这样的大量兼容不同ROOM的逻辑。
特别到了安卓P系统之后,你现在还得去做反射的绕过问题。不断的兼容适配,这样很累。

我们希望可以做更低的侵入性,不对系统框架实现依赖做处理的黑魔法事情

回归主题,接下来,想重新整理下SmallVirtualAPK这种基于Gradle插件的方案。

最近还看了下号称只有一处做hook的插件Replugin和Phantom

思路好,但还有明显的弊端。

基于自己业务本身场景的需要,探索我们还可以做出怎样的优化?

作为开发,一定很熟悉这么一句话

任何软件工程遇到的问题都可以通过增加一个中间层来解决!

任何问题,都可以用包一层来解决兼容性问题,手动做适配。
这就是插件化的新未来方向。

The End

加油!小伙子.s
作为年轻人,还是要对技术有追求。

离开自己的博客很久,忙于业务与生活,很久没同步自己的文章,大部分写在公司内网。
虽然阅读了很多,不过也没怎么沉淀下来一点自己的内容出来。

现在重新起航,故事继续。

不得不说,这两年,安卓的整体技术发展没有以前的势头,
公共基础能力都得到了很好的发展,常用的库都已经有了,
不像以前什么都需要自己写了。
像热补丁,插件等探索系统本身的事情也都相对稳定了。

以后开发的路是哪里呢
不清楚。

但还是有业务场景需要的还没被满足。

接下来定点小目标:

  1. 参加行业大会
  2. 重新思考插件框架的可能
  3. 翻看热补丁的内容,重新思考热补丁的新应用
  4. 输出文章

简单说就是保持与业界的同步,要涨姿势,看能否做点突破。

归来人少年

The End

加油!小伙子.

最近需要做一个局域网视频播放的功能,用到两个第三方库,然后遇到了传送失败,速度为0 的问题,只好看下整个库的源码,改下bug,在这里记录下整个逻辑的流程笔记。

整个局域网播放流畅主要是下面的流程

客户端 <--- (socket通讯)--->服务器<---(smb协议)--->某台局域网电脑

我们的安卓手机如果要播放局域网某台电脑上的视频,我们需要起一个http服务器,由这个服务器和播放器做通讯,根据播放器 发来的请求头的range(类似断点续成的原理),来加载特定的数据给播放器。
而服务器的数据是从某台局域网电脑上读取的啊,在windows上,有smb协议负责处理这部分内容,我们靠着这个smb协议去链接 数据源 ,即某台有我们想要播放的视频的那台电脑。去加载播放器请求的内容,然后扔回给播放器。

大致的流程就是上面这样。至于具体的代码细节,在下面给出demo

Read more »

最近想寻找什么方法能够彻底的关闭别人的app!
这听起来就很流氓,居然是关闭别人的,而且还要是关闭 前台进程(Foreground process),这想法真大胆。查了下目前的资料,

  1. 类似各种xx大师,管家的一键加速功能,这种根据各个进程adj评分去关闭方案,似乎对于前台进程是鞭长莫及。
    按照我们熟悉的

  2. forceStopPackage 这个是AM的隐藏方法,实际上由于签名,uid等限制条件,并不能真的关闭第三方,别人的程序。另外AM还有别的方法听起来像可以关闭别人进程的,如killBackgroundProcessesremoveTask等。

  3. Process.killProcess()
    在process这个类里面,由几个方法可以调用去关闭,其中有一个的注释很有意思,打算贴出来。

     /**
     * @hide
     * Private impl for avoiding a log message...  DO NOT USE without doing
     * your own log, or the Android Illuminati (安卓光明会)will find you some night and beat you up.
     * 这段注释很调皮😝,特拿出来哈
     */
    public static final void killProcessQuiet(int pid) {
        sendSignalQuiet(pid, SIGNAL_KILL);
    }
    
    public static final native void sendSignalQuiet(int pid, int signal);
    

对于上面的所有,这篇文章主要记录forceStopPackage()背后执行的内容,别的方法之后再考虑写。

Read more »

对于这两个adapter的区别,我们在对代码做一次遍历后给出

为了便于沟通,我们把前者缩写成FPA,后者缩写成FSPA

现在我们先来看下简单的使用情况

public abstract class FragmentPagerAdapter extends PagerAdapter 
public abstract class FragmentStatePagerAdapter extends PagerAdapter 

通过这两个类的声明,我们知道他们都是继承与PagerAdapter的抽象类,需要实现两个接口

public abstract Fragment getItem(int position);
//返回对应的position要展示的Fragment

public abstract int getCount();
//返回要展示的总fragment数目

我想应该你有写过类似的代码,直接自己继承与PagerAdapter,然后重写多下面两个函数来创建/销毁界面

public Object instantiateItem(ViewGroup container, int position)
public void destroyItem(ViewGroup container, int position, Object object)
Read more »