안드로이드는 멀티 채널 성능 최적화 컴파일 방법 차별화

I. 서론 :

최근 성능 최적화 응용 프로그램은 몇 가지 타사 성능 테스트 프레임 워크를 추가합니다 :

1 leakcanary (메모리 누출 검출)

2 blockcanary 처리 된 (검출 수단)

프로젝트 개발 안드로이드 스튜디오 툴 컴파일 있기 때문에 전체 컴파일 시간에 자동으로받을 수 없어 컴파일 된 버전을 그대로 자기 디버깅의 개발을 컴파일 편리한 통합 위의 성능 테스트 도구를 넣어,하지만 할 필요가 있으므로, 메이크업 방법과 전체 프로젝트와 함께 컴파일 상단 도구 (도움말 및 로그 사용자 경험)에,뿐만 아니라 모든 개발자는 우리가 위의 기능을 사용할 수 있습니다 서로 독립적으로, 자식 라이브러리의 동일한 코드를 사용하는 것과 동일한 코드를 사용 충족합니다.

위의 상황에 맞는 코드를 컴파일 차별화가 필요하며, 안드로이드 스튜디오와 호환되며 컴파일 방법에 스크립트를합니다.

 

둘째, 분석

응용 프로그램에서 사용 1.leakcanary blockcanary 도구와 방법 만 다른 코드를 포함하지 않는, 클래스를 초기화 할 필요가있다, 구별 응용 프로그램을 차별화 할 필요가있다.

그것의 AndroidManifest.xml 파일을 구별 할 필요가있다, 그래서 2.application 필요는 AndroidManifest.xml에 선언합니다.

두 가지 방법으로 leakcanary 및 blockcanary 도구를 추가합니다 :

(1) 자료 다운로드 패키지 또는 항아리

(2) Gradle을 통해 직접 도입

주로 자신의 사용 및 다른 사람과 구별하기 위해 컴파일러를 사용하기을 개발해야 위의 도구를 추가 할 수 있기 때문에 두 가지 방법 내가 두 번째를 선택할 수 있습니다,이 요약 여러 채널이 포장되어 사용합니다.

4.make 컴파일러는 고객 또는 테스트는 위의 도구를 구별 할 필요가 컴파일 할 필요가 없습니다.

 

셋째, 구현

위의 분석을 바탕으로, 우리는 다음과 같은 작업을 수행해야합니다

A. 코드의 차이에 대해 별도의 디렉토리를 (이 디렉토리는 달리 다른 코드에 포함 된 다른 디렉토리로 번역 될 수있다 할 수 없음) 만들기

당신이 디렉토리를 사용하는 경우 몇 가지 문서의 고해상도, libs와 등도 추가 할 수 있도록 나는 주로 위의 응용 프로그램 파일을 수정할 필요가 여기입니다

프로젝트가 원래 기반으로 새로운 코드를 추가해야하기 전에 다시 한 경우, 새 있도록 응용 프로그램을 다시 작성 시작되지 않았기 때문에 1. (원래 작동하는지 확인)

import android.app.Application;
import android.content.Context;

import com.github.moduth.blockcanary.BlockCanary;
import com.squareup.leakcanary.LeakCanary;


public class LauncherApplication extends Application {

    private static Context mContext;
    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();

        //耗时检测初始化
        BlockCanary.install(this, new AppContext()).start();
        //内存泄漏初始化
        if (LeakCanary.isInAnalyzerProcess(this)) {
            // This process is dedicated to LeakCanary for heap analysis.
            // You should not init your app in this process.
            return;
        }
        LeakCanary.install(this);

    }

    public static Context getAppContext(){
        return mContext;
    }
}

 2. 다음은 매개 변수를 구성 할 수있는 새 파일입니다 BlockCanary


import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import com.android.launcher3.util.RyLogger;
import com.github.moduth.blockcanary.BlockCanaryContext;

public class AppContext extends BlockCanaryContext {
    private static final String TAG = "AppContext";

    @Override
    public String provideQualifier() {
        String qualifier = "";
        try {
            PackageInfo info = LauncherApplication.getAppContext().getPackageManager()
                    .getPackageInfo(LauncherApplication.getAppContext().getPackageName(), 0);
            qualifier += info.versionCode + "_" + info.versionName + "_YYB";
        } catch (PackageManager.NameNotFoundException e) {
            RyLogger.e(TAG, "provideQualifier exception"+e);
        }
        return qualifier;
    }

    @Override
    public int provideBlockThreshold() {
        //阻塞时间超过多少秒发通知
        return 1000;
    }

    @Override
    public boolean displayNotification() {
        return true;
    }

    @Override
    public boolean stopWhenDebugging() {
        return false;
    }
}

3. 마지막의 AndroidManifest.xml 파일도 기존 코드를 유지하고 응용 프로그램을 수정해야, 기본 응용 프로그램 파일이 교체

 <application
        android:name=".LauncherApplication"
        android:backupAgent=".LauncherBackupAgent"
        android:fullBackupContent="@xml/backupscheme"
        android:fullBackupOnly="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher_home"
        android:label="@string/derived_app_name"
        android:theme="@style/AppTheme"
        android:largeHeap="@bool/config_largeHeap"
        android:networkSecurityConfig="@xml/network_security_config"
        android:restoreAnyVersion="true"
        android:supportsRtl="true">

II. 수정 build.gradle

1. 주요 차이점은 코드 컴파일러를 추가하는 것입니다, 새로운 코드

 //新增目录需要编译内容,src,res,libs,manifest
        debug {
            java.srcDirs = ['debug_src']
            jniLibs.srcDirs = ['libs']
            res.srcDirs = ['res']
            manifest.srcFile "debug_src/AndroidManifest.xml"
        }
sourceSets {

        main {
            res.srcDirs = ['res']
            java.srcDirs = ['src']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
            manifest.srcFile 'AndroidManifest-common.xml'
            proto {
                srcDir 'protos/'
                srcDir 'proto_overrides/'
            }
        }

        //新增目录需要编译内容,src,res,libs,manifest
        debug {
            java.srcDirs = ['debug_src']
            jniLibs.srcDirs = ['libs']
            res.srcDirs = ['res']
            manifest.srcFile "debug_src/AndroidManifest.xml"
        }

        androidTest {
            res.srcDirs = ['tests/res']
            java.srcDirs = ['tests/src']
            manifest.srcFile "tests/AndroidManifest-common.xml"
        }

        androidTestDebug {
            manifest.srcFile "tests/AndroidManifest.xml"
        }

        aosp {
            java.srcDirs = ['src_flags', "src_ui_overrides"]
        }


}

2. 추가 방법을 소개

하나의 구현을 도입 두 현재 사용되는 방법 항아리 패키지

dependencies {
    implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')

    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
    // Optional, if you use support library fragments:
    debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.1'

}

세 차이 컴파일 된 파일을

다음과 같은 작업 요구 사항을 벌 수있는 새로운 도구를 추가해야하는 경우 1. 수행 할

include $(CLEAR_VARS)
LOCAL_MODULE :=  blockcanary #别名
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_SRC_FILES := libs/blockcanary.jar #包名
LOCAL_UNINSTALLABLE_MODULE := true
#LOCAL_SDK_VERSION := current
LOCAL_PRIVATE_PLATFORM_APIS:=true
include $(BUILD_PREBUILT)


include $(CLEAR_VARS)
LOCAL_MODULE := libxypatch3
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES_32 := libs/armeabi/libxypatch.so
LOCAL_SRC_FILES_64 := libs/arm64-v8a/libxypatch.so
LOCAL_MULTILIB := both
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(BUILD_PREBUILT)

LOCAL_STATIC_JAVA_LIBRARIES +=  blockcanary \ libxypatch3 #加入静态库
LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    $(call all-java-files-under, src_ui_overrides) \
    $(call all-java-files-under, src_flags) \
    $(call all-proto-files-under, protos) \
    $(call all-proto-files-under, debug_src/src) #新增


LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/debug_src/res #新增

LOCAL_FULL_LIBS_MANIFEST_FILES := $(LOCAL_PATH)/debug_src/AndroidManifest-common.xml #新增

2. 당신은 컴파일을 만들기 위해 추가해야하는 경우

이미 방지하기 위해, 다른 디렉토리로 이동해야 할 필요성을 포함하는 경우이 들어있는 디렉토리를 컴파일하기 전에 새로운 debug_src 디렉토리에주의 할 필요가 컴파일되는

 

요약 :

차이는 메모 컴파일러 :

1. 디렉토리의 차이가 다른 편집의 독립 포함되지이다

2. 대응하는 소스 코드, 자원, libs와, AndroidManifest.xml을는 분화를 수정하고 있는지 내측에 배치 build.gradle

3. 새로운 기능은 원래의 기능에 영향을 미칠 것입니다 않는다

코멘트를 작성 약간의 차별화를 추가하십시오

게시 92 개 원래 기사 · 원 찬양 27 ·은 90000 +를 볼

추천

출처blog.csdn.net/zhuxingchong/article/details/103281509