序文
jar パッケージにリソース ファイルとサードパーティ ライブラリ コードを含めることができないという問題を解決するために、Android では aar パッケージがリリースされました。パッケージ化された aar にはリソース ファイルとサードパーティ ライブラリ コードを含めることができ、SDK の開発が大幅に容易になります。
ただし、dex の動的読み込みのプロセスでは、dex は jar を通じてのみ生成できるため、SDK は jar のみを使用するように制限されます。
- リソース ファイルは、バイナリ、base64、およびその他のソリューションで解決できます。
- サードパーティライブラリのコードには3つのソリューションがあり、ライブラリのサイズやリソースファイルの有無などに応じて総合的に選択できます。
1.ソースコードをコピーする
サードパーティ ライブラリのコードの量が少なく、必要なリソースの関連付けがない場合は、サードパーティ ライブラリのソース コードを直接ダウンロードして、それをライブラリにコピーできます。
アドバンテージ
- 操作は簡単で、コピーしたコードは保守性が高くなります。
- 大規模なライブラリで個々のメソッドのみを使用する必要がある場合は、それらをコピーして不要なコードを削除することもでき、これによりライブラリのサイズを削減できます。
欠点がある
- リソース ファイルと他のライブラリへのリンクを含むサードパーティ ライブラリには適用されません。
- 難読化されているライブラリ、または公開ソース コードを持たないライブラリには適用されません。
- コピーされたサードパーティのライブラリ コードにバグがある場合、時間内に発見および修復できない可能性があります。
- サードパーティライブラリをアップグレードすると、新しく追加した機能は使用できなくなるため、再度コピーして変更する必要があります。
2. メインプロジェクトも依存関係を参照します
実践的なテストの後、ライブラリ プロジェクト jar を導入するメイン プロジェクトに同じ依存関係が同時に追加されます。これにより、jar パッケージ内のコードが正常に実行されることが確認され、リソース ファイルも同時に使用できるようになります。
たとえば、ライブラリ プロジェクトに画像ライブラリを導入する場合glide
、メイン プロジェクトは次の依存関係を同時に追加できます。
//Glide4.x
implementation 'com.github.bumptech.glide:glide:4.13.1'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.13.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.1'
アドバンテージ
- 最も簡単で、理論的にはサードパーティのライブラリで動作します。
- 同時に、サードパーティのライブラリのリソースも使用できます。
- サードパーティのライブラリ コードは簡単にアップグレードできます。
欠点がある
- メインプロジェクトの要件は高く、明確な文書が必要です。
- メイン プロジェクトのサードパーティ ライブラリのバージョンは、ライブラリ プロジェクトのバージョン以上であることが望ましいです。下位バージョンに互換性がない場合、jar パッケージ コードでエラーが発生します。
3.jarパッケージをマージします
サードパーティのライブラリに必要なリソースの関連付けがない場合は、jar パッケージをマージすることで関連付けることができます。
1.jarをダウンロードする
一般的なサードパーティ ライブラリの jar パッケージは、Maven でダウンロードできます: https://mvnrepository.com/
QR コード ライブラリ zxing を例に挙げます。
2. 瓶を交換します
ダウンロードした jar をライブラリ プロジェクトの libs ディレクトリに置きます。サードパーティ ライブラリのリモート依存関係を
削除し、jar パッケージのインポートに置き換えます。dependencies
dependencies {
//使用lib下的jar或者aar
implementation fileTree(dir: 'libs', include: ['*'])
}
2. デバッグコード
リモートの依存関係を jar に置き換えた後、デバッグ コードは正常になりますか?
3. ジャーをマージする
次のコードをライブラリ プロジェクトに追加しbuild.gradle
、sync now
//根据Library名称生存jar包到build目录下
task makeJar(type: Jar) {
//Library名称
def name = project.name
//删除之前的旧jar包
delete 'makejar/' + name + '-' + appVersionName + '.jar'
//删除之前的旧dex包
delete 'makejar/' + name + '_dex-' + appVersionName + '.jar'
//目标jar包名称
archiveName name + '-' + appVersionName + '.jar'
//从这个目录下取出默认jar包,不同版本目录均不一样,根据自己项目在build中找classes.jar所在目录
from(project.zipTree('build/intermediates/aar_main_jar/release/classes.jar'))
//第三方jar,是需要打包进入jar的
from(project.zipTree("libs/zxing-core-3.5.1.jar"))
include('com/**', '**/')
//需排除一些无用文件
exclude('**/META-INF/**', '**/BuildConfig.class')
//此段代码将相关信息写到META-INF文件中的MANEFEST.MF文件
manifest {
attributes('Library-Name': "${
project.name}", 'Library-Version': "${
appVersionName}")
}
//打进jar包后的文件目录
destinationDirectory = file('makejar')
}
makeJar.dependsOn(build)
aMakeJar タスクを実行してmakejar
、ライブラリ プロジェクトの jar をディレクトリに生成します。
次のように jar を解凍すると、成功したことがわかります。メイン プロジェクトは jar パッケージをインポートし、サードパーティのライブラリ コードは通常どおり実行できます。
アドバンテージ
- この操作はソースコードをコピーするよりもはるかに便利です。
- リソース ファイルを含まないサードパーティ ライブラリに適用できます (jar を取得できる場合)。
- サードパーティのライブラリは他のサードパーティのライブラリと関連付けられており、この方法に従って同時にマージすることもできます。
- 難読化された jar パッケージが適用されます。
欠点がある
- リソース ファイルを含むサードパーティ ライブラリには適用されません。
- サードパーティライブラリは保守性が悪く、アップグレードも面倒です。