如何利用反射去实现定制化flavor java代码,慎用,骚操作.

前提条件:

  • 反射是一种不安全的操作,慎用.
  • 了解android组件化开发,可以点击了解
  • 了解一定的java反射逻辑和知识.可以点击了解
  • 熟练掌握Android flavor,可以点击了解

技能点

  • 反射
  • 动态代理
  • module组件化开发,便于后期维护

需求背景:

  • 在某个flavor下,做一些定制的java逻辑和代码,但是这些代码和相关的三方的sdk,都不参与其他的flavor的编译过程.

说明:

首先说一下什么是Android 的 flavor , 其实,这个是Android差异化打包所衍生出来的,或者说,差异化打包的实现就是通过flavor,什么是差异化打包呢?其实就是一套代码,有具体的公共的功能,但是,可能资源文件,以及图片资源不一样,以及最重要的\color{red}{applicationId}不一样,可能在你看起来,这两个app都是差不多的,除了图片资源不一样意外,功能都是一样的,但是从代码层面来讲,他们就是两个不同的app,因为applicationId不一样,所以,打开时候,他们的进程pid是不同的,所以,他们是两个app,ok,不说那么多,如果知道productFlavors同学可能会问,为什么不能直接将代码写在公共类库,用flavor去区分就行了,比如说我现在是flavor A, 那么我就执行这个代码,flavor B就不执行,ok,思路完全也没有问题,代码也能够实现,但是,有个问题,随着现在的安全与各种检查越来越严格,因为你的代码最终是服务于客户,那么,在对于客户A,他需要这个功能,没啥好说,但是,对于客户B来说,我不需要这个功能,检测到某些权限和代码对于客户B来说,是属于敏感权限,而这些敏感权限正好是客户A要求你开发的代码,那么怎么办?
\color{red}{所以,我们需要做,代码隔离,即在flavorA的情况下,将定制化代码进行编译,在flavorB的时候,相关的代码不参与编译}
有同学说,这个简单,在导包时候,使用 flavor+complie 这种方式,在指定的flavor上编译,但是,这样会有问题,因为我们java代码和C代码,都会有import头文件,这个如果切换到其他的flavor时候,那么,你某些资源没有参与编译,
那么,就会导致你import导包失败,在其他的flavor上,代码编译无法通过.所以,有两种解决方法.

解决方法

  • 1 将差异化代码的整理出来,实现两个不同的module,moduleA放置差异化的内容,moduleB什么都不放,保持和moduleA相同的类路径就行了,这样,在不同的flavor去加载不同的module,然后,A和B分别创建一个名字一样用于事件分发的入口,这样,就不会存在import 导包报错的问题,因为路径一样,入口一样.
  • 2 基于1的思路,只需要创建一个moduleA,创建入口,通过反射拿到入口并实例化,调用代码,so,我们来详细讲这种方法,项目结构如下
    QQ20211222-153418.png

    我们将第三方,定制化的代码放入到这个module下.
    QQ20211222-153612.png

    在引入的时候,我们使用\color{red}{flavor+Implementation}方式,这样,只会在当前的flavor中被编译
    QQ20211222-153852.png

    这个module中只有两个,一个统一的管理入口,一个回调实现类,为什么会有一个回调的实现类,这就是我下面会说的.
    我们都知道,反射,只能反射类,也能反射类的方法,那么类的方法中如果有接口怎么办,我们怎么收到这个接口的回调,那么我们就需要动态代理,这个不在赘述,具体的流程是如下图所示
    QQ20211222-154429.png

    我写一个类去继承InvocationHandler,这样,相当于我动态代理的类,他的实现方法会回调在invoke方法中,
    这样,我去获取一个已经实现了接口的实现类,就可以在invoke返回一个已经实现的方法.
    QQ20211222-154802.png

    这一段代码,是将你需要代理的类和中间的实现类绑定关系,我们可以看看原来的方法,如下图所示
    QQ20211222-155017.png

    这个就是你需要传入一个callbak的实现类,所以,我们通过动态代理,实现了callBack,我们将callBack传入方法中,那么就可以得到invoke的回调,那么我们自然就知道,当前哪个接口需要实现,也就拿到了接口回调.
    但是,反射毕竟是不安全的一种操作,尽量还是少用反射.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容