2016-04-12 6 views
4

applicationVariants.dex.dependsOnコードをdexファイルに変換する前にいくつかの追加作業を行うというタスクがあり、Androidのgradleプラグイン1.3より前にすべてうまくいきました。しかし、1.4以降、dexタスクへのアクセスは禁止されており、そのようなエラーのヒントが表示されます。 enter image description hereAndroid Gradleプラグインが提供するTransform APIの使い方

OK。新しい変換APIをdexタスクの代わりに使用する必要があります。しかし、問題は実際にはTransform APIについてのほとんどのドキュメントがないことです。私が見つけたのは、Google公式文書hereですが、それはあまり理解しにくいようでした。

だから私は私が正しかった場合、私は本当に知りませんどのカスタムトランスフォームを書き込もうとしました:

public class MyTransform extends Transform { 

    @Override 
    public String getName() { 
     return "MyTransformImpl"; 
    } 

    @Override 
    public Set<QualifiedContent.ContentType> getInputTypes() { 
     Set<QualifiedContent.ContentType> set = new HashSet<QualifiedContent.ContentType>(); 
     set.add(QualifiedContent.DefaultContentType.CLASSES); 
     return set; 
    } 

    @Override 
    public Set<QualifiedContent.Scope> getScopes() { 
     Set<QualifiedContent.Scope> set = new HashSet<QualifiedContent.Scope>(); 
     set.add(QualifiedContent.Scope.PROJECT); 
     return set; 
    } 

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

} 

それが空カスタムを変換します。私はtranformロジックを追加していませんが、それは問題ではありません。 はその後、私はこのが私のGradleファイルで文書化されたAPIを使用してを変革登録:

def transform = new MyTransform() 
project.android.registerTransform(transform) 

それらを私はタスクを組み立てる実行すると、私のカスタム変換作業と思われます。

enter image description here

そして最後のapkファイルが正常に生成された、すべてが右のようだ:私は、実行中のタスクリストからそれを見ることができます。しかし、私はapkをインストールし、アプリケーションを起動すると、クラッシュしました。このようなエラーが発生した:奇妙な

enter image description here

ClassNotFoundExceptionが発生し、MainActivityが見つかりませんでした。どのようにすることができる!その後、私のapkファイルを再コンパイルし、jd-guiのソースを参照して、私は完全に混乱していた。

enter image description here

私のコードがすべて含まれていません。サポートライブラリ内のクラスのみが残ります。しかし、実際に私のコード.classファイルは、app/build/intermediate/classes/ディレクトリに存在します。そして、もし私がgradleの登録行をコメントアウトすると:

// project.android.registerTransform(transform) 

すべてがうまくいきます。だから私は間違ってカスタム変換を書いたと思うが、私は本当に正しいものを書く方法を知りません。

助けてもらえますか?心から感謝します。

+0

こんにちはTony、Transform API用のGitHubでサンプルアプリケーションを提供していただけますか? – Krrishnaaaa

答えて

4

Transformを実装するときは、ファイルを処理して出力フォルダに書き込む必要があります。クラスファイルを処理しなくても、それらを出力フォルダにコピーする必要があります。あなたがそれをしない場合、すべてのクラスファイルが削除されます。

Transformを動作させるには、次の手順を実行する必要があります。まず、変換が入力クラスファイルを処理し、クラスファイルを生成するように指定する必要があります。

@Override 
    Set<QualifiedContent.ContentType> getInputTypes() { 
    return Collections.singleton(QualifiedContent.DefaultContentType.CLASSES) 
    } 

    @Override 
    Set<QualifiedContent.ContentType> getOutputTypes() { 
    return EnumSet.of(QualifiedContent.DefaultContentType.CLASSES) 
    } 

    @Override 
    Set<QualifiedContent.Scope> getScopes() { 
    return EnumSet.of(QualifiedContent.Scope.PROJECT) 
    } 

はその後transform方法であなたは、入力と出力フォルダを取得する必要があります。

final DirectoryInput directoryInput = inputs.first().directoryInputs.first() 
final File input = directoryInput.file 
final File output = outputProvider.getContentLocation(
    directoryInput.name, EnumSet.of(QualifiedContent.DefaultContentType.CLASSES), 
    EnumSet.of(QualifiedContent.Scope.PROJECT), Format.DIRECTORY) 

そして最後に、あなたはinputからoutputにすべてのファイルをコピーする必要があります。

ここにTransformationを実装するprojectがあります。実際の例を使って変換がどのように機能するかを理解する方が簡単かもしれません。

+0

詳細は何ですか?私は実際にファイルを処理して出力フォルダにコピーする方法を知らない。文書でこれについて何も見つかりませんでした。ありがとう –

+0

答えに詳しい情報を追加しました。 – Michael

+0

また、Transform APIを使用するプロジェクトへのリンクを追加しました。 – Michael

関連する問題