日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android lint工作机制,Android架构

發(fā)布時間:2023/12/10 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android lint工作机制,Android架构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MVC

mvc model view controller 模式視圖控制器

M: 業(yè)務(wù)邏輯處理

V:處理數(shù)據(jù)顯示的部分

C:Activity處理用戶交互的問題,中間橋梁的作用,解耦的作用。

特點(diǎn):

耦合性低

擴(kuò)展性好,利于維護(hù)

模塊職責(zé)劃分明確

Model層:

//狀態(tài)的回調(diào)

public interface LoginResultListener {

void result(boolean status);

}

//接口

public interface UserModel {

public void login(String name, String password, LoginResultListener listener);

}

//實(shí)現(xiàn)類,進(jìn)行具體的業(yè)務(wù)操作

public class UserModelImp implements UserModel {

@Override

public void login(String name, String password, LoginResultListener listener) {

//todo進(jìn)行相關(guān)的操作

}

}

view層:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="rao.com.mvc.MvcDemoActivity">

android:id="@+id/til_username"

android:layout_width="368dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:hint="用戶名"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent">

android:layout_width="match_parent"

android:layout_height="wrap_content"

/>

android:id="@+id/til_password"

android:layout_width="368dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/til_username">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="密碼"/>

android:id="@+id/bt_login"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:text="login"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/til_password"/>

controller:

public class MvcDemoActivity extends AppCompatActivity {

private TextInputLayout mTilUserName;

private TextInputLayout mTilPassword;

private Button mBtLogin;

private UserModelImp mUserModelImp;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mvc_demo);

mTilUserName = findViewById(R.id.til_username);

mTilPassword = findViewById(R.id.til_password);

mBtLogin = findViewById(R.id.bt_login);

mUserModelImp = new UserModelImp();

mBtLogin.setOnClickListener(view -> {

mUserModelImp.login(mTilUserName.getEditText().getText().toString(), mTilPassword.getEditText().getText().toString(), new LoginResultListener() {

@Override

public void result(boolean status) {

}

});

});

}

}

在實(shí)際的使用過程中xml布局起的作用是十分的有限的,同時Activty需要操作ui和業(yè)務(wù)邏輯,造成冗余。

MVP

M:依然是業(yè)務(wù)邏輯和實(shí)體類型模型

V:對應(yīng)于Activity,負(fù)責(zé)View的繪制以及與用戶交互

P:負(fù)責(zé)完成View于Model間的交互。

mvp和mvc.png

定義model層:

//接口回調(diào)

public interface OnLoginListener {

void onLoginResult(int status, User user);

}

//定義業(yè)務(wù)

public interface IUserBiz {

void login(String username, String password, OnLoginListener listener);

}

//具體的實(shí)現(xiàn)類

public class UserBiz implements IUserBiz {

@Override

public void login(String username, String password, OnLoginListener listener) {

// TODO: 2018/3/18 ,進(jìn)行登錄,網(wǎng)絡(luò)數(shù)據(jù)等操作

boolean status = true;

if (status) {

listener.onLoginResult(1, new User(username, password));

} else {

listener.onLoginResult(0, null);

}

}

}

view層:

//view相關(guān)

public interface IUserLoginView {

String getUsername();

String getPassword();

void showLoading();

void dismissLoading();

void loginStatus(int status);

}

//activity

public class MVPActivity extends AppCompatActivity implements IUserLoginView {

private TextInputLayout mTilUserName;

private TextInputLayout mTilPassword;

private Button mBtLogin;

private ProgressDialog mProgressDialog;

private UserLoginPresenter mUserLoginPresenter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mvp);

mTilUserName = findViewById(R.id.til_username);

mTilPassword = findViewById(R.id.til_password);

mBtLogin = findViewById(R.id.bt_login);

mProgressDialog = new ProgressDialog(this);

mUserLoginPresenter = new UserLoginPresenter(this);

mBtLogin.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mUserLoginPresenter.login();

}

});

}

@Override

public String getUsername() {

return mTilUserName.getEditText().getText().toString();

}

@Override

public String getPassword() {

return mTilPassword.getEditText().getText().toString();

}

@Override

public void showLoading() {

mProgressDialog.show();

}

@Override

public void dismissLoading() {

mProgressDialog.dismiss();

}

@Override

public void loginStatus(int status) {

//todo,根據(jù)操作,去進(jìn)行響應(yīng)的跳轉(zhuǎn)

}

}

presenter層:

public class UserLoginPresenter {

private IUserBiz mIUserBiz;

private IUserLoginView mIUserLoginView;

public UserLoginPresenter(IUserLoginView IUserLoginView) {

mIUserLoginView = IUserLoginView;

mIUserBiz = new UserBiz();

}

public void login() {

mIUserLoginView.showLoading();

mIUserBiz.login(mIUserLoginView.getUsername(), mIUserLoginView.getPassword(), new OnLoginListener() {

@Override

public void onLoginResult(int status, User user) {

if (status == 1) {

mIUserLoginView.loginStatus(1);

} else {

mIUserLoginView.loginStatus(0);

}

}

});

}

}

MVVM

View: 對應(yīng)于Activity和xml,負(fù)責(zé)View的繪制,以及用戶交互。

Model:實(shí)體模型,數(shù)據(jù)存取

ViewModel:負(fù)責(zé)完成View與Model間的交互,負(fù)責(zé)業(yè)務(wù)邏輯。

一把配套使用DataBinding使用,Model與ViewModel雙向通信,一般使用數(shù)據(jù)驅(qū)動的方式來實(shí)現(xiàn)。view只負(fù)責(zé)UI操作。

mvvm.png

Android插件化

當(dāng)業(yè)務(wù)量大的時候,android的65536方法數(shù)的限制。

apk大的時候,動態(tài)加載apk:一個宿主的apk,到sd卡中動態(tài)的加載apk,

資源加載:通過AssertManagerr類

代碼加載 :java中類加載機(jī)制

動態(tài)加載APk:類加載器,就是將java的字節(jié)碼加載到虛擬機(jī)當(dāng)中android中有兩個重要的

DexClassLoader: 可以從dex文件加載字節(jié)碼文件,用于動態(tài)加載和熱更新等。

PathClassLoader:只能加載文件目錄下的apk

資源加載:AssertManager反射來加載的

代碼加載:反射綁定到activity的生命期,之后在加載

Android熱更新

線上檢測到嚴(yán)重的 crash

拉出bugfix分支并在分支上修復(fù)問題

jenkins構(gòu)建和補(bǔ)丁生成

app推送或主動拉取文件

將bugfix代碼合并到master上

熱更新框架:

Dexposed :阿里,基于aop的思想,無需重啟,即可修復(fù),通過hook技術(shù),不僅可以修改java方法,還能hook修改android方法,日志記錄,性能統(tǒng)計(jì),安全控制,事物處理。(hook基本的方法就是通過hook“接觸”到需要修改的api函數(shù)入口點(diǎn),改變它的地址指向新的自定義的函數(shù))

AndFix:阿里,更純粹的熱修護(hù)技術(shù),性能較好,工具較完善。

Nuwa:基于dex分包的技術(shù),將dex文件拆分多個dex,編上號,依次加載。

原理:

Android類加載機(jī)制

PathClassLoader 加載系統(tǒng)的類,應(yīng)用類

DexClassLoader 加載Dex文件,apk包

熱修復(fù)機(jī)制

dexElements 會創(chuàng)建dex數(shù)組

ClassLoader 會遍歷這個數(shù)據(jù),根據(jù)線上的carch定位到這個dex,將修復(fù)好的dex的位置靠前,優(yōu)先加載這個dex文件。

進(jìn)程保活

使用場景:定位,推送等等

進(jìn)程優(yōu)先級:

前臺進(jìn)程

可見進(jìn)程(沒有前臺組件,但是會影響前臺界面的進(jìn)程)

服務(wù)進(jìn)程

后臺進(jìn)程

空進(jìn)程(緩存)

回收策略:

low memory killer:通過一系列的評分機(jī)制,定義進(jìn)程進(jìn)行打分,將分?jǐn)?shù)搞的進(jìn)程判定為bad進(jìn)程,殺死并釋放緩存。(定時檢查)

OOM_ODJ:這個閥值,判斷進(jìn)程的優(yōu)先級,越大進(jìn)程優(yōu)先級越低。

?;罘桨?

系統(tǒng)廣播拉活,開機(jī),網(wǎng)絡(luò)數(shù)據(jù)變化,不可控制(容易被系統(tǒng)軟件禁用)

系統(tǒng)Service機(jī)制拉活 :利用的是當(dāng)系統(tǒng)內(nèi)存不足而殺掉該Service,可以拉活。殺死Service后,第一5秒拉活,二次10秒后拉活,三次20秒拉活,當(dāng)Serice被系統(tǒng)拉活三次之后,就不會在被系統(tǒng)進(jìn)行拉活了。當(dāng)被安全軟件或系統(tǒng)軟件靜止之后,是不能拉活的。

利用native進(jìn)程拉活:利用linux的fork機(jī)制創(chuàng)建一個進(jìn)程,監(jiān)控主進(jìn)程的存活,這是可以立即對主進(jìn)程進(jìn)行拉活。(失效了)

JobScheduler機(jī)制拉活,跟native類是,android5.0之后提供的。

帳號同步機(jī)制拉活 (不再生效)

UIL

Universe Image Loader圖片加載框架

Lint檢查

Android Lint是一個靜態(tài)的代碼分析工具,它能夠?qū)ndroid項(xiàng)目潛在的bug,可優(yōu)化的代碼,安全性,性能,可用性,可訪問性國際化等進(jìn)行檢查。

Lint工作流程:通過配置lint.xml配置,運(yùn)用lintTool工具,進(jìn)行相關(guān)的額檢查

在Src文件目錄下,創(chuàng)建lint.xml文件

Lint.png

如果確定java代碼寫的沒有問題,你可以以下的方式使用

//在java代碼中的使用,忽略這警告,檢查,這是在lint.xml中配置了屬性的

@SuppressLint("NewApi")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView(savedInstanceState);

}

//在xml文件中的使用,當(dāng)代碼執(zhí)行到這里的時候就會忽略未使用的資源的問題,不會對編譯盡心檢查

tools:ingnore="UnusedResources"

自定義lint

使用默認(rèn)的lint檢查不能滿足需求,在自定義庫的使用,某些屬性沒有配置 BuiltinlssueRegistry

Kotlin

Kotlin一種基于JVM的編程語言

是對java的一種擴(kuò)展

Kotlin支持函數(shù)式編程

Kotlin類與Java類互相調(diào)用

定位carch定位的堆棧的問題

安裝Kotlin 插件 在android studio安裝

總結(jié)

以上是生活随笔為你收集整理的android lint工作机制,Android架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。