Android用のスタンドアロンライブラリの作成

この記事では、他のライブラリーを使用し、同時にすべてを1つのjarに収めるライブラリーを作成する方法を説明します。



ライブラリを書いていると仮定すると、それは他のライブラリ、特にサポートライブラリなどを使用します。 Mavenを使用した場合、pomファイルに依存関係を記述しただけで、スチームしませんでした。 しかし、アセンブリシステムを使用していない、またはアリを使用していない人がライブラリを使用している場合はどうでしょうか。



jarの横に依存関係を配置できます。 ただし、たとえば、サポートライブラリの1つのバージョンを使用し、アプリケーション自体で別のバージョンを使用する場合など、異なるバージョンのライブラリの競合は避けられません。 次に、手でそれらの1つを削除する必要があります。



別の方法で移動することもできます。jarは通常のzipファイルです。 すべての依存関係をアンパックし、.classファイルの形式でバイトコードを取得し、ライブラリのコードをコンパイルし、すべての.classファイルを1か所に配置して、そこからjarを収集します。 しかし、アプリケーションが私たちのものと同じライブラリを使用している場合、プロジェクトに2つの同一のクラスがあるというエラーが表示されます。



この問題を解決するには、jarjarユーティリティを使用します。 jarファイル内のすべてのクラスの名前を変更します。 サポートライブラリの例では-すべてのクラスはパッケージandroid.support.v4にあります



使用例:

java -jar jarjar.jar process <rulesFile> <inJar> <outJar> rulesFile -     inJar, outJar -   
      
      





クラスの名前を変更するルールを作成し、android.support.v4に* inner.android.support.v4に*

 rule android.support.v4.** inner.android.support.v4.@1
      
      



そしてrules.txtファイルに保存します



打ち上げ

 java -jar jarjar.jar rules.txt android-support-v4.jar android-support-v4-renamed.jar
      
      





その結果、クラスの名前が変更されたjarを取得しました。 次に、名前を変更したクラスを使用してすべての依存関係をアンパックし、コンパイルします。 実行に必要なすべてのコードを含むライブラリを取得します。



私たちのライブラリには、すべての依存関係のコードが含まれています。 サイズを縮小するには、プロガードを適用して未使用のクラスとメソッドを削除します。



そして最後に、これをすべて行う小さなgradleスクリプト



 apply plugin: 'java' defaultTasks 'proguard' task unpackJars(dependsOn: compileJava) { //    file('libs').listFiles().each { File file -> if (file.name.endsWith('.jar')) { copy { from(zipTree(file.path)) into('build/classes/main') } } } // jar' tasks.jar.execute() } task proguard(type: proguard.gradle.ProGuardTask, dependsOn: unpackJars) { injars 'build/libs/library.jar' outjars 'build/libs/proguard_library.jar' libraryjars '/Applications/my/Android Studio.app/sdk/platforms/android-10/android.jar' //        keep 'class com.CasualSoftware.classloader.library.**' } dependencies { compile 'com.google.android:android:2.2.1' compile fileTree(dir: 'libs', include: ['*.jar']) }
      
      





ハウルなど、スクリプトを実行した後、proguard_library.jarを取得します。これはアプリケーションに追加して使用できます。



私の場合、ライブラリはサポートライブラリとDropbox SDKを使用し、50 kBの重量があります。



同様に、apkのサイズを小さくすることができ、すべての依存関係をjarファイルとしてではなく、.classesで展開してプロガードを適用すると、ライブラリから未使用のクラスが削除されます。 したがって、apkのサイズを増やすことを恐れずに、重いフレームワークをプロジェクトに接続できます。



All Articles