精华内容
下载资源
问答
  • 不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果...
  • CJFrameForAndroid 是一个实现android插件化开发框架使用CJFrameForAndroid,apk动态加载不再是难题,更重要的是可以轻松实现插件与APP项目之间的解耦。 原理描述 CJFrameForAndroid的实现原理是通过类加载器...
  • 不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,...
    介绍
    
    这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。
    不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。
    在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果就是每次插件的更新,都必须以整个程序的更新为代价)
    都能干啥
    框架的思想,主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机,也就是融合为一个进程,这样就变相逾越了android框架中不同apk权限不同无法互通的鸿沟(rpc啦什么的其它的毕竟不如这个来的实在)。
    从最简单的皮肤插件到复杂的涉及数据库的拓展功能,从普通activity跳转到把插件的activity转变为view并附加到主程序中的拓展功能,都是可以通过本框架来实现的,当然,本框架只是提供了一种途径,如何编码还得靠自己。
    本人能力有限,可能有一些错误、疏漏或者不足之处,请不吝指教,我的博客地址在左下角,或者我的邮箱,都可以联系到我。
    ps:下面会以腾讯微信为例,这里声明一下,本人没有对微信安卓客户端进行任意形式的反编译与破解工作,只是看球半天进行简单的猜测而已。
    框架结构
    本插件框架由三个包组成:

    • org.igeek.android.pluginframework 这个包种类是框架的主要操作类
      • PluginBuilder 组装插件
      • PluginDescription 组装用户自定义的插件描述
      • PluginInvoke 插件功能调用
      • PluginSearch 查找插件
    • org.igeek.android.pluginframework.annotation 未来可能会考虑使用注解
      • PluginDescription 用于用户自定义描述类的注解
      • PluginFeature 用于插件类的注解
      • PluginMethod 用于插件类方法的注解
    • org.igeek.android.pluginframework.beans 框架内部使用的一些beans
      • Plugin 插件包
      • PluginFeature 插件类
      • PluginFeatureMethod 插件方法
    • org.igeek.android.pluginframework.util 一些工具类
      • XMLParse 插件包

    如何使用
    以腾讯微信为例,虽然从表面来看,它是插件化的多种功能的一种集成。但是,这都是虚的,每次更新时你会发现,哪怕一个小小的功能添加,都会让用户更新整个程序,截至目前(2011-12-17),微信让我更新到3.5,修复了一些小bug,增加了1个插件功能,以及其它的小改进,就得让我下载并升级整个程序,6.8m啊。。
    在工程开发时,预留插件的使用、管理页面,如:
    weixin1.png
    2012-8-21 10:28 上传
    下载附件(42.3 KB)
    这是微信的插件浏览页面,所有可暴露在这里的插件都会被列出来
    weixin2.png
    2012-8-21 10:28 上传
    下载附件(44.78 KB)

    这是微信的插件管理界面,可以卸载安卓,但这些都是虚的,可能只是把服务关了,并非真正的卸载
    主程序(APK)
    • 、主程序清单
    首先为工程想好一个名字,并在清单中加入sharedUserId属性,属性值就是想好的那个名字,例如微信:com.qq.weixin
    1
    android:sharedUserId="com.qq.weixin"
    • 、为插件描述写一个类

    这就是插件描述

    首先在主程序中单独建立一个包,并写一个类,这个类相当于一个bean,具有相应的插件描述信息的字段,如微信,那么这个bean的字段就有 插件名:漂流瓶 插件logo:那个人头 插件描述:描述信息...

    这个类在主程序中不会很多的使用,只会读取框架返回的插件的bean。

    • 、引入本框架的jar包或导入源码

    正式编码时,可在任何地方调用框架。具体步骤是这样的
    1、查找插件 本框架是根据sharedUserId来查找插件。它首先会根据自身apk的sharedUserId值来查找系统中具有相同属性的包并加载。
    • ��以说,插件apk的sharedUserId值也应与主程序相同
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //首先,就是查找插件
           PluginSearch psearch=newPluginSearch();
           //第一次获得的是简要的插件描述
           List<Plugin>  plugins=psearch.getPlugins(this);
             
           //然后将插件再组装一下
           PluginBuilder pbuilder=newPluginBuilder(this);
           //将用户所定义插件描述融合进去
           plugins=pbuilder.buildPluginsDescrition(plugins);


    这样就把所有插件找到手了,很简单吧?

    1、调用插件 找到插件后肯定是调用,最简单应用,就是靠Button按钮来调用
    比如微信的摇一摇,点了它就触发框架的插件调用

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    @Override
           publicvoid onClick(View v) {
                   //新建一个插件调用类
                   PluginInvoke pi=newPluginInvoke(AndroidPluginFrameworkActivity.this);
             
                     
                   //这是真正的调用
                   //三个参数,第一个是Plugin类型,第二个是PluginFeature,第三个PluginFeatureMethod
                   pi.invoke(plug, pf, fm);
                     
           }
           });

    插件程序(APK)
    • 、插件程序清单

    同主程序的清单文件一样,sharedUserId必须有且和主程序的一样 插件的activity的意图过滤描述必须是这样 示例:

    1
    2
    3
    <intent-filter>
                   <category android:name="android.intent.category.DEFAULT"/>
     </intent-filter>

    • 、插件程序的功能
    插件可以包含任意类,如同一个普通的apk工程一样。
    但是,向主程序提供调用的类,必须是个activity,方法必须是无返回值的,有且只有一个Context参数,框架会反射这个方法,并将主程序的context句柄传入,也就是,不管你用不用这个context,他都是被框架传入的。
    如果主程序规定了描述类,也就是框架中需要PluginDescription来调用的bean,在插件工程中,也必须有主程序这个bean,包名也必须一样。插件程序可以直接继承或者更改这个bean的字段,方便主程序去获取这个插件的描述信息。这种方式,是避过框架,给主程序一种方便。
    • 、插件程序的plugin.xml配置
    http://android-application-plug-ins-frame-work.googlecode.com/files/plugin.xml plugin.xml不能改名,必须放在工程的 assets 目录下。
    内容大致是这样:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0"encoding="UTF-8"?>
    <!-- 这个xml配置文件放在插件工程的 assets 目录下 -->
      
      
    <!-- 插件提供的功能(类) -->
    <plugin-features>
      
            <!-- 描述类,这个是自定义的 -->
            <!-- 这个描述类使用户定义的,在主程序中必须有,插件工程中也必须有,并被继承 -->
            <description name="org.pakage.name.and.description.name"/>
              
            <!-- 这是一个功能(类),必须是activity的子类 -->
            <feature name="org.pakage.name.and.activity.name1">
              
                    <!-- 这是一个方法 -->
                    <!-- name 方法名 -->
                    <method need-context="true"name="methodName1">描述信息</method>
                    <method need-context="true"name="methodName2">描述信息</method>
                      
            </feature>
              
            <feature name="org.pakage.name.and.activity.name2">
                    <method need-context="true"name="methodName1">描述信息</method>
            </feature>
    </plugin-features>

    按着上面的套路来配置,就很容易了。
    最后
    上面说的比较泛,最好还是看看示例工程,里面包含了一个主程序和两个插件扩展,总共是4个工程,也就是说,在用户端是4个apkhttp://android-application-plug-ins-frame-work.googlecode.com/files/demo.zip


    开源项目地址:https://code.google.com/p/android-application-plug-ins-frame-work/

    作者博客:http://hangxin1940.cnblogs.com/
    展开全文
  • 不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,...
    介绍
    
    这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。
    不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。
    在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开,结果就是每次插件的更新,都必须以整个程序的更新为代价)
    都能干啥
    框架的思想,主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机,也就是融合为一个进程,这样就变相逾越了android框架中不同apk权限不同无法互通的鸿沟(rpc啦什么的其它的毕竟不如这个来的实在)。
    从最简单的皮肤插件到复杂的涉及数据库的拓展功能,从普通activity跳转到把插件的activity转变为view并附加到主程序中的拓展功能,都是可以通过本框架来实现的,当然,本框架只是提供了一种途径,如何编码还得靠自己。
    本人能力有限,可能有一些错误、疏漏或者不足之处,请不吝指教,我的博客地址在左下角,或者我的邮箱,都可以联系到我。
    ps:下面会以腾讯微信为例,这里声明一下,本人没有对微信安卓客户端进行任意形式的反编译与破解工作,只是看球半天进行简单的猜测而已。
    框架结构
    本插件框架由三个包组成:

    • org.igeek.android.pluginframework 这个包种类是框架的主要操作类
      • PluginBuilder 组装插件
      • PluginDescription 组装用户自定义的插件描述
      • PluginInvoke 插件功能调用
      • PluginSearch 查找插件
    • org.igeek.android.pluginframework.annotation 未来可能会考虑使用注解
      • PluginDescription 用于用户自定义描述类的注解
      • PluginFeature 用于插件类的注解
      • PluginMethod 用于插件类方法的注解
    • org.igeek.android.pluginframework.beans 框架内部使用的一些beans
      • Plugin 插件包
      • PluginFeature 插件类
      • PluginFeatureMethod 插件方法
    • org.igeek.android.pluginframework.util 一些工具类
      • XMLParse 插件包

    如何使用
    以腾讯微信为例,虽然从表面来看,它是插件化的多种功能的一种集成。但是,这都是虚的,每次更新时你会发现,哪怕一个小小的功能添加,都会让用户更新整个程序,截至目前(2011-12-17),微信让我更新到3.5,修复了一些小bug,增加了1个插件功能,以及其它的小改进,就得让我下载并升级整个程序,6.8m啊。。
    在工程开发时,预留插件的使用、管理页面,如:
    weixin1.png
    2012-8-21 10:28 上传
    下载附件(42.3 KB)
    这是微信的插件浏览页面,所有可暴露在这里的插件都会被列出来
    weixin2.png
    2012-8-21 10:28 上传
    下载附件(44.78 KB)

    这是微信的插件管理界面,可以卸载安卓,但这些都是虚的,可能只是把服务关了,并非真正的卸载
    主程序(APK)
    • 、主程序清单
    首先为工程想好一个名字,并在清单中加入sharedUserId属性,属性值就是想好的那个名字,例如微信:com.qq.weixin
    1
    android:sharedUserId="com.qq.weixin"
    • 、为插件描述写一个类

    这就是插件描述

    首先在主程序中单独建立一个包,并写一个类,这个类相当于一个bean,具有相应的插件描述信息的字段,如微信,那么这个bean的字段就有 插件名:漂流瓶 插件logo:那个人头 插件描述:描述信息...

    这个类在主程序中不会很多的使用,只会读取框架返回的插件的bean。

    • 、引入本框架的jar包或导入源码

    正式编码时,可在任何地方调用框架。具体步骤是这样的
    1、查找插件 本框架是根据sharedUserId来查找插件。它首先会根据自身apk的sharedUserId值来查找系统中具有相同属性的包并加载。
    • ��以说,插件apk的sharedUserId值也应与主程序相同
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //首先,就是查找插件
           PluginSearch psearch=newPluginSearch();
           //第一次获得的是简要的插件描述
           List<Plugin>  plugins=psearch.getPlugins(this);
             
           //然后将插件再组装一下
           PluginBuilder pbuilder=newPluginBuilder(this);
           //将用户所定义插件描述融合进去
           plugins=pbuilder.buildPluginsDescrition(plugins);


    这样就把所有插件找到手了,很简单吧?

    1、调用插件 找到插件后肯定是调用,最简单应用,就是靠Button按钮来调用
    比如微信的摇一摇,点了它就触发框架的插件调用

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    @Override
           publicvoid onClick(View v) {
                   //新建一个插件调用类
                   PluginInvoke pi=newPluginInvoke(AndroidPluginFrameworkActivity.this);
             
                     
                   //这是真正的调用
                   //三个参数,第一个是Plugin类型,第二个是PluginFeature,第三个PluginFeatureMethod
                   pi.invoke(plug, pf, fm);
                     
           }
           });

    插件程序(APK)
    • 、插件程序清单

    同主程序的清单文件一样,sharedUserId必须有且和主程序的一样 插件的activity的意图过滤描述必须是这样 示例:

    1
    2
    3
    <intent-filter>
                   <category android:name="android.intent.category.DEFAULT"/>
     </intent-filter>

    • 、插件程序的功能
    插件可以包含任意类,如同一个普通的apk工程一样。
    但是,向主程序提供调用的类,必须是个activity,方法必须是无返回值的,有且只有一个Context参数,框架会反射这个方法,并将主程序的context句柄传入,也就是,不管你用不用这个context,他都是被框架传入的。
    如果主程序规定了描述类,也就是框架中需要PluginDescription来调用的bean,在插件工程中,也必须有主程序这个bean,包名也必须一样。插件程序可以直接继承或者更改这个bean的字段,方便主程序去获取这个插件的描述信息。这种方式,是避过框架,给主程序一种方便。
    • 、插件程序的plugin.xml配置
    http://android-application-plug-ins-frame-work.googlecode.com/files/plugin.xml plugin.xml不能改名,必须放在工程的 assets 目录下。
    内容大致是这样:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0"encoding="UTF-8"?>
    <!-- 这个xml配置文件放在插件工程的 assets 目录下 -->
      
      
    <!-- 插件提供的功能(类) -->
    <plugin-features>
      
            <!-- 描述类,这个是自定义的 -->
            <!-- 这个描述类使用户定义的,在主程序中必须有,插件工程中也必须有,并被继承 -->
            <description name="org.pakage.name.and.description.name"/>
              
            <!-- 这是一个功能(类),必须是activity的子类 -->
            <feature name="org.pakage.name.and.activity.name1">
              
                    <!-- 这是一个方法 -->
                    <!-- name 方法名 -->
                    <method need-context="true"name="methodName1">描述信息</method>
                    <method need-context="true"name="methodName2">描述信息</method>
                      
            </feature>
              
            <feature name="org.pakage.name.and.activity.name2">
                    <method need-context="true"name="methodName1">描述信息</method>
            </feature>
    </plugin-features>

    按着上面的套路来配置,就很容易了。
    最后
    上面说的比较泛,最好还是看看示例工程,里面包含了一个主程序和两个插件扩展,总共是4个工程,也就是说,在用户端是4个apkhttp://android-application-plug-ins-frame-work.googlecode.com/files/demo.zip


    开源项目地址:https://code.google.com/p/android-application-plug-ins-frame-work/

    作者博客:http://hangxin1940.cnblogs.com/
    展开全文
  • 我们团队把一个10万行安卓代码的旧项目(电商系统管理台App),使用Small框架做了插件化改造。把项目分成了10多个插件模块,解除了业务模块之间的代码耦合,为业务功能的快速迭代和多团队并行开发做好基础架构。迁移...

    我们团队把一个10万行安卓代码的旧项目(电商系统管理台App),使用Small框架做了插件化改造。把项目分成了10多个插件模块,解除了业务模块之间的代码耦合,为业务功能的快速迭代和多团队并行开发做好基础架构。迁移期间遇到了一些坑,但最后在大家的努力下基本得到了解决,也感谢Small的作者光亮对我们提出的issue的快速响应。

    Small的应用场景

    开发时:让你完全透明的像开发普通工程一样完成插件开发
    编译时:自动化的帮助你分离各个公共库、业务模块插件(插件仅保留自身的代码跟资源,达到最小化)
    运行时:运用最少量的Hook无缝的将各个插件并入宿主,让代码跟资源完全融合,自由调用
    所以撇开开发者不用关注的(2)来说,Small的目的就是要做到保证开发者「畅快开发」的体验,以及App使用者「顺畅使用」的体验。

    插件化方案有很多,很难有统一的形态,各有各的适用场景。如果你需要分发你的插件给别人使用,Small无法满足;如果你想利用插件化拆分、重组自己的应用,我认为Small在这方面已经走在了前面,并且将不断完善,做到极致。

    插件化的工程(开发)结构

    关于工程(开发)结构的讨论
    1.依赖管理:Small使用同一个ClassLoader加载不同的插件,因此不同插件中的依赖在运行时对其他插件和宿主都是可见的,所以依赖的管理一定要收敛,统一管理,避免各自引入。
    2.插件之间的通信:插件的开发一般都是多team并行的,插件之间应避免直接调用来减少耦合
    3.资源的使用:由于small的特性,runtime各插件的资源也是可以相互访问的,但在开发上需要组织和统一管理好,包括命名和安全的使用资源。

    老项目集成Small插件的官方建议

    基本原则

    宿主中不要放业务逻辑。只做加载插件以及调起主插件的操作。

    重构步骤

    1. 拆lib.* - 公共模块插件
      把各个第三方库拆出来做成一个个lib.*插件模块,包括统计、地图、网络、图片等库。
      把老项目积累的业务公共代码(utils)分离出来封装成一个lib.utils插件
      把基础的样式、主题分离出来封装成一个lib.style插件
    2. 拆app.* - 业务模块插件
      把业务模块拆成app.*模块,他们可以依赖lib.*模块,显示调用lib.*中的各个API
      相对独立的业务模块先拆,比如“详情页”、“关于我们”,如果剩下的业务不好拆,先放一个插件里
      如果都不好拆,先把全部业务做成一个app.main主插件

    插件之间的通信

    插件之间的通信/互调
    目前的插件之间的通信仅限于Small.openUri(),用来调起其它插件的页面。

    但有些时候,我们还是需要操作一下其它插件。 比如说在跳转到另一个插件的页面之前,需要查询一下对方插件的一个状态。
    我觉得应该借助v4包的LocalBroadcastManager来实现

    老项目集成Small插件化遇到的坑

    1. 插件中通过startActivityForResult获取不到数据问题。如果启动的Activity是SingleTask启动模式,有这个问题。

    2. 插件lib2依赖插件lib1,导致同时依赖lib1和lib2的插件app1编译时出现找不到类的情况。

    3. 一个lib依赖另一个lib,buildLib时出现Duplicate package错误
      一个lib依赖另一个lib,buildLib时出现下面的错误,目前还没有找到解决吧,clean工程和cleanLib都做了,但还不行,只好把依赖去掉了才行。原因未知

    4. 如果插件用到了百度地图等,需要把相关的功能放在一个插件下面,注意那些很大的.so是放在插件里面的

    5. Small插件中是支持aar引用的,实际使用过了

    6. Small的插件限制了包名,因此已有代码复制过来会有改变。特别要注意layout文件中自定义控件包名的改动,能够通过编译但运行时会找不到类。

    7. 通过assembleRelease单独编译一个插件出现下面的错误,但有的电脑能正常单独编译插件,原因未知,已经提issue。

      下午2:30:54: Executing external task 'assembleRelease'...
      Configuration on demand is an incubating feature.
      Incremental java compilation is an incubating feature.
      
      FAILURE: Build failed with an exception.
      
      * What went wrong:
      A problem occurred configuring project ':app.me'.
      > Could not find property 'android' on project ':app'.
      
      * Try:
      Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
      
      BUILD FAILED
    8. 第三方SDK的meta,Service等需要在宿主App的manifest中声明,例如百度地图SDK的定位Service。
    9. lib.utils删除资源后出现编译错误,解决办法是删除public.txt,重新编译lib和bundle
    10. 老代码一些业务上耦合比较紧的页面不容易拆开,可以作为一个模块存在,我们最后拆成了6个大模块。
    11. 目前1.0版本不支持gradle并行编译,在gradle.properties中打开org.gradle.parallel=true 编译会报错

        gradle  buildLib -q
      [Small] [Small] building library 1 of 2 - app (0x7f)
      [Small] [Small] building library 1 of 2 - app (0x7f)
      building library 2 of 2 - lib.utils (0x73)
      
      FAILURE: Build failed with an exception.
      
      * What went wrong:
      Execution failed for task ':lib.utils:preBuild'.
       ./build-small/intermediates/small-pre-link/aar/app-D.txt (No such file or directory)

      参考gradle文档
      这个不是Bug,有依赖的工程肯定是不能并行编译的

    后面遇到问题会持续更新

    参考文章

    https://github.com/wequick/Small/issues

    展开全文
  • 2.技能描述这块尽量只写你懂得而且理解深刻的,可以适当加入一些新技术或流行框架,不过这块需要理解,没来得及看源码的可以看看大神们对它的总结,网上一大堆。 3.项目经验这块尽量加入关键词,比如使用了什么技术...

    前言

    网上有很多对程序员简历的一些指导,这里就不重述,大家可以搜下网上其他大神的总结,结合自身情况修改下。我有几点建议:

    1.尽量不要花哨,程序员和设计师或者产品运营还不一样,我们的简历成功与否决定权还是在技术面试官那,而他们看重的是你的项目经验内容和技术等描述。

    2.技能描述这块尽量只写你懂得而且理解深刻的,可以适当加入一些新技术或流行框架,不过这块需要理解,没来得及看源码的可以看看大神们对它的总结,网上一大堆。

    3.项目经验这块尽量加入关键词,比如使用了什么技术、用到哪些设计模式、优化数据对比、扩展总结之类的。而非一味地介绍这个项目内容(那是产品经理的描述),比如性能优化这块,分为UI性能优化、内存优化、数据库优化、网络优化、耗电优化等等。可以从1.如何发现问题,2.怎么解决问题,3.解决效果对比,这几个方面去描述。举个简单例子——UI优化,可以从 UI出现什么问题(卡顿不流畅),怎么查找问题(手机开发者权限>GPU过度绘制 发现层级问题,TraceView CPU使用情况分析),怎么解决问题(降低层级、自定义View绘图出现问题等),解决问题后性能再次对比。

    几年过去了,桌面开发已经基本死了,现在轮到Android开发了?

    有没有发现,这之间有什么不同?桌面开发死的是整个生态,就像实体经济转向了互联网购物一样,整个生态全部死掉,导致了跟桌面开发的各种岗位都不再招人,使得无论开发、产品、运营都必须原有的SEO优化、寻找网站流量转移到移动端。

    而现在的Android则不同,它并没有死,相反,移动互联网现在已经发展的非常成熟,并且随着5G的到来,机会将大大增加。

    那为什么大家会觉得Android开发不行了呢?无外乎是因为现在Android原生Native开发在逐渐转型,因为Native开发耗时但无法跨平台,无法做到像RN\Weex\Flutter一样,写一遍代码,多端运行的效果。

    资本都是逐利的,顾家辉曾说:不以营利为目的公司都是在耍流氓。面对如此高效的产品生产方式,如果你是老板,你会不选择吗?尤其是创业公司。

    那问题来了,那为什么依然有Android Native开发呢?因为它是原生的,所有的交互与效率都是最高的,对于大公司而言,不仅要讲究速度,又要讲究APP的运行效率及各项指标。所以,大公司更偏向于Native开发,而小公司更偏向于快速开发。

    因此很多小公司不再招Android Native开发,这就导致Android原生岗位的减少。对于初学者而言,小公司岗位少,大公司进不去,这就是为什么培训公司都不再培训Android的原因。这就出现了安卓已死的论调。所以说,并不是Android已死,是门槛高了而已。

    现在培训公司喜欢培训H5,学会保就业的承诺永久不变。这就是因为RN\Weex\Flutter的语法与H5相似,学了H5,除了能做原有的WEB开发以后,跨平台语言RN\WEEX\Flutter使H5的岗位大大增加,所以并不是H5好学,也并不是因为它火,只是它就业门槛低了而已。

    同样的,即便你从H5开始进入跨平台开发语言,你以为会了RN\Weex\Flutter就不需要Android原生了?只是Androd底层架构不变,Android原生永远是需要学习的,所有的上层跨平台应用都是靠原生控件来实现的。Flutter可能有所例外,但Flutter是用Dart语言来写的,大家都不会,谁也别看不起谁,而且Flutter可以与Android原生完美兼容。

    从商家逐利的本质上看,跨平台开发是趋势,即便RN\Weex\Flutter哪一天都挂了,还是会出来另一个跨平台语言一统天下。这个世界上,唯一不变的就是变化。

    所以,Android不会死,但Android的门槛会提高。想在Android领域成就一翻作为,除了Android原生也需要了解跨平台开发。如果你是新入门的同学,我建议你在了解Android基本使用后,以跨平台开发学习为主,先找到一份工作(毕业就校招进入大公司的除外)。如果你的Android从业者,我建议大家学习跨平台语言,使自己永远立于不败之地,不要等到哪一天黑天鹅来了,欲哭无泪。(黑天鹅全称为黑天鹅事件,指目前无法预知的突发事件)

    最后

    Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。

    人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。

    我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。

    资源持续更新中,欢迎大家一起学习和探讨。

    展开全文
  • 不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真正的插件化,它是伪的,插件并非与它的主程序分离开...
  • RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案。我们“逐词”拆开来解释这个定义: 完整的:让插件运行起来“像单品那样”,支持大部分特性 稳定的:如此灵活完整的情况下,其框架崩溃率仅为...
  • 一、uni-app (app混合开发)uni-app是一个使用Vue.js开发跨平台个人文库应用的前端框架,开发者编写一套代码,可编译到的iOS,安卓,H5,小程序等多个 平台。二、vue-cli3+cordova (app混合开发)三、element-ui (后台...
  • 安卓app加固、插件化开发过程中,DexClassLoader用的比较多。像现在的各种类Xposed的框架在加载外部插件的时候,也使用了DexClassLoader来进行动态加载模块,然后反射调用插件配置的入口方法。 在8.0系统以后,...
  • AKjs是一个基于jQuery的一套构建用户界面的前端框架插件里包含着移动端常用的功能效果以及简单明了的CSS样式库,对IOS和安卓系统的兼容性很完美。支持前后端分离开发和路由模式跳页方式。它与其他重量级框架不同的...
  • 通过合作和一体化开发核心技术,软件工具开发者可以利用平台的重复使用功能,专注于核心技术,创建新的开发技术。 JBuilder, Eclipse, Neebeans 是3种应用比较普遍的Java开发的平台,如果你以后想走java这条路,...
  • apkplug是安卓APP模块化开发解决方案,通过该框架可以使用未安装apk文件的代码和资源,并且与宿主完美的融合在一起。
  • 我在学习时找到了一个框架:android-application-plug-ins-frame-work...不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个框架
  • 可视化开发_AppInventor2似乎被抛弃了

    千次阅读 2017-03-08 09:34:00
    工具blockly google,mixly,scratch,app inventor2 的分别可视编程,青...使用安卓插件开发框架,我研究了很久,国内有成熟的,什么360自己搞的DroidPlugingoogle i/o 2016 Scratch Blocks_百度搜索http://mt....
  • Wex5 开发工具及相关插件安装

    千次阅读 2018-01-12 10:07:25
    WeX5是跨端移动开发框架,将H5的标签封装成组件,实现可视、组件快速开发。实现一次开发,多端(iOS、安卓和微信)运行。前端采用H5 + CSS3 + JS标准,使用AMD规范的RequireJS、Bootstrap、jQuery等技术;基于...
  • ButterKnife是控件注入框架,可以帮助安卓开发者省去初始控件的重复性工作,简单快捷地初始布局文件中的控件,极大地提升开发效率。 1. 背景 在一般app中我们都是单组件开发,即只有一个主moduel,所有代码...
  •  最近研究了一下安卓插件化开发框架,查阅了几篇大牛的Blog:  http://blog.csdn.net/singwhatiwanna/article/details/22597587, 膜拜的同时也引发了一些疑问,特在此提出拙见,有不对的地方还请指正。这篇博...
  • AKjs是一个基于jQuery的一套构建用户界面的前端框架插件里包含着移动端常用的功能效果以及简单明了的CSS样式库,对IOS和安卓系统的兼容性很完美。支持前后端分离开发和路由模式跳页方式。它与其他重量级框架不同的...
  • 热修复和插件化是目前 Android 领域很火热的两门技术,也是 Android 开发工程师必备的技能。 目前比较流行的热修复方案有微信的 Tinker,手淘的 Sophix,美团的 Robust,以及 QQ 空间热修复方案。 QQ 空间热修复方案...
  • 介绍 这个框架的初衷,是为了方便让程序模块化、插件...不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个框架。 (腾讯微信并不是真...
  • 热修复和插件化是目前 Android 领域很火热的两门技术,也是 Android 开发工程师必备的技能。 目前比较流行的热修复方案有微信的 Tinker,手淘的 Sophix,美团的 Robust,以及 QQ 空间热修复方案。 QQ 空间热修复...

空空如也

空空如也

1 2 3 4
收藏数 76
精华内容 30
关键字:

安卓插件化开发框架使用