CN109542445A - 一种Android插件化开发的方法和装置 - Google Patents

一种Android插件化开发的方法和装置 Download PDF

Info

Publication number
CN109542445A
CN109542445A CN201710646050.0A CN201710646050A CN109542445A CN 109542445 A CN109542445 A CN 109542445A CN 201710646050 A CN201710646050 A CN 201710646050A CN 109542445 A CN109542445 A CN 109542445A
Authority
CN
China
Prior art keywords
plug
engineering
resource
unit
packet
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201710646050.0A
Other languages
English (en)
Inventor
别力
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Century Trading Co Ltd, Beijing Jingdong Shangke Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN201710646050.0A priority Critical patent/CN109542445A/zh
Publication of CN109542445A publication Critical patent/CN109542445A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/61Installation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例提供一种Android插件化开发的方法和装置,涉及计算机技术领域。本发明实施例的方法包括:将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包;将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包;在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。本发明实施例的方法将公共资源和公共代码以独立依赖包的形式编译进宿主工程以提供给插件工程使用,实现了Android平台APP工程的插件化开发,各个模块解耦,大大提升编译速度,提高开发效率。

Description

一种Android插件化开发的方法和装置
技术领域
本发明涉及计算机领域,尤其涉及一种Android插件化开发的方法和装置。
背景技术
移动互联网爆发式发展,用户的上网消费购物等生活习惯迅速从PC(PersonalComputer,私人电脑)端往手机上迁移,很多主流的线上线下场景都可以通过移动APP(Application,应用程序)来完成,移动APP承载了大量的业务和功能,随着业务和体量的迅速增长,导致APP越来越臃肿,开发难度也越来越大,给APP开发人员非常大的挑战。
现有技术中使用APP开发的过程为:
(1)使用开源的版本控制***(Subversion,SVN)或者开源的分布式版本控制***(GIT)等代码管理工具集中管理所有源代码;
(2)使用安卓集成开发工具(Android Studio)编译源代码内的所有资源和代码,以得到可执行代码;
(3)使用Android Studio将可执行代码整体打包得到APK(AndroidPackage)安装包;
(4)将APK安装包发布到各个应用市场。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
(1)源代码集中管理导致代码库过于庞大,代码耦合程度高,更新慢,编译出错几率大,一个模块出错阻塞整个APP编译,严重影响开发效率;
(2)整体编译速度慢,尤其是在Windows平台上,Android开发工具本身是基于JAVA(是一种面向对象的编程语言)虚拟机平台,运行效率慢,再在其基础上编译运行庞大的代码库,导致编译速度非常慢;
(3)线上Bug(表示程序中出现的缺陷或者问题)无法快速修复,由于所有的代码和资源在编译时就已经打包进APK安装包,在运行时,已经编译进去的所有代码和资源不可再改变,一旦线上环境出现Bug,无法及时修复,只能通过发布新版本更新整个APP来解决,代价非常昂贵;
(4)无法选择性更新模块,在只有某一个模块需要上线新功能时,也需要对整个APP发布新版本。
发明内容
有鉴于此,本发明实施例提供一种Android插件化开发的方法和装置,将公共资源和公共代码以独立依赖包的形式编译进宿主工程以提供给插件工程使用,实现了Android平台APP工程的插件化开发,各个模块解耦,大大提升编译速度,提高开发效率。
为实现上述目的,根据本发明实施例的一个方面,提供了一种Android插件化开发的方法。
本发明实施例的一种Android插件化开发的方法,包括:将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包;将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包;在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。
可选地,所述方法还包括:为所述宿主工程的资源、所述公共资源和所述各插件工程的资源设置不同的资源标识,所述各插件工程的资源设置规则为:所述各插件工程的资源的包标识与所述宿主工程的资源、公共资源的包标识不同且所述各插件工程之间的包标识均不相同;将所述各插件工程的***默认的包标识替换为设置的所述包标识。
可选地,构造加载运行环境,包括:加载所述各插件工程的资源和代码。
可选地,加载所述各插件工程的资源,包括:创建持有所有所述插件工程的安装包的路径的资产管理类;自定义委托资源加载类,将创建的所述资产管理类的实例传入所述委托资源加载类的构造方法中以将***中资产管理类的实例替换为创建的所述资产管理类的实例;采用Hook技术将***的资源加载类替换为所述委托资源加载类。
可选地,采用Hook技术将所述插件工程的安装包的路径添加到类加载器的路径列表中。
为实现上述目的,根据本发明实施例的另一方面,提供了一种Android插件化开发的装置。
本发明实施例的一种Android插件化开发的装置,包括:依赖包生成模块,用于将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包;编译打包模块,用于将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包;环境构造模块,用于在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。
可选地,所述装置还包括:资源标识设置模块,用于为所述宿主工程的资源、所述公共资源和所述各插件工程的资源设置不同的资源标识,所述各插件工程的资源设置规则为:所述各插件工程的资源的包标识与所述宿主工程的资源、公共资源的包标识不同且所述各插件工程之间的包标识均不相同;包标识替换模块,用于将所述各插件工程的***默认的包标识替换为设置的所述包标识。
可选地,所述环境构造模块包括:加载所述各插件工程的资源和代码。
可选地,所述环境构造模块包括:创建持有所有所述插件工程的安装包的路径的资产管理类;自定义委托资源加载类,将创建的所述资产管理类的实例传入所述委托资源加载类的构造方法中以将***中资产管理类的实例替换为创建的所述资产管理类的实例;采用Hook技术将***的资源加载类替换为所述委托资源加载类。
可选地,采用Hook技术将所述插件工程的安装包的路径添加到类加载器的路径列表中。
为实现上述目的,根据本发明实施例的再一方面,提供了一种电子设备。
本发明实施例的一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例的一种Android插件化开发的方法。
为实现上述目的,根据本发明实施例的再一方面,提供了一种计算机可读介质。
本发明实施例的一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例的一种Android插件化开发的方法。
上述发明中的一个实施例具有如下优点或有益效果:将公共资源和公共代码以独立依赖包的形式编译进宿主工程以提供给插件工程使用,将插件工程代码从原有工程抽出后依赖此依赖包开发即可,降低插件化实施难度,使工程集中式开发能够平滑切换到插件式开发模式;本发明实施例的插件化开发方法将模块解耦,大大提升编译速度,减少编译出错的几率,极大提高开发效率;采用Hook技术,对***应用程序接口(ApplicationProgramming Interface,API)进行轻量级Hook,以在内存中动态加载插件;线上出现Bug时可以对相应模块进行动态修复,只需将该插件工程修复后部署到服务端,客户端从服务端下载该插件工程的APK安装包即可,无需重新发布新版本;可指定模块进行升级,无需更新整个APP。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的Android插件化开发的方法的主要步骤的示意图;
图2是根据本发明实施例的Android插件化开发的***架构图;
图3是根据本发明实施例的加载各插件工程的资源的流程图;
图4是根据本发明实施例的Android插件化开发的装置的主要模块的示意图;
图5是本发明实施例可以应用于其中的示例性***架构图;
图6是适用于来实现本发明实施例的电子设备的计算机装置的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是根据本发明实施例的Android插件化开发的方法的主要步骤的示意图。如图1所示,本发明实施例的Android插件化开发的方法,主要包括如下步骤:
步骤S101:将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包。将Android平台的APP工程划分为一个宿主工程和至少一个插件工程,一个业务模块独立为一个插件工程,该插件工程中只包含与本业务模块相关的代码,将各个插件工程都使用的代码和资源对应作为公共代码和公共资源,将公共代码和公共资源生成独立依赖包输出,该独立依赖包后续会被直接编译进宿主工程。本发明的实施例形成的依赖包为AAR格式,AAR(Android Archive)包是Android库项目的二进制归档文件,可被其他工程依赖使用。
步骤S102:将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包。Android开发中,如果APP工程中使用了第三方的某个代码库(比如OkHttp,是一个处理网络请求的开源项目),那么APP工程会自动将OkHttp编译进去。将插件工程本身的代码和资源导出形成标准的APK安装包,公共代码和公共资源只是依赖而不打包到插件工程的APK安装包中,后续在宿主工程中通过构造插件工程的运行环境来加载运行插件工程的APK安装包。
步骤S103:在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。将各个业务模块实施插件化以后,插件工程的APK安装包并不是直接安装在手机上,无法交由***来直接处理,需要宿主程序的APK安装包自身来构造一个插件工程的APK安装包的加载运行环境,由这个环境加载和运行各插件工程的资源和代码。
图2是根据本发明实施例的Android插件化开发的***架构图。如图2所示,本发明实施例的Android插件化开发的***包括一个宿主工程和多个插件工程,将各插件工程都使用的代码和资源抽取出来作为公共代码和公共资源,将公共代码和公共资源编译形成独立的依赖包,后续将该依赖包直接编译进宿主工程。宿主工程的APK安装包可直接安装在设备上,宿主工程的APK安装包运行后开始构造插件工程的APK安装包的加载运行环境,插件工程的APK安装包有了这个环境以后,在使用到插件工程的APK安装包的时候就可以运行起来。
下面对步骤S102中编译的具体实现进行详细说明:Android源代码主要包括代码和资源两部分,所以其编译也主要分成两个代码和资源部分。
其中,代码的编译过程为:将JAVA源文件编译成JAVA字节码,再将JAVA字节码链接成Dex(Android平台的可执行文件)字节码。上述编译过程需要对齐插件工程依赖的JAR包后再进行正常编译。
其中,资源的编译过程为:为所述宿主工程的资源、所述公共资源和所述各插件工程的资源设置不同的资源标识,所述各插件工程的资源设置规则为:所述各插件工程的资源的包标识与所述宿主工程的资源、公共资源的包标识不同且所述各插件工程之间的包标识均不相同;将所述各插件工程的***默认的包标识替换为设置的所述包标识。
在Android中查找定位资源时,需要通过唯一的资源标识(ResourceID)来查找,Resource ID是整型值,该值通过Android的软件开发工具包(Software Development Kit,SDK)中自带的安卓资源打包工具(Android Asset Packaging Tool,AAPT)生成,其具体结构为:ResourceID=Package ID+Type ID+Entry ID。其中,Package ID为包标识,用来限定资源的来源;Type ID是资源的类型标识,每一种资源类型会被赋予一个标识;Entry ID是在具体的类型下资源实体的标识。
在上述具体结构中,Package ID的取值规则为:Android平台的***资源PackageID均等于0x01,用户资源的Package ID均等于0x7f,所有位于[0x01-0x7f]之间的PackageID都是合法的。其中,用户资源是指开发者在工程中自己引入的资源,比如自己定义的一个字符串,自己引入的一张图片。Android平台的Package ID的取值规则见表1:
表1为Package ID的取值规则表
***资源 用户资源 合法ID范围
Package ID 0x01 0x7f [0x01,0x7f]
下面分别以***资源和用户资源为例,对Resource ID进行说明:***资源:如public static final int ok=0x01040000;其中,0x01表示Package ID,04表示Type ID,0000表示Entry ID。用户资源:如publicstatic final int app_name=0x7f060001;其中,0x7f表示Package ID,06表示Type ID,0001表示Entry ID。
参照上述背景,由于公共资源会直接编译进宿主工程的APK安装包,为防止宿主资源、公共资源以及不同插件工程两两之间出现资源冲突(比如宿主资源A、公共资源B、插件工程C和插件工程D,需要放置A、B、C、D两两之间不发生资源冲突),需进行如下规范约束:
(1)公共资源采用独立的命名空间,其Resource ID中的PackageID采用***默认的0x7f;命名空间默认为APP的包名,比如包名为test.com,则资源的命名空间为test.com.R,该包名可在Android的清单文件中配置;
(2)宿主资源使用***默认的命名空间,其Resource ID中的Package ID采用***默认的0x7f,但是不允许与公共资源的命名相同,即宿主资源与公共资源的Type ID或者Entry ID不同;
(3)其他插件工程的Package ID取值范围为(0x01,0x7f),每个插件工程分配不同的Package ID,这样就完全避免了宿主资源、公共资源以及不同插件之间的Resource ID冲突。不同插件的Package ID具体分配规则见表2:
表2为不同插件的Package ID分配表
插件工程1 插件工程2 插件工程125
Package ID 0x02 0x03 0x7e
对资源进行编译后,所有的资源会由AAPT工具生成一个整型索引,并写入到R.java文件中。为了按照上述规范约束生成Resource ID,需要进行的操作为:
(1)对AAPT源代码进行改造,以实现在插件工程的Package ID写入的时候,替换掉***默认的0x7f,写入自己分配的Package ID。具体实现为:在AAPT源代码中新增一个--apk-packageid参数,重新编译生成AAPT工具,插件工程的Package ID使用预先分配好的值,通过--apk-packageid参数传递给AAPT工具解析,这样AAPT工具就会使用传入进来的Package ID代替***默认的0x7f。
(2)将公共资源设置为只参与编译,不写入到插件工程的R.java文件中。具体实现方式为:在Android Studio中将公共资源的依赖方式设置为dependencies。这样插件工程的R.java文件中就不包含公共资源的Resource ID,不会与宿主工程中的公共资源或者其他插件工程冲突。
下面对步骤S103中加载运行环境的具体实现分为加载插件工程的资源和代码两部分进行详细说明:
其中,加载资源的过程:Android的资源加载由资源加载(Resources)类和资产管理(AssetManager)类完成,Resources类和AssetManager类是由***初始化时构造的,***通过AssetManager类将APP自身的APK安装包路径添加进去,然后交给AssetManager类按照Resource ID的规则进行查找。然而,将工程插件化后***的AssetManager类不包含插件工程的APK安装包的路径,无法直接由***默认的Resources类和AssetManager类处理。
图3是根据本发明实施例的加载各插件工程的资源的流程图。如图3所示,本发明实施例的加载各插件工程的资源,可以通过以下步骤实现:
步骤S301:创建所有插件工程的APK安装包的路径的AssetManager类。AssetManager类无法直接调用其构造函数,可以通过newInstance方法构造AssetManager类的一个实例,通过反射调用隐藏的addAssetPath方法,将每个插件APK文件的路径作为参数传入,这样构造出来的AssetManager类就持有了所有插件工程的APK安装包的路径。
步骤S302:自定义委托资源加载(DelegateResource)类,将***中AssetManager的实例替换为创建的DelegateResource类的实例。自己定义一个DelegateResources类继承自***的Resources类,将步骤(1)中创建的AssetManager类的实例,传入DelegateResources类的构造方法中,这样就将***的AssetManager实例替换成了自己创建的AssetManager类的实例。
步骤S303:采用Hook技术将***的Resources类替换为DelegateResource类。Hook技术是一种用于改变API执行结果的技术。具体实现为:
①Hook ActivityThread类,将ActivityThread类LoadedApk实例中的mResources成员变量替换成自定义的DelegateResources类的实例。APP在启动的时候会将安装的APK安装包转化为一个内存对象的LoadedApk实例。
②Hook ContextImpl类,将ContextImpl类中的mResources成员变量替换成自定义的DelegateResources类的实例。
③Hook Activity类,将Activity类的mResources成员变量替换成自定义的DelegateResources类的实例。Activity类由ActivityThread类的成员变量mInstrumentation创建,在Activity创建后,Hook Activity类。
其中,加载代码的过程:Android***加载类默认由类加载器PathClassLoader完成,PathClassLoader有一个DexPathList类型的成员变量pathList,APP启动初始化后pathList成员变量会在内存中持有APP的Dex字节码,只需将插件工程的APK安装包的路径添加到pathList中,即可由***的PathClassLoader来加载代码。具体步骤说明如下:
(1)Hook PathClassLoader中的DexPathList类型的成员变量pathList;该步骤的目的是获取PathClassLoader的pathList成员变量。
(2)Hook调用pathList成员变量中的loadDexFile方法,将插件工程的APK安装包和Dex化的输出目录传入到loadDexFile方法中以生成一个DexFile类型的实例;该步骤中Dex化的结果会释放出一个.dex为后缀名的文件,输出目录是自定义的,在APP安装程序目录下即可;APK安装包中的Dex文件最终会在内存创建一个DexFile实例。
(3)Hook DexPathList类的dexElements成员变量;该步骤的目的是获取到步骤(1)中的pathList的dexElements成员变量。
(4)将步骤(2)中生成的DexFile实例构建成一个Element实例,将该Element实例放入步骤(3)获取的dexElements成员变量中。
通过本发明实施例的Android插件化开发的方法可以看出,将公共资源和公共代码以独立依赖包的形式编译进宿主工程以提供给插件工程使用,将插件工程代码从原有工程抽出后依赖此依赖包开发即可,降低插件化实施难度,使工程集中式开发能够平滑切换到插件式开发模式;本发明实施例的插件化开发方法将模块解耦,大大提升编译速度,减少编译出错的几率,极大提高开发效率;采用Hook技术,对***API进行轻量级Hook,以在内存中动态加载插件;线上出现Bug时可以对相应模块进行动态修复,只需将该插件工程修复后部署到服务端,客户端从服务端下载该插件工程的APK安装包即可,无需重新发布新版本;可指定模块进行升级,无需更新整个APP。
图4是根据本发明实施例的Android插件化开发的装置的主要模块的示意图。如图4所示,本发明实施例的Android插件化开发的装置400,主要包括:
依赖包生成模块401,用于将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包。将Android平台的APP工程划分为一个宿主工程和至少一个插件工程,一个业务模块独立为一个插件工程,该插件工程中只包含与本业务模块相关的代码,将各个插件工程都使用的代码和资源对应作为公共代码和公共资源,将公共代码和公共资源生成独立依赖包输出,该独立依赖包后续会被直接编译进宿主工程。本发明的实施例形成的依赖包为AAR格式。
编译打包模块402,用于将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包。将插件工程本身的代码和资源导出形成标准的APK安装包,公共代码和公共资源只是依赖而不打包到插件工程的APK安装包中,后续在宿主工程中通过构造插件工程的运行环境来加载运行插件工程的APK安装包。
环境构造模块403,用于在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。将各个业务模块实施插件化以后,插件工程的APK安装包并不是直接安装在手机上,无法交由***来直接处理,需要宿主程序的APK安装包自身来构造一个插件工程的APK安装包的加载运行环境,由这个环境加载和运行各插件工程的资源和代码。实施例中采用Hook技术构造加载运行环境以加载所述各插件工程的资源和代码。
另外,本发明实施例的Android插件化开发的装置还包括:资源标识设置模块和包标识替换模块(这两个模块图中未示出),资源标识设置模块用于为所述宿主工程的资源、所述公共资源和所述各插件工程的资源设置不同的资源标识,所述各插件工程的资源设置规则为:所述各插件工程的资源的包标识与所述宿主工程的资源、公共资源的包标识不同且所述各插件工程之间的包标识均不相同;包标识替换模块,用于将所述各插件工程的***默认的包标识替换为设置的所述包标识。
从以上描述可以看出,将公共资源和公共代码以独立依赖包的形式编译进宿主工程以提供给插件工程使用,将插件工程代码从原有工程抽出后依赖此依赖包开发即可,降低插件化实施难度,使工程集中式开发能够平滑切换到插件式开发模式;本发明实施例的插件化开发方法将模块解耦,大大提升编译速度,减少编译出错的几率,极大提高开发效率;采用Hook技术,对***API进行轻量级Hook,以在内存中动态加载插件;线上出现Bug时可以对相应模块进行动态修复,只需将该插件工程修复后部署到服务端,客户端从服务端下载该插件工程的APK安装包即可,无需重新发布新版本;可指定模块进行升级,无需更新整个APP。
图5示出了可以应用本发明实施例的Android插件化开发的方法或Android插件化开发的装置的示例性***架构500。
如图5所示,***架构500可以包括终端设备501、502、503,网络504和服务器505。网络504用以在终端设备501、502、503和服务器505之间提供通信链路的介质。网络504可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备501、502、503通过网络504与服务器505交互,以接收或发送消息等。终端设备501、502、503上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。
终端设备501、502、503可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器505可以是提供各种服务的服务器,例如对用户利用终端设备501、502、503所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。
需要说明的是,本申请实施例所提供的Android插件化开发的方法一般由服务器505执行,相应地,Android插件化开发的装置一般设置于服务器505中。
应该理解,图5中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
根据本发明的实施例,本发明还提供了一种电子设备和一种计算机可读介质。
本发明的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例的一种主从集群切换的方法。
本发明的计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例的一种主从集群切换的方法。
下面参考图6,其示出了适用于来实现本发明实施例的电子设备的计算机***600的结构示意图。图6示出的电子设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图6所示,计算机***600包括中央处理单元(CPU)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储部分608加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作和处理。在RAM 603中,还存储有计算机***600操作所需的各种程序和数据。CPU 601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
以下部件连接至I/O接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至I/O接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装入存储部分608。
特别地,根据本发明公开的实施例,上文主要步骤图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行主要步骤图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。在该计算机程序被中央处理单元(CPU)601执行时,执行本发明的***中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行***、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行***、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的***、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括依赖包生成模块、编译打包模块和环境构造模块。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,依赖包生成模块还可以被描述为“将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包的模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包;将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包;在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。
从以上描述可以看出,将公共资源和公共代码以独立依赖包的形式编译进宿主工程以提供给插件工程使用,将插件工程代码从原有工程抽出后依赖此依赖包开发即可,降低插件化实施难度,使工程集中式开发能够平滑切换到插件式开发模式;本发明实施例的插件化开发方法将模块解耦,大大提升编译速度,减少编译出错的几率,极大提高开发效率;采用Hook技术,对***API进行轻量级Hook,以在内存中动态加载插件;线上出现Bug时可以对相应模块进行动态修复,只需将该插件工程修复后部署到服务端,客户端从服务端下载该插件工程的APK安装包即可,无需重新发布新版本;可指定模块进行升级,无需更新整个APP。
上述产品可执行本发明实施例所提供的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明实施例所提供的方法。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (12)

1.一种Android插件化开发的方法,其特征在于,包括:
将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包;
将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包;
在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
为所述宿主工程的资源、所述公共资源和所述各插件工程的资源设置不同的资源标识,所述各插件工程的资源设置规则为:所述各插件工程的资源的包标识与所述宿主工程的资源、公共资源的包标识不同且所述各插件工程之间的包标识均不相同;
将所述各插件工程的***默认的包标识替换为设置的所述包标识。
3.根据权利要求1所述的方法,其特征在于,构造加载运行环境,包括:加载所述各插件工程的资源和代码。
4.根据权利要求3所述的方法,其特征在于,加载所述各插件工程的资源,包括:
创建持有所有所述插件工程的安装包的路径的资产管理类;
自定义委托资源加载类,将创建的所述资产管理类的实例传入所述委托资源加载类的构造方法中以将***中资产管理类的实例替换为创建的所述资产管理类的实例;
采用Hook技术将***的资源加载类替换为所述委托资源加载类。
5.根据权利要求3所述的方法,其特征在于,加载所述各插件工程的代码,包括:采用Hook技术将所述插件工程的安装包的路径添加到类加载器的路径列表中。
6.一种Android插件化开发的装置,其特征在于,包括:
依赖包生成模块,用于将各插件工程都使用的公共代码和公共资源进行编译以生成依赖包;
编译打包模块,用于将宿主工程的源代码和所述依赖包进行编译打包以得到所述宿主工程的安装包,将不包含所述公共代码和公共资源的所述各插件工程的源代码进行编译打包以得到所述各插件工程的安装包;
环境构造模块,用于在所述宿主工程的安装包中构造加载运行环境以加载和运行所述各插件工程的安装包。
7.根据权利要求6所述的装置,其特征在于,所述装置还包括:
资源标识设置模块,用于为所述宿主工程的资源、所述公共资源和所述各插件工程的资源设置不同的资源标识,所述各插件工程的资源设置规则为:所述各插件工程的资源的包标识与所述宿主工程的资源、公共资源的包标识不同且所述各插件工程之间的包标识均不相同;
包标识替换模块,用于将所述各插件工程的***默认的包标识替换为设置的所述包标识。
8.根据权利要求6所述的装置,其特征在于,所述环境构造模块包括:加载所述各插件工程的资源和代码。
9.根据权利要求8所述的装置,其特征在于,所述环境构造模块包括:
创建持有所有所述插件工程的安装包的路径的资产管理类;
自定义委托资源加载类,将创建的所述资产管理类的实例传入所述委托资源加载类的构造方法中以将***中资产管理类的实例替换为创建的所述资产管理类的实例;
采用Hook技术将***的资源加载类替换为所述委托资源加载类。
10.根据权利要求8所述的装置,其特征在于,所述环境构造模块包括:采用Hook技术将所述插件工程的安装包的路径添加到类加载器的路径列表中。
11.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-5中任一所述的方法。
12.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-5中任一所述的方法。
CN201710646050.0A 2017-08-01 2017-08-01 一种Android插件化开发的方法和装置 Pending CN109542445A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710646050.0A CN109542445A (zh) 2017-08-01 2017-08-01 一种Android插件化开发的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710646050.0A CN109542445A (zh) 2017-08-01 2017-08-01 一种Android插件化开发的方法和装置

Publications (1)

Publication Number Publication Date
CN109542445A true CN109542445A (zh) 2019-03-29

Family

ID=65821461

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710646050.0A Pending CN109542445A (zh) 2017-08-01 2017-08-01 一种Android插件化开发的方法和装置

Country Status (1)

Country Link
CN (1) CN109542445A (zh)

Cited By (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110221877A (zh) * 2019-06-12 2019-09-10 北京字节跳动网络技术有限公司 一种应用程序的运行方法、装置、电子设备、及存储介质
CN110297644A (zh) * 2019-06-24 2019-10-01 深圳市酷开网络科技有限公司 一种首页悬浮应用设置方法、智能终端及存储介质
CN110597516A (zh) * 2019-08-27 2019-12-20 贝壳技术有限公司 插件化代码的混淆方法、装置、电子设备和存储介质
CN110688096A (zh) * 2019-09-10 2020-01-14 平安普惠企业管理有限公司 包含插件的应用程序的构建方法、装置、介质及电子设备
CN110941443A (zh) * 2019-12-12 2020-03-31 支付宝(杭州)信息技术有限公司 修改sdk中文件名的方法、装置及电子设备
CN111026397A (zh) * 2019-10-22 2020-04-17 烽火通信科技股份有限公司 一种rpm包分布式编译方法及装置
CN111061486A (zh) * 2019-12-10 2020-04-24 杭州有赞科技有限公司 一种安卓应用程序增量方法
CN111090425A (zh) * 2019-12-12 2020-05-01 支付宝(杭州)信息技术有限公司 一种程序封装方法、装置及电子设备
CN111258587A (zh) * 2020-01-17 2020-06-09 苏宁云计算有限公司 一种安卓应用插件化的实现方法、装置、设备及存储介质
CN111290760A (zh) * 2020-03-03 2020-06-16 北京字节跳动网络技术有限公司 应用程序编译方法、装置、电子设备及存储介质
CN111309335A (zh) * 2020-02-28 2020-06-19 腾讯音乐娱乐科技(深圳)有限公司 插件应用的编译方法、装置及计算机可读存储介质
CN111367510A (zh) * 2020-02-24 2020-07-03 腾讯音乐娱乐科技(深圳)有限公司 一种安卓功能模块开发的方法及装置
CN111459892A (zh) * 2020-03-31 2020-07-28 民生科技有限责任公司 一种基于安卓***的无侵入性aar合并方法
CN111552524A (zh) * 2020-05-06 2020-08-18 Oppo(重庆)智能科技有限公司 一种插件加载方法、装置及计算机可读存储介质
CN111638882A (zh) * 2020-05-29 2020-09-08 杭州鸿雁电器有限公司 操作界面的生成方法、装置、存储介质和处理器
CN111737504A (zh) * 2020-06-23 2020-10-02 网易(杭州)网络有限公司 图像资源检测方法、装置、设备及存储介质
CN111740876A (zh) * 2020-05-29 2020-10-02 北京沃东天骏信息技术有限公司 一种应用程序、测试方法、存储介质及电子设备
CN112511607A (zh) * 2020-11-18 2021-03-16 上海七牛信息技术有限公司 一种内容分发网络边缘节点***
CN113032039A (zh) * 2021-03-12 2021-06-25 中国工商银行股份有限公司 应用的插件化改造方法、装置、电子设备及存储介质
CN113076147A (zh) * 2021-03-09 2021-07-06 北京一亩田新农网络科技有限公司 动态apk的资源加载方法、装置、***以及介质
CN113076146A (zh) * 2021-03-09 2021-07-06 北京一亩田新农网络科技有限公司 动态apk的加载方法、装置、***以及介质
WO2023202299A1 (zh) * 2022-04-20 2023-10-26 北京字跳网络技术有限公司 一种sdk升级方法、装置以及计算机设备
CN116991491A (zh) * 2022-06-28 2023-11-03 重庆市通信建设有限公司 程序插件加载方法、装置、计算机设备及计算机程序
CN117093286A (zh) * 2023-10-17 2023-11-21 腾讯科技(深圳)有限公司 插件生成方法、装置、设备及计算机可读存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399792A (zh) * 2013-07-24 2013-11-20 佳都新太科技股份有限公司 基于Android的应用插件化实现方案
EP3147783A1 (en) * 2015-09-28 2017-03-29 Semmle Limited Automatic determination of compiler configuration

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399792A (zh) * 2013-07-24 2013-11-20 佳都新太科技股份有限公司 基于Android的应用插件化实现方案
EP3147783A1 (en) * 2015-09-28 2017-03-29 Semmle Limited Automatic determination of compiler configuration

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
_区长: "Android插件化开发之OpenAtlas资源打包工具补丁aapt的编译", 《CSDN博客,HTTPS://BLOG.CSDN.NET/SBSUJJBCY/ARTICLE/DETAILS/47778879》 *
ZJYMAC: "Android Small插件化", 《CSDN博客,HTTPS://BLOG.CSDN.NET/QQ_34398675/ARTICLE/DETAILS/53310639》 *
水缘泡泡: "携程Android App的插件化和动态加载框架", 《HTTPS://WWW.SYPOPO.COM/POST/DJQBX1MW5J/》 *

Cited By (40)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110221877A (zh) * 2019-06-12 2019-09-10 北京字节跳动网络技术有限公司 一种应用程序的运行方法、装置、电子设备、及存储介质
CN110221877B (zh) * 2019-06-12 2022-06-07 北京字节跳动网络技术有限公司 一种应用程序的运行方法、装置、电子设备、及存储介质
CN110297644A (zh) * 2019-06-24 2019-10-01 深圳市酷开网络科技有限公司 一种首页悬浮应用设置方法、智能终端及存储介质
CN110597516A (zh) * 2019-08-27 2019-12-20 贝壳技术有限公司 插件化代码的混淆方法、装置、电子设备和存储介质
CN110597516B (zh) * 2019-08-27 2023-10-20 贝壳技术有限公司 插件化代码的混淆方法、装置、电子设备和存储介质
CN110688096A (zh) * 2019-09-10 2020-01-14 平安普惠企业管理有限公司 包含插件的应用程序的构建方法、装置、介质及电子设备
CN110688096B (zh) * 2019-09-10 2024-03-01 刘艾勇 包含插件的应用程序的构建方法、装置、介质及电子设备
CN111026397A (zh) * 2019-10-22 2020-04-17 烽火通信科技股份有限公司 一种rpm包分布式编译方法及装置
CN111026397B (zh) * 2019-10-22 2022-12-20 烽火通信科技股份有限公司 一种rpm包分布式编译方法及装置
CN111061486A (zh) * 2019-12-10 2020-04-24 杭州有赞科技有限公司 一种安卓应用程序增量方法
CN110941443A (zh) * 2019-12-12 2020-03-31 支付宝(杭州)信息技术有限公司 修改sdk中文件名的方法、装置及电子设备
CN111090425A (zh) * 2019-12-12 2020-05-01 支付宝(杭州)信息技术有限公司 一种程序封装方法、装置及电子设备
CN111258587A (zh) * 2020-01-17 2020-06-09 苏宁云计算有限公司 一种安卓应用插件化的实现方法、装置、设备及存储介质
CN111258587B (zh) * 2020-01-17 2023-08-22 苏宁云计算有限公司 一种安卓应用插件化的实现方法、装置、设备及存储介质
CN111367510A (zh) * 2020-02-24 2020-07-03 腾讯音乐娱乐科技(深圳)有限公司 一种安卓功能模块开发的方法及装置
CN111367510B (zh) * 2020-02-24 2024-03-19 腾讯音乐娱乐科技(深圳)有限公司 一种安卓功能模块开发的方法及装置
CN111309335A (zh) * 2020-02-28 2020-06-19 腾讯音乐娱乐科技(深圳)有限公司 插件应用的编译方法、装置及计算机可读存储介质
CN111309335B (zh) * 2020-02-28 2023-08-15 腾讯音乐娱乐科技(深圳)有限公司 插件应用的编译方法、装置及计算机可读存储介质
CN111290760B (zh) * 2020-03-03 2023-03-31 北京字节跳动网络技术有限公司 应用程序编译方法、装置、电子设备及存储介质
CN111290760A (zh) * 2020-03-03 2020-06-16 北京字节跳动网络技术有限公司 应用程序编译方法、装置、电子设备及存储介质
CN111459892B (zh) * 2020-03-31 2024-05-07 民生科技有限责任公司 一种基于安卓***的无侵入性aar合并方法
CN111459892A (zh) * 2020-03-31 2020-07-28 民生科技有限责任公司 一种基于安卓***的无侵入性aar合并方法
CN111552524A (zh) * 2020-05-06 2020-08-18 Oppo(重庆)智能科技有限公司 一种插件加载方法、装置及计算机可读存储介质
CN111552524B (zh) * 2020-05-06 2023-10-13 Oppo(重庆)智能科技有限公司 一种插件加载方法、装置及计算机可读存储介质
CN111638882A (zh) * 2020-05-29 2020-09-08 杭州鸿雁电器有限公司 操作界面的生成方法、装置、存储介质和处理器
CN111740876B (zh) * 2020-05-29 2022-09-30 北京沃东天骏信息技术有限公司 一种应用装置、测试方法、存储介质及电子设备
CN111740876A (zh) * 2020-05-29 2020-10-02 北京沃东天骏信息技术有限公司 一种应用程序、测试方法、存储介质及电子设备
CN111638882B (zh) * 2020-05-29 2022-03-11 杭州鸿雁电器有限公司 操作界面的生成方法、装置、存储介质和处理器
CN111737504B (zh) * 2020-06-23 2023-09-15 网易(杭州)网络有限公司 图像资源检测方法、装置、设备及存储介质
CN111737504A (zh) * 2020-06-23 2020-10-02 网易(杭州)网络有限公司 图像资源检测方法、装置、设备及存储介质
CN112511607A (zh) * 2020-11-18 2021-03-16 上海七牛信息技术有限公司 一种内容分发网络边缘节点***
CN113076146A (zh) * 2021-03-09 2021-07-06 北京一亩田新农网络科技有限公司 动态apk的加载方法、装置、***以及介质
CN113076146B (zh) * 2021-03-09 2024-06-07 北京一亩田新农网络科技有限公司 动态apk的加载方法、装置、***以及介质
CN113076147A (zh) * 2021-03-09 2021-07-06 北京一亩田新农网络科技有限公司 动态apk的资源加载方法、装置、***以及介质
CN113076147B (zh) * 2021-03-09 2024-02-02 北京一亩田新农网络科技有限公司 动态apk的资源加载方法、装置、***以及介质
CN113032039A (zh) * 2021-03-12 2021-06-25 中国工商银行股份有限公司 应用的插件化改造方法、装置、电子设备及存储介质
WO2023202299A1 (zh) * 2022-04-20 2023-10-26 北京字跳网络技术有限公司 一种sdk升级方法、装置以及计算机设备
CN116991491A (zh) * 2022-06-28 2023-11-03 重庆市通信建设有限公司 程序插件加载方法、装置、计算机设备及计算机程序
CN117093286B (zh) * 2023-10-17 2024-01-12 腾讯科技(深圳)有限公司 插件生成方法、装置、设备及计算机可读存储介质
CN117093286A (zh) * 2023-10-17 2023-11-21 腾讯科技(深圳)有限公司 插件生成方法、装置、设备及计算机可读存储介质

Similar Documents

Publication Publication Date Title
CN109542445A (zh) 一种Android插件化开发的方法和装置
US8549490B2 (en) Static code analysis for packaged application customization
CN108830720A (zh) 智能合约运行方法、装置、***和计算机可读存储介质
CN106843976B (zh) 用于生成镜像文件的方法和装置
CN105373390A (zh) 面向oem的在线软件定制打包发布的方法和装置
CN108958992A (zh) 测试方法和装置
CN110324169A (zh) 一种接口管理的方法和装置
CN109981322A (zh) 基于标签的云资源管理的方法和装置
CN110109979A (zh) 一种配置表单选项方法和装置
CN110096424A (zh) 测试的处理方法、装置、电子设备及存储介质
CN112764792B (zh) 一种关联服务器版本应用升级方法、装置和电子设备
CN110389762A (zh) 在Android工程中处理AAR包的方法和装置
CN107797820A (zh) 用于生成补丁的方法和装置
CN109783197A (zh) 用于程序运行时环境的调度方法和装置
CN108958826A (zh) 动态配置应用安装包的方法和装置
CN107463406A (zh) 发布移动应用的方法和电子设备
CN111125064A (zh) 一种生成数据库模式定义语句的方法和装置
CN109002282A (zh) 一种在web页面开发中实现动画效果的方法和装置
CN109814957A (zh) 一种用于ios***的标签添加方法和装置
CN112835568A (zh) 一种项目构建方法和装置
CN109960212A (zh) 任务发送方法和装置
CN109144843A (zh) 测试环境部署的方法和装置
CN113535220B (zh) 一种代码包管理方法和装置
CN112631563A (zh) 基于框架的***开发方法、装置、计算机设备及存储介质
CN109117199A (zh) 分布式程序的配置管理方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20190329

RJ01 Rejection of invention patent application after publication