[Android 구성 요소화] 구성 요소 프로그래밍
구성 요소 간의 통신 메커니즘
모듈화가 급히 해결해야 할 문제는 모듈 간의 통신 문제다.
이벤트 버스
이벤트 버스 메커니즘은 대상을 기록하고 감청자 모드를 사용하여 대상에게 각종 사건을 통지한다.
이벤트버스의 주요 기능은 Intent,Handler,BroadCast를 대체하여 Fragment,Activity,Service와 스레드 사이에서 메시지를 전달하는 것이다.발송자와 수신자의 결합을 실현하다.구독자는 여러 이벤트를 구독할 수 있고 발송자는 모든 이벤트를 발표할 수 있으며 구독자일 수도 있다.이벤트 처리 루트와 우선 순위도 설정할 수 있습니다.
Arouter 라우팅 점프
구성 요소화 개발에서 각module를 서로 다른 네트워크로 간주할 수 있다. 공유기는 각 네트워크를 연결하는 중계소로 점프를 차단하거나 특정한 차단기를 설정할 수 있다.라우팅 점프에는 종속 클래스가 필요하지 않으며 Android Manifest에 있을 필요가 없습니다.xml에 등록되어 구성 요소의 결합을 풀기에 적합합니다.
greenDAO 데이터베이스 저장소
그린DAO는 ORM 프레임워크로 인터페이스를 제공하여 조작 대상을 통해 관계형 데이터베이스를 조작할 수 있다.그린DAO의 원리는 대상을 하나의 데이터로 전환시켜 대상을 관계 데이터베이스에 비추는 것이다.
AndPermission 권한 관리
AndPermission은 국내 휴대전화에 잘 어울린다.구체적으로 해당 GitHub에 액세스할 수 있습니다.AndPermission과 Arouter를 결합하여 점프하기 전에 권한을 검사할 수 있습니다.
R.java 자원 제한
R.java 파일은 aapt에서 리소스 파일을 패키지화할 때 생성됩니다.
구성 요소 모듈의 정적 변수에final 속성이 부여되지 않았습니다.대응하는 파일의 위치는/build/generated/source/r/debug/패키지 이름/R.java입니다.모든 자원 파일은 R에 하나의class를 보이고 자원 항목의 이름마다 id를 분배한다. id 값은 4바이트의 기호가 없는 정수이고 형식은 다음과 같다. 0xpptteee, (p는 패키지, t는 type, e는 entry), 최고 바이트는 Package ID, 다음 바이트는 Type ID, 다음 두 바이트는 Entry ID이다.
Package ID는 리소스의 소스를 제한하는 네임스페이스와 같습니다.Android 시스템은 현재 두 개의 자원 명령 공간을 정의했는데 그 중 하나는 시스템 자원 명령 공간이다. 그의 Package ID는 0x01이고 다른 하나는 응용 프로그램 자원 명령 공간이다. 그의 Package ID는 0x7f이다.[0x01, 0x7f] 사이에 있는 모든 Package ID는 합법적이며, 이 범위 밖의 것은 모두 불법적인 Package ID이다.
Type ID는 리소스의 유형 ID입니다.자원의 유형은 animator, anim,color,drawable,layout,menu,raw,string,xml 등 몇 가지가 있는데 각각에 하나의 ID가 부여된다.
Entry ID는 각 리소스가 속하는 리소스 유형에 나타나는 순서입니다.리소스 유형에 따라 Entry ID가 같을 수 있지만 리소스 ID 유형에 따라 리소스 ID를 구별할 수 있습니다.
각 모듈이 생성됩니다.aar 파일이며 app 모듈에 인용되어 apk 파일로 통합됩니다.각 모듈이 app 모듈로 압축을 풀 때 R.java의 id 속성은final 속성으로 추가됩니다.대응하는 파일의 위치는/build/generated/source/r/debug/패키지 이름/R.java 각 구성 요소 모듈이 app 모듈에 집합되었을 때, 즉 초기 해석 자원 단계를 컴파일하여 모든 R.java 파일을 검출한 다음에 합병을 통해 최종적으로 유일한 R.java 자원 파일을 생성합니다.
구성 요소 module의 R.java에final 키워드 수식 id가 없기 때문에 상수를 사용해야 하는 곳에서는 R.java의 변수를 사용할 수 없습니다.주해와 switch 문법 등을 포함한다.
모든 구성 요소 모듈이 각각 aar 파일을 생성할 때 aapt는 R.java 파일을 단독으로 생성하고 app 모듈에서 자바compile 명령을 실행하여class 파일을 컴파일할 때 상수를 구체적인 값으로 변경합니다.
ButterKnife는 R.java 파일을 R2라는 이름으로 복사하여 대체하는 방법을 사용합니다.java, 그리고 R2.java에서 모든 변수에final 수식자를 추가하고 관련된 곳에서 R2 자원을 사용합니다.
자원 충돌
구성 요소화에서 의존하는module는aar 파일로 컴파일되어 의존하는module에 압축을 풀고 최종적으로 appmodule에 집합됩니다.이때gradle 메커니즘을 통해 중복된aar 파일이 발생하는 것을 방지합니다.컴파일에 중복된 라이브러리 자원을 추가하지 않습니다.의존된 라이브러리에 두 개의 중복된 라이브러리가 나타날 때가 있습니다. 이 때 기본적으로 버전이 높은 의존을 사용합니다.버전의 낮은 의존을 사용하려면 exclude 방식으로 제외할 수 있습니다.자원 이름이 중복되는 경우 자원 인용 오류가 발생할 수 있습니다.나중에 컴파일된 모듈은 이전에 컴파일된 모듈의 자원 필드의 내용을 덮어씁니다.
뒤섞이다
안드로이드 스튜디오는 ProGuard를 사용하여 혼동을 할 수 있다. 자바 바이트 파일을 압축, 최적화, 혼동할 수 있다. 압축과 최적화는 쓸모없는 클래스, 필드, 방법, 속성과 주석을 삭제할 수 있고 쓸모없는 주석을 삭제하고 바이트 파일을 최적화할 수 있다.존재하는 클래스, 필드, 방법, 속성을 간단명료하고 무의미한 이름으로 바꿀 수도 있다.
minifyEnabled true
: 혼동 열기shrinkResource true
: 자원 압축 열기proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
:proguard 파일의 경로 설정혼동 후 잘못된 정보에 따라 원래 잘못된 곳을 찾기 위해 대응하는 파일에서 대응하는 파일을 찾을 수 있습니다:/build/outputs/mapping/client/release/dump.txt: 디렉터리에 모든class 파일을 포함하는 구조mapping.txt: 혼동된 경로와 원래 경로의 映射 관계를 기록합니다.resources.txt: 자원 파일 정보를 기록합니다.seeds.txt: 헷갈리지 않는 클래스와 구성원, 헷갈리지 않는 클래스를 가지고 있는지 확인합니다.usage.txt: 삭제된 apk 코드를 누적합니다.
위챗은 혼동 메커니즘을 제공하는 데 쓰인다.
모든 모듈이 만들어진 후에 자신의proguard 파일이 있고, 각각의proguard 파일은 자신만의 혼동 규칙을 가지고 있다.모든 모듈이 자신의 혼동 규칙을 사용하면 중복 혼동을 일으켜 원본 파일을 찾을 수 없는 문제를 초래할 수 있습니다.모든 혼동을 피하기 위해 app module에 설정할 수 있습니다.
다중 경로 패키지
Android Studio는 다중 채널 모듈 구성 제공
productFlavors 속성은 서로 다른 채널을 설정하는 데 사용됩니다
manifestPlaceholders 속성은 서로 다른 채널의 다른 속성을 설정하는 데 사용되며, 이러한 속성은 안드로idManifest에 필요합니다.xml 파일에서 설명을 해야만 사용할 수 있습니다.
xxxCompile를 설정하여 서로 다른 채널에서 인용할 모듈을 설정합니다.
/**
* meta-data
* @param context
* @param metatName key
* @return
*/
public static Object getMetaData(Context context, String metatName){
Object obj= null;
try {
if (context !=null){
String pkgName = context.getPackageName();
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(pkgName, PackageManager.GET_META_DATA);
obj = appInfo.metaData.get(metatName);
}
}catch (Exception e){
Log.e("AppMetaUtil",e.toString());
}finally {
return obj;
}
}
/**
*
* @param context
* @return
*/
public static int getChannelNum(Context context){
if (channelNum <= 0){
Object obj = AppMetaUtil.getMetaData(context,"channel");
if (obj!=null && obj instanceof Integer){
return (int)obj;
}
}
return channelNum;
}
/**
*
* @param context
* @return
*/
public static String getSettingInfo(Context context){
if (settingInfo ==null){
Object obj = AppMetaUtil.getMetaData(context,"setting_info");
if (obj!=null && obj instanceof Integer){
return (String)obj;
}
}
return settingInfo;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.