アンドロイドは、マルチチャネルのパフォーマンスの最適化のコンパイル方法を区別しました

I.はじめに:

最近のパフォーマンスの最適化アプリはいくつかのサードパーティの性能テストフレームワークを追加します。

1、leakcanary(メモリリーク検出)

2、blockcanary(加工検出手段)

プロジェクト開発のAndroid Studioツールのコンパイルので、しかし、完全なコンパイル時に自動的に取ることができないコンパイルされたバージョンをAS自己デバッグの開発をコンパイル便利に組み込まれた上記のパフォーマンステストツールを置くが、する必要があるので、メイクの仕方やプロジェクト全体と一緒にコンパイルされていますトップツール(ヒントやログのユーザーエクスペリエンス)にするだけでなく、すべての開発者が、我々は上記の機能を使用することができ、互いに独立して、gitのライブラリの同じコードを使用するのと同じコードを使用して満たすことができます。

このような状況のためのコードのコンパイル分化を必要とし、アンドロイドスタジオと互換性があり、コンパイル方法にスクリプトを作ります。

 

第二に、分析

アプリケーションで使用される1.leakcanary blockcanaryツールと方法が唯一の他のコードを含まない、クラスを初期化するために行われる必要があり、際立ったアプリケーションを区別する必要があります。

AndroidManifest.xmlファイルを区別する必要があるので、2.application必要性は、AndroidManifest.xmlを内で宣言されます。

二つの方法でleakcanaryとblockcanaryツールを追加します。3.:

(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. [追加導入方法

1の実装を導入している二つの現在使用方法のjarパッケージ

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.分化を変更しbuild.gradle内側に配置するかどうかを、対応するソースコード、リソース、LIBS、AndroidManifest.xmlを、

3.新機能は、元の機能に影響を与えますん

コメントを書くいくつかの分化を追加4.

公開された92元の記事 ウォン称賛27 ビュー90000 +

おすすめ

転載: blog.csdn.net/zhuxingchong/article/details/103281509