android lint工作机制,Android架构
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【1】Python 视频文字识别提取 -
- 下一篇: android画布一闪一闪的,解决And