バージョン4.4から4.6へのGradleプロジェクトのアップグレード

一、背景

GraldeバージョンAGP(アンドロイドのGradleプラグイン)バージョン、一定の関係を有するAGPのGradleため、実質的にプラグとして、宿主としてのGradleに応じ。したがって、AGPの異なるバージョンは、対応するバージョンGraldeと一致する必要があります。以下のそれぞれのバージョンとの対応関係:

 

 

公式文書を具体的に参照:
developer.android.com/studio/rele ...

現在のプロジェクトは、Gradleのバージョン4.4を使用している、AGPバージョンは3.1.0です。プログレッシブポリシーに準拠するには、このアップグレード、目標はバージョン4.6 Graldeにアップグレードすることで、対応した、AGPは3.2.1にアップグレードしてください。

考慮すべき主なポイント:
1、増分アップグレード、4.4から4.6へのアップグレードのみ、プロジェクトの安定性を確保するために、アカウントのアップグレードを考慮しながら、
2、Gralde及びAGPバージョンをアップグレードするには、より高速なプロジェクトをビルドを助長している;
3、すぐにアップグレード後準備するAndroidX。


第二に、主要な問題と解決策

過去の経験を考える:各アップグレードではない単純な変更は、それとてもシンプルバージョン、各アップグレードはまた、いくつかの問題に対処する必要が発生します。
同様に、アップグレード、または次のように主に記録されたいくつかの問題が、発生しました:

2.1プロジェクトのカスタムメソッドシグネチャの問題プラグイン

図1に示すように、問題:
Gradleのバージョンで修正gradle-wrapper.propertiesは4.4 4.6から変更します

....
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
复制代码

build.gradle 3.2.1にAGP 3.1のアップグレードから、ルートディレクトリにプロジェクトファイルを変更します。

dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1'
    ....
    ....
}
复制代码

プロジェクトの建設は、次のエラーが見つかりました:

App:cornProdReleaseMultidexKeep (Thread[Task worker for ':' Thread 4,5,main]) started.
:App:cornProdReleaseMultidexKeep
Caching disabled for task ':App:cornProdReleaseMultidexKeep': Caching has not been enabled for the task Task ':App:cornProdReleaseMultidexKeep' is not up-to-date because: Task has not declared any outputs. try to update manifest_keep.txt can't find getManifestKeepListFile method, exception:groovy.lang.MissingMethodException: No signature of method: com.android.build.gradle.internal.scope.VariantScopeImpl.getManifestKeepListFile() is applicable for argument types: () values: [] :App:cornProdReleaseMultidexKeep FAILED :App:cornProdReleaseMultidexKeep (Thread[Task worker for ':' Thread 4,5,main]) completed. Took 0.071 secs. 复制代码

間違った情報に基づいて、実行された:App:cornProdReleaseMultidexKeepタスクは、そこに呼び出しているとき、getManifestKeepListFileこの方法は、こちらのAGP版のアップグレード、および歴史的な互換性のある、直接エラーに対応していません。

2は、解決するために:
現在のサブプロジェクトを直接Googleの公式multidexプログラムから。調査は、ここではプロジェクトチームのカスタムプラグインであり、外部の設定項目が用意されています。ティンカーオブジェクトが構成maindexに添加することによって場合、対応するサブ項目が書き込まれるモデル化されたmanifest_keep.txt対応を保持するためにmaindexlist.txtmaindexに包装されるように、クラスに対応して、5.0以下のモデルが表示され、ClassNotFoundException関連するエラーを。追加maindex構成の完了に相当multidex対応するタスクのリンクを、フックアップすることで対応するタスクを接続します。

ボディは、ロジックを実装、次のとおりです。

OptMainDexTask.groovy

@TaskAction
def doAction() {
    def ext = project.extensions.findByName(OptMainDexExtension.NAME) as OptMainDexExtension
    if (!ext.enable) {
        project.logger.error("optMainDex enable set false!")
        return } project.logger.error("try to update manifest_keep.txt") StringBuffer lines = new StringBuffer() lines.append("#optMainDex.loader patterns here\n") Iterable<String> loader = ext.loader for (String pattern : loader) { if (pattern.endsWith("*")) { if (!pattern.endsWith("**")) { pattern += "*" } } lines.append("-keep class " + pattern + " {\n" + " <init>(...);\n" + "}\n") .append("\n") } File multiDexKeepProguard = null try { multiDexKeepProguard = applicationVariant.getVariantData().getScope().getManifestKeepListProguardFile() } catch (Throwable ignore) { try { multiDexKeepProguard = applicationVariant.getVariantData().getScope().getManifestKeepListFile() } catch (Throwable e) { project.logger.error("can't find getManifestKeepListFile method, exception:${e}") } } if (multiDexKeepProguard == null) { project.logger.error("auto add multidex keep pattern fail, you can only copy ${file} to your own multiDex keep proguard file yourself.") return } FileWriter manifestWriter = new FileWriter(multiDexKeepProguard, true) try { for (String line : lines) { manifestWriter.write(line) } } finally { manifestWriter.close() } } 复制代码
cornPlugin.groovy

@Override
void apply(Project project) {
    ...
    initDex(project)
    ...
}

def initDex(Project project) {
    // 只支持Gradle 3.0以上
    project.extensions.create(OptMainDexExtension.NAME, OptMainDexExtension)
    def android = project.extensions.android

    project.afterEvaluate {
        OptMainDexExtension optMainDexExtension = project.extensions.getByName(OptMainDexExtension.NAME)

        if (!optMainDexExtension.enable) {
            return
        }

        android.applicationVariants.all { variant ->
            def variantOutput = variant.outputs.first()
            def variantName = variant.name.capitalize()
            def variantData = variant.variantData
            boolean multiDexEnabled = variantData.variantConfiguration.isMultiDexEnabled()

            if (multiDexEnabled) {
                OptMainDexTask dexConfigTask = project.tasks.create("corn${variantName}MultidexKeep", OptMainDexTask) dexConfigTask.applicationVariant = variant // for java.io.FileNotFoundException: app/build/intermediates/multi-dex/release/manifest_keep.txt // for gradle 3.x gen manifest_keep move to processResources task dexConfigTask.mustRunAfter variantOutput.processResources def multidexTask = TaskUtil.getMultiDexTask(project, variantName) if (multidexTask != null) { multidexTask.dependsOn dexConfigTask } def collectMultiDexComponentsTask = TaskUtil.getCollectMultiDexComponentsTask(project, variantName) if (collectMultiDexComponentsTask != null) { dexConfigTask.mustRunAfter collectMultiDexComponentsTask } } } } } 复制代码

ティンカーAGPバージョンが3.2.1にアップグレードし、後の使用をサポートしていますので、OptMainDexTask、言葉遣いは、今ここで新しいバージョンいじくりが変更されている、前にいじくりをモデル化しています。

 

developer.android.com/studio/builは...
参照は、それが直接を通じてプラグインの約1から必要はありませんmaindex構成のため、実際には、公式ドキュメントをmultidex multiDexKeepFileまたはmultiDexKeepProguardメインプロジェクトで構成することができます。

対応プロジェクトチーム独自のプラグインプラグインのバージョンアップ、墓石ここでは、maindex、主なエンジニアリングが再導入され、メインプロジェクトに対応する設定と幸いmaindex構成に対応する構成を維持する必要性、削除しmultiDexKeepProguardたファイル、およびの導入を。

defaultConfig {
    ....
    ....
    multiDexEnabled true
    multiDexKeepProguard file('multidex-config.pro')
    ....
    ....
}
复制代码

2.2リソースの難読化ツールは異常AndResGuard

1、問題:

、次のエラーメッセージが表示され再構築します。

parse to get the exist names in the resouces.arsc first
com.tencent.mm.androlib.AndrolibException: Could not decode arsc file
at com.tencent.mm.androlib.res.decoder.RawARSCDecoder.decode(RawARSCDecoder.java:74)
at com.tencent.mm.androlib.ApkDecoder.decode(ApkDecoder.java:190)
at com.tencent.mm.resourceproguard.Main.decodeResource(Main.java:96)
....
复制代码

検索に対応して、このような対応や非行など、多くの人々からのフィードバックがあるAndResGuard GitHubのが見つかりました:github.com/shwenzhang / ...


2、解決するために:

その理由は、アップグレード後に、システムのデフォルトがアップグレードすることでbuildToolsVersion、バージョン28.0.3に。リソースの問題をデコードする大手。現在のプロジェクトのbuildToolsVersionバージョン27.0.3、直接の除去、対応するデフォルトのAGP buildToolsVersion設定のバージョンを。

一方、AndResGuard最新バージョンは、最新バージョンの現在のバージョンへの直接アップグレードがこの問題を解決しました。

....
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
....
复制代码

ビルドは再び、構築に成功。

検証は、関連下請けmaindex manifest_keep.txtmaindexlist.txt期待に沿ったもの。5.0携帯電話のインストールとテストは、あなたが適切に実行することができます。


第三に、結論

4.6へのアップグレードのGradle、AGPは3.2.1へのアップグレードに対応し、主なポイントを更新しました:

1は、buildToolsVersionポリシーのデフォルトのバージョンを取り始めた、AGPは、独自のバージョンに合わせて構成に対応させていただきますbuildToolsVersionので、特別なニーズのため、人々はまた、指定に行くことができる場合であっても、リリースbuildToolsVersionバージョンが、それでもレンジバージョンのAGP版に対応している必要があります。

2、AndroidXへの直接の移行のための公式のサポートを提供し始めました。Googleがされているandroid.*置き換えandroidx.*、およびライブラリAndroidXフォームを拡張するためのプロジェクトを移行するので、できるだけ早く、オリジナルの拡張ライブラリを維持するために更新されません、それも必要です。

3、脱糖でD8(脱糖)がさらに使用Java8のサポートを提供し、デフォルトで有効になって。

4、新しいコードの難読化ツール、R8は、元ProGuardのツールを置き換えるために、現在のデフォルトがオンにされていない、それは設定を通してオンにすることができます。

android.enableR8 = true
复制代码

概念のさまざまなバージョンを含む、Andoridプロジェクトの開発、。プロジェクトは、反復、公式の開発ツール、対応する支援環境、ツール、ライブラリ、拡張機能、などを継続している間、常に更新されています。優れた開発経験、速度と新機能のコンパイルをサポートし、常に適切なバージョンをアップグレードするためにタイムリーなニーズを持っているし続けること。


著者:HappyCorn
リンクします。https://juejin.im/post/5d6510796fb9a06b2e3d02c8
出典:ナゲッツの
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/lwbqqyumidi/p/11991779.html