阿里的Atlas元件化框架
Atlas簡介
Atlas是一個Android客戶端容器框架,主要提供了元件化、動態性、解耦化的支援,支援在編碼期、Apk執行期以及後續運維修復期的各種問題。Atlas目前支援的主要功能有:
- 在工程期,實現工程獨立開發,除錯功能,工程模組的獨立;
- 在執行期間,實現完整的元件生命週期對映,類隔離等機制;
- 在運維期間,提供快速增量的更新修復功能,快速升級。
Atlas是工程期和執行期共同起作用的框架,它儘量將一些工作放在工程期,這樣保證執行期的簡單、穩定。下面是Atlas元件化的一個框架原理圖。
上圖是手機淘寶的apk,第一層目錄上與標準的apk是完全一樣的。在App會有很多的so檔案,每個so檔案如果解開來看它的結構類似於完整的apk,但本身不能獨立執行,它執行在整個容器裡,每一個元件都是獨立的Bundle。例如,手淘的模組層次劃分如下圖。
從模組來劃分,手淘APK可以分為兩層,上層是經過拆分的業務Bundle,掃碼、評價、詳情,各個業務之間可以進行功能的呼叫,可以通過路由排程到其他業務方。下層是共享的底層中介軟體,向業務方開放各種能力,如網路庫、圖片庫等,會在容器裡進行統一地把控,這樣做的好處是包做到儘可能小,第二是效能佳。
Atlas的整體分為5層:
第一層稱之為Hack層,包括OS Hack toolkit & verifier,這裡對系統能力做一些擴充套件,然後做一些安全校驗。
第二層是Bundle Framework,就是的容器基礎框架,提供Bundle管理、載入、生命週期、安全等一些最基本的能力。
第三層是執行期管理層,包括清單,會把所有的Bundle和它們的能力列在一個清單上,在呼叫時方便查詢;另外是版本管理,會對所有Bundle的版本進行管理;再就是代理,這裡就是和業界一些外掛化框架機制類似的地方,會代理系統的執行環境,讓Bundle執行在的容器框架上;然後還有除錯和監控工具,是為了方便工程期開發除錯。
第四層是業務層了,這裡向業務方暴露了一些介面,如框架生命週期、配置檔案、工具庫等等。
元件化技術細節
關於Bundle的生命週期會提供細粒度的節點,比如下面是一個Bundle從載入到執行的週期:
- startInstall:開始載入。這個時候框架會做一些拷貝檔案、釋放lib、載入Bundle的事情;
- Installed:載入完畢。這時框架會注入資源路徑,建立class loader;
- resolved:解析完畢,框架會檢查元件配置是否合法,是否能被解析;
- active:執行元件,即開始執行元件Bundle;
- started:執行成功。
元件化涉及到的第一個問題是Manifest處理,一個是因為來源很多,有宿主Manifest、Aar Manifest以及元件Manifest,另外不同元件的Manifest經常發生變化,要求靈活地去處理。這裡的做法是在工程期將所有的Manifest進行Merge操作,這裡需要注意的是Bundle的依賴單獨Merge,因為這裡涉及到依賴仲裁的問題。最後解析各個Bundle的Merge Manifest,得到整包的BundleInfoList,就是上面提到的Bundle資訊清單。
第二個是類載入,這裡利用Delegate ClassLoader來動態載入元件的類。Delegate ClassLoader先查詢宿主Bundle的PathClassLoader,然後根據前面的BundleList找到對應的BundleClassLoader。
第三個是資源,會用自己的DelegeteResources替換掉系統的resource,Bundle的資源會逐個在安裝的時候新增到AssertPath,由於新增Bundle的順序非固定,不分割槽會導致資源查詢錯亂。
另外,Dalvik和ART上的資源查詢過程順序是不一樣的,加上小米等系統會重寫自己的resources,所以會適配不同的機型,往後追加AssetsPath或者往前追加,系統AssetManager是個單例,預設往後追加,如果往前追加,則需要重新建立AssetsManager物件,同樣主dex動態部署的時候要達到替換原有resource的目的,必須保證插入順序與查詢順序一致。
還有需要注意的是,每次更新resourceTable的時候,必須保證apkresource,runtime的系統resource,例如webview,bundle resource都已經新增成功,而且唯一,順序正確。
不同Bundle的資源可能發生命名衝突,是用了一種相對來說簡單的方法,將各自的Bundle分配成不同的ID,保證所有的業務資源不會產生衝突,儘量將問題放到工程期解決。在很多程式碼裡,通過反射來呼叫整個資源,在5.0以上的系統是沒有問題的,它只找第一個,對業務程式碼而言,原來是怎麼寫的,今天還是怎麼去寫。
關於元件化效能這一部分,引入了按需載入,因為手淘APK有70多個Bundle,每個使用者真正用的時候只需要5或10個,所以不需要載入所有的Bundle。Bundle之間進行隔離,通過Android四大原生元件進行互動,這樣Bundle之間可以比較好的解耦。所有呼叫的入口都是基於BundleInfolist去做的,根據這個清單資訊,得到元件所在Bundle,如果需要載入,就進行install、dexopt等操作。
另外,對於解決元件依賴問題,定義了兩種新的元件格式Awb(業務Bundle)和solib(so庫),前者與AAR一致,不過不新增本地lib,在構建的時候做依賴仲裁區分,後者是Native so庫的依賴。Awb其實就是AAR,只是字尾修改了,如果你的包放在宿主Bundle就用AAR,如果是元件Bundle就用Awb。
對於業務Bundle的依賴,在構建期會將宿主Bundle和業務Bundle及其依賴分別打包,然後按照最短路徑、第一宣告原則進行樹狀仲裁,得到每個Bundle需要的依賴,在打包的時候會將依賴庫放到各自的Bundle裡去。
最後是APK構建,對它做了比較大的調整。上面的圖中,其實左邊這一部分是一個標準的APK的構建過程,包括處理,編譯,到簽名的過程。這個不同的地方是多了Awb需要特殊處理,其中Awb的資源根據宿主的resource.ap_和包內資源構建,R檔案由Bundle R資源和宿主R資源合併而來,然後對Aapt進行了修改,對每個awb分配不同的packageId,然後進行統一混淆,生產各個AWB的Dex,打包為APK,簽名之後複製到libs,改名為so檔案,然後合併到taobao APK. 這就是元件化的整個過程。
Atlas動態化
在一個容器框架內,元件化和動態化是相輔相成的,元件只是解決了解耦的問題,但如果想要隨時發包,就必須讓容器框架具備動態化能力。在完成了Atlas的元件化之後,做了動態化的支援。動態化的好處一個是包的大小縮減,可以將一些包在執行後下載到應用中,另一個是具備動態發版和修復能力。
Atlas提供了動態部署的能力,主要目標是動態業務釋出,以及問題修復。它基於手淘自研差量演算法,主Bundle基於ClassLoader機制,業務Bundle基於差量merge,支援全業務型別。
另外,Atlas也支援Andfix作為外掛使用,目標是快速故障修復,它的原理基於Native hook,主要做方法的修改,在實際中可以兩個一起用。在工程構建期適配之後,可以做到一套程式碼兩套方案通用。該方案的原理圖如下:
自研動態部署功能實現原理,首先,對於Dex Patch的生成,通過修改Dex的位元組碼實現,將Dex檔案轉為Smali,對其中的ClassDef和ClassDataMethod結構體進行分析,可以實現刪除、新增、修改類,然後通過Diff處理得到差量檔案,再通過Merge處理即生成補丁。
其次是整個資源Patch的生成,分為兩塊,一個是業務Bundle,本來是一個不斷載入的過程,它實現起來會比較簡單,通過Md5 diff/BSDiff即可得到。對於主Bundle,因為安卓本身有一個限制,所有的資源必須得在base包裡,新增一個資源是不生效的。所以一個做法是在打包的時候預留很多空資源。另外更新已有的資源則通過資源覆蓋來完成。
最後,如果新加業務的話,會新加Activity,的做法首先在Manifest預埋一個StubActivity,然後在Instrumentation.execStartActivity()階段進行替換,同時配合Intent setFlag模擬Activity launch mode並繼續startActivity,接著System_server程序進行處理,更新ActivityStack,建立binder,並通知ActivityThread進行例項建立,最後在ActivityThread的handler裡面進行攔截,更新ActivityInfo等資訊,建立目標Activity。
另外在工程實踐上,因為補丁的生成會涉及到Dex和資源的基線,會在部署的時候,每次釋出APK包同步釋出AP(基線包)到Maven,AP基線包裡是所有影響基線的檔案,第一是安卓APK,第二是Mapping.txt,最後是Dependency.txt,這樣的話整個構建的速度會非常的快。
所以這種方式,版本的升級是不同的方式。比如今天手淘的詳情要更新,會發布版本,這個版本可能不是到應用市場的版本,而是一個Patch包。業務版本的動態部署,是同步的,5.3.0到5.3.1到5.3.2,這樣一個好處是隻要容器版本沒有升級,只要有需求,patch就可以一直升級,而且是無感知的差量升級。
Atlas專案實踐
前面我們介紹了Atlas的一些原理性的東西,總的來說,Atlas就是利用遠端Bundle的下發方式,為了減少apk的安裝體積,Atlas專案使用bundle的載入方式。當用戶安裝沒有Bundle的apk檔案時,就從網上下載這個bundle的so,然後載入開啟,下載邏輯使用app原生程式碼編寫,載入用按需載入的策略。
Atlas接入
首先新建一個專案,然後新建幾個module,如下圖。
修改配置
1,把gradle改為3.3
2,然後我們需要為Atlas新增一些配置,引用Atlas外掛及依賴倉庫,修改工程gradle檔案。
buildscript {
repositories { jcenter()}
dependencies {
//不需要再依賴classpath "com.android.tools.build:gradle"
classpath "com.taobao.android:atlasplugin:2.3.3.beta2"
}
}
3,修改app的build.gradle指令碼,需要注意包名的對應關係。
// 需要放最上面初始化
group = "mmc.atlastest"
version = getEnvValue("versionName", "1.0.0");
def apVersion = getEnvValue("apVersion", "");
apply plugin: 'com.android.application'
apply plugin: 'com.taobao.atlas'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "mmc.atlastest"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName version
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
//atlas的依賴
compile('com.taobao.android:atlas_core:[email protected]') {
transitive = true
}
compile 'com.taobao.android:atlasupdate:[email protected]'
compile 'com.alibaba:fastjson:[email protected]'
//專案依賴
compile project(':librarybundle')
compile project(':localbundle')
compile project(':remotebundle')
}
//加入以下配置
atlas {
atlasEnabled true
tBuildConfig {
// autoStartBundles = ['com.android.homebundle'] //自啟動bundle配置
outOfApkBundles = ['remotebundle'] //遠端module,列表來的,可填多個
preLaunch = 'mmc.atlastest.AtlasLaunch' //AppApplication啟動之前呼叫,這個類下面放出程式碼
}
patchConfigs {
debug {
createTPatch true
}
}
buildTypes {
debug {
if (apVersion) {
// 打差異補丁 gradlew assembleDebug -DapVersion=1.1.0 -DversionName=1.1.1
// 對應著本地maven倉庫地址 .m2/repository/mmc/atlastest/AP-debug/1.1.4/AP-debug-1.1.4.ap
baseApDependency "mmc.atlastest:AP-debug:${apVersion}@ap"
patchConfig patchConfigs.debug
}
}
}
}
String getEnvValue(key, defValue) {
def val = System.getProperty(key);
if (null != val) {
return val;
}
val = System.getenv(key);
if (null != val) {
return val;
}
return defValue;
}
apply plugin: 'maven'
apply plugin: 'maven-publish'
publishing {
// 指定倉庫位置
repositories {
mavenLocal()
}
publications {
// 預設本地倉庫地址 使用者目錄/.m2/repository/
maven(MavenPublication) {
//讀取ap目錄上傳maven
artifact "${project.buildDir}/outputs/apk/${project.name}-debug.ap"
//生成本地maven目錄
groupId group
artifactId "AP-debug"
}
}
}
4,修改遠端bundle和本地bundle的build.gradle指令碼
apply plugin: 'com.android.library'
apply plugin: 'com.taobao.atlas'
atlas {
bundleConfig{
awbBundle true
}
buildTypes {
debug {
baseApFile project.rootProject.file('app/build/outputs/apk/app-debug.ap')
}
}
}
//只新增上面的配置就行了,下面的是預設生成的
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
//依賴lib中間bundle
compile project(':librarybundle')
}
5,在宿主app的application中新增如下程式碼。
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Atlas.getInstance().setClassNotFoundInterceptorCallback(new ClassNotFoundInterceptorCallback() {
@Override
public Intent returnIntent(Intent intent) {
final String className = intent.getComponent().getClassName();
final String bundleName = AtlasBundleInfoManager.instance().getBundleForComponet(className);
if (!TextUtils.isEmpty(bundleName) && !AtlasBundleInfoManager.instance().isInternalBundle(bundleName)) {
//遠端bundle
Activity activity = ActivityTaskMgr.getInstance().peekTopActivity();
File remoteBundleFile = new File(activity.getExternalCacheDir(),"lib" + bundleName.replace(".","_") + ".so");
String path = "";
if (remoteBundleFile.exists()){
path = remoteBundleFile.getAbsolutePath();
}else {
Toast.makeText(activity, " 遠端bundle不存在,請確定 : " + remoteBundleFile.getAbsolutePath() , Toast.LENGTH_LONG).show();
return intent;
}
PackageInfo info = activity.getPackageManager().getPackageArchiveInfo(path, 0);
try {
Atlas.getInstance().installBundle(info.packageName, new File(path));
} catch (BundleException e) {
Toast.makeText(activity, " 遠端bundle 安裝失敗," + e.getMessage() , Toast.LENGTH_LONG).show();
e.printStackTrace();
}
activity.startActivities(new Intent[]{intent});
}
return intent;
}
});
}
}
6、在app新建一個類AtlasLaunch,繼承AtlasPreLauncher。
public class AtlasLaunch implements AtlasPreLauncher {
@Override
public void initBeforeAtlas(Context context) {
}
}
專案結構
然後寫app的基本功能,示例如下圖。
下面是宿主中具體的跳轉邏輯實現。
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//開啟遠端bundle
public void remote(View view){
Intent intent = new Intent();
intent.setClassName(view.getContext(), "mmc.remotebundle.RemoteActivity");
startActivity(intent);
}
//開啟本地bundle
public void local(View view){
Intent intent = new Intent();
intent.setClassName(view.getContext(), "mmc.localbundle.LocalActivity");
startActivity(intent);
}
//更新補丁
public void update(View view){
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
update();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
Toast.makeText(MainActivity.this, "更新完成,請重啟", Toast.LENGTH_LONG).show();
}
}.execute();
}
private void update(){
File updateInfo = new File(getExternalCacheDir(), "update.json");
if (!updateInfo.exists()) {
showToast("更新資訊不存在,請先 執行 buildTpatch.sh");
return;
}
String jsonStr = new String(FileUtils.readFile(updateInfo));
UpdateInfo info = JSON.parseObject(jsonStr, UpdateInfo.class);
File patchFile = new File(getExternalCacheDir(), "patch-" + info.updateVersion + "@" + info.baseVersion + ".tpatch");
try {
AtlasUpdater.update(info, patchFile);
} catch (Throwable e) {
e.printStackTrace();
showToast("更新失敗, " + e.getMessage());
}
}
}
安裝執行專案,就可以看到如下圖所示的效果。
此時還有以下工具需要完成:
1,這個時候點選遠端bundle會彈出說沒有so檔案,因為還沒打so包呢
2、點選本地bundle,是可以跳轉到那個本地bundle頁面
3、點選更新補丁,會提示更新資訊不存在
打遠端bundle的so檔案
下面要打包出遠端bundle的so檔案,補丁的差異包和更新說明。
1,打so檔案,每個遠端都會生成一個so檔案的。開啟AS的Terminal,輸入:gradlew clean assembleDebug publish
,然後回車,如下圖:
正常的話,會提示下面的正確資訊。
成功的話,app的build資料夾裡,會生成這個so檔案,這個就是遠端bundle的so檔案,把這個檔案放到手機記憶體卡Android/data/mmc.atlastest/cache 資料夾裡面,然後再開啟app,點選“遠端Bundle”,這個時候就能跳轉過去了。
更新補丁,打差異包和更新說明
接著第一步,然後修改版本號,對本地Bundle進行文字修改,對app主專案也可以修改。
修改後,在Terminal裡面輸入:gradlew clean assembleDebug -DapVersion=1.0.0 -DversionName=1.0.1
回車,成功後會生成補丁差異包和更新說明,如下圖:
把紅色圈中的兩個檔案,放到手機記憶體卡Android/data/mmc.atlastest/cache 資料夾裡面,然後點選“更新補丁”,過一會,提示更新成功後,就退出殺死app,再開啟就是後面修改的內容了。
Atlas使用步驟總結
1、配置好,安裝1.0.0的app
2、用命令“gradlew clean assembleDebug publish”打AP,得到遠端Bundle的so檔案
3、修改版本號,修改版本內容
4、用命令“gradlew clean assembleDebug -DapVersion=1.0.0 -DversionName=1.0.1”打差異包補丁和更新說明
5、把上面得到的三個檔案放到app的cache目錄裡面
6、執行更新方法,殺死app,重啟
相關推薦
阿里Atlas元件化框架
一、前言: 幾天前手淘終於把雲棲大會上說的Atlas開源了,此處應歡聲雷動:clap:。官網地址、GitHub地址。 今天不說原理性的東西(後續或許會寫),有興趣可以看官方文件:官方教程,鑑於初步跑官方給出的Demo時遇到了不少坑稍微總結下,讓在準備探索的小夥伴不在迷茫的踩坑。 :warning:注:轉
阿里的Atlas元件化框架
Atlas簡介 Atlas是一個Android客戶端容器框架,主要提供了元件化、動態性、解耦化的支援,支援在編碼期、Apk執行期以及後續運維修復期的各種問題。Atlas目前支援的主要功能有: 在工程期,實現工程獨立開發,除錯功能,工程模組的獨立; 在執行期
Android元件化框架搭建
本篇文章已授權微信公眾號 hongyangAndroid (鴻洋)獨家釋出 背景 當一個專案經過N手人開發,N個產品經理的蹂躪,N長時間的維護,此時一定存在大量程式碼冗餘、業務耦合、專案臃腫,資原始檔大把重複等等,不堪重負。當需要增加新功能或者修改之前某個功能的時候,我相信很多同仁都說只敢
元件化框架專案
元件化框架專案 https://github.com/HelloChenJinJun/NewFastFrame 簡介 該專案目前整合現在主流的開發框架和技術,包括okhttp3、rxjava2、retrofit2、glide、greendao3.0、dagger2、mv
Android元件化框架設計與實踐
轉載自:Android元件化框架設計與實踐 在目前移動網際網路時代,每個 APP 就是流量入口,與過去 PC Web 瀏覽器時代不同的是,APP 的體驗與迭代速度影響著使用者的粘性,這同時也對從事移動開發人員提出更高要求,進而移動端框架也層出不窮。 服務端與移動端對比 上圖顯示的是
Android元件化框架專案詳解
簡介 什麼是元件化? 專案發展到一定階段時,隨著需求的增加以及頻繁地變更,專案會越來越大,程式碼變得越來越臃腫,耦合會越來越多,開發效率也會降低,這個時候我們就需要對舊專案進行重構即模組的拆分,官方的說法就是元件化。 元件化帶來的好處 那麼,採用元件化能帶來什麼好處呢?主要有以下兩點: 1、
小程式元件化框架 WePY 在效能調優上做出的探究
作者:龔澄 導語 效能調優是一個亙古不變的話題,無論是在傳統H5上還是小程式中。因為實現機制不同,可能導致傳統H5中的某些優化方式在小程式上並不適用。因此必須另開闢蹊徑找出適合小程式的調估方式。 本文旨在介紹兩點在小程式開發過程當中碰到的一些效能問
終極元件化框架專案方案詳解:一個極具參考的元件化專案
熱文導讀 | 點選標題閱讀作者:啊哈啊哈哈https://juejin.im/user/57a2
從零開始搭建Android元件化框架
問題 在已經開發過幾個專案的童鞋,如果這時需要重新開發一個新專案,是否需要自己重新搭建框架呢,還是從老專案中拷貝貼上? 我們是否可以封裝一個底層的lib庫,這個底層的公共基礎庫 包括了一些第三方庫(如: okhttp, retrofit2, glide 等)的初始化及簡單的封裝和一些
Android開發高階進階之元件化框架搭建
背景 當一個專案經過N手人開發,N個產品經理的蹂躪,N長時間的維護,此時一定存在大量程式碼冗餘、業務耦合、專案臃腫,資原始檔大把重複等等,不堪重負。當需要增加新功能或者修改之前某個功能的時候,我相信很多同仁都說只敢增加,不敢隨意的去刪除、修改原有的程式碼,因為不知道哪些有用,哪些沒有用。
2017年試試Web元件化框架Omi
Open and modern framework for building user interfaces. 如果想使用Omi框架或者開發完善Omi框架,可以訪問 Omi使用文件 如果你想獲得更佳的閱讀體驗,可以訪問 Docs Website 如果你懶得搭建專案腳手架,可以試試 omi
前端元件化框架之路
1. 為什麼元件化這麼難做 Web應用的元件化是一個很複雜的話題。 在大型軟體中,元件化是一種共識,它一方面提高了開發效率,另一方面降低了維護成本。但是在Web前端這個領域,並沒有很通用的元件模式,因為缺少一個大家都能認同的實現方式,所以很多框架/庫都實現
終極元件化框架專案方案詳解
前言 1.什麼是元件化? 專案發展到一定階段時,隨著需求的增加以及頻繁地變更,專案會越來越大,程式碼變得越來越臃腫,耦合會越來越多,開發效率也會降低,這個時候我們就需要對舊專案進行重構即模組的拆分,官方的說法就是元件化。 2.為什麼需要元件化和元件化帶來的好處? 1、 現在Android專案中程式碼量達到
vue框架的設計思想--漸進、輕量、資料驅動、元件化、自底向上
vue是一套用於構建使用者介面的漸進式框架 參考:https://blog.csdn.net/tangxiujiang/article/details/79594860 https://blog.csdn.net/weixin_41049850/article/details/79431
開源Android容器化框架Atlas開發者指南
隨著手機淘寶業務的快速增長,協作研發團隊的不斷擴大,技術也面臨著更多挑戰:一方面程式碼量快速上升導致方法過多,限制打包的正常輸出;另一個方面各業務線的開發和整合都需要到一個 apk上,業務間相互耦合嚴重,整合開發工作效率低下,這個大背景下,急需要做一次從構建,整合,交付的技術
iOS 從零到一搭建元件化專案框架
隨著公司業務需求的不斷迭代發展,工程的程式碼量和業務邏輯也越來越多,原始的開發模式和架構已經無法滿足我們的業務發展速度了,這時我們就需要將原始專案進行一次重構大手術了。這時我們應該很清晰這次手術的動刀口在哪,就是之前的高度耦合的業務元件和功能元件,手術的目的就是將這些耦合拆分成互相獨立的各個元件。 工程
Router:一款單品、元件化、外掛化全支援的路由框架
簡介 由於現在已經有很多各種各樣的路由框架了,所以在這裡。我也不再贅述什麼是路由?路由框架的意義是什麼之類的了。 特性 安全: 路由啟動過程中。全程catch住異常並通知使用者。完全不用擔心crash問題。 強大的攔截器功能:與大部分的路由不同。提供三種路由攔截器機制
前端框架___元件化和模組化
元件化和模組化 元件化和模組化有利於封裝以及複用。 元件化: 1.生命週期。 前端框架都有一個重要的詞語,生命週期,都大部分從幾個方面來看,初始化,渲染,存活期,銷燬。 2.資料通訊 元件之間的通訊,父傳
Laravel框架關鍵技術解析(1)元件化開發與composer使用
1.3 手動構建Laravel框架 一步步搭建一個類似於Laravel的伺服器端程式框架,該框架包含伺服器端程式中的MVC(模型、檢視和控制)三個組成部分,可以實現伺服器端程式中的路由、控制器、資料庫操作及檢視模板等主要功能。構建過程分為專案初始化、路由元件新
MVVM架構結合阿里ARouter,打造一套Android-Databinding元件化
前言 關於Android的元件化,相信大家並不陌生,網上談論元件化的文章,多如過江之鯽,然而一篇基於MVVM模式的元件化方案卻很少。結合自身的調研和探索,在此分享一篇基於MVVMHabit框架(https://github.com/goldze/MVVMHabit )的一套Android-Dat