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