Android diferenciada multi-canal de otimização de desempenho método de compilação

I. Introdução:

Um aplicativo recente otimização de desempenho adiciona vários framework de testes de desempenho de terceiros:

1, (detecção de fuga de memória) leakcanary

2, meios de detecção (processado) blockcanary

Porque as compilações estúdio ferramenta android desenvolvimento do projeto, mas no tempo de compilação completo é compilado em conjunto com o make caminho e todo o projeto, por isso é necessário para colocar automaticamente a ferramenta de teste de desempenho acima incorporados conveniente como compilar o desenvolvimento da auto-depuração, mas fazer a versão compilada não pode tomar em ferramentas superior (dicas e logs experiência do usuário), mas também para atender todos os desenvolvedores usar o mesmo código independentemente um do outro, bibliotecas git usar o mesmo código que pode usar a função acima.

Para a situação acima requer diferenciação compilar o código, e é compatível com o estúdio android e fazer um script para maneira de compilação.

 

Segundo, a análise

ferramentas e métodos blockcanary 1.leakcanary utilizados na aplicação só precisa ser feito para inicializar classe, não envolve o outro código, é necessário diferenciar a aplicação distinto.

2.Application necessidade de ser declarado no AndroidManifest.xml, por isso é necessário diferenciar arquivo AndroidManifest.xml.

3. Adicione ferramenta leakcanary e blockcanary de duas maneiras:

pacote de download (1) Fonte ou jar

(2) é introduzido directamente através Gradle

Ambos os métodos podem escolho o segundo, porque principalmente para adicionar as ferramentas acima você precisa para desenvolver seu próprio uso e para outras pessoas para usar o compilador de distinguir, este resumo usa múltiplos canais são embalados.

compilador 4.Make é para o cliente ou o teste não precisa compilar as ferramentas acima preciso distinguir.

 

Em terceiro lugar, a implementação

Com base na análise acima, é preciso fazer o seguinte trabalho:

A. Criar um diretório separado para diferenças no código (este diretório não pode ser de outra forma poderiam ser traduzidos em outros diretórios contidos no outro código)

Eu estou aqui principalmente para a necessidade de modificar os arquivos do aplicativo acima tão poucos documentos res, libs, etc Se você usar o diretório também podem ser adicionadas

1. porque o projeto não começou reescrever a aplicação, então uma nova, se você tiver reescrito antes que você precise adicionar um novo código baseado no original (garantir que a função original)

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. O seguinte é o novo arquivo para configurar os parâmetros 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. Arquivo Finalmente AndroidManifest.xml também precisa manter o código existente e modificar o aplicativo, o arquivo do aplicativo principal é substituído

 <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. Modificar build.gradle

1. A principal diferença é adicionar o compilador de código, o novo código

 //新增目录需要编译内容,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. Adicionar introduzido maneira

Dois pacote jar maneira usado atualmente quando se está introduzido Implementação

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'

}

Três, tornar o arquivo diferença compilado

1. Se você precisa adicionar novas ferramentas para fazer as seguintes necessidades de trabalho a ser feito

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. Se você precisa adicionar para fazer a compilação

A necessidade de prestar atenção para o novo diretório debug_src antes de compilar o diretório que contém Se você já incluíram a necessidade de mudar para um diretório diferente, para evitar ser compilado

 

resumo:

Diferenças compilador para nota:

1. É a diferença do diretório não é independente da outra compilação incluído

2. O código de fonte correspondente, recursos, bibliotecas, AndroidManifest.xml, quer para modificar a diferenciação e disposta no interior da build.gradle

3. Será que os novos recursos irá afetar a função original

4. Adicione alguma diferenciação Escrever um comentário

Publicado 92 artigos originais · ganhou elogios 27 · vê 90000 +

Acho que você gosta

Origin blog.csdn.net/zhuxingchong/article/details/103281509
Recomendado
Clasificación