警告:本文年久失修。
隨着android studio的升級 ,gradle的升級,嚴格按照本文的代碼去做可能不會成功,希望依然可以作為解決問題的思路。
最近項目在做一個sdk,供別的開發者使用,所以要求導出jar包。
與eclipse不同,android studio 1.0 沒提供導出jar包的圖形界面。需要結合gradle來生成jar包。
首先 需要設置module應用的gradle插件為 library 代碼長這樣:
apply plugin: 'com.android.library'
這樣,build的時候,android studio 1.0會在 module目錄的build/intermediates/bundles/release/ 子目錄(這個目錄以后版本可能會變)里生成一個名為classes的jar包。
如果你的項目沒用到assets等資源文件,那你直接拷貝出去就可以用了。
如果想拷貝到outputs目錄的話,在module的build.gradle里添加以下代碼:
task clearJar(type: Delete) {
delete 'build/outputs/yourname.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('build/outputs/')
include('classes.jar')
rename ('classes.jar', 'yourname.jar')
}
makeJar.dependsOn(clearJar, build)
如果你和我一樣,還需要把assets目錄打包到jar包的話,請繼續往下看。
我用了一個非主流的方式打包assets,應該沒什么后遺症,咱們江湖兒女都懂的,hack一下更健康。
其實也沒啥神秘的,也不知道算不算hack,就是利用文件依賴來打包assets。代碼長這樣:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
provided files('src/main/assets')
compile 'com.android.support:appcompat-v7:21.0.3'
}
關鍵是第三行代碼。還有一點一定要注意,需要在assets新建一個名為assets的目錄,在這個子目錄里放置你需要的文件。這樣才可以哦。
還沒完,不知道啥原因,只有minifyEnabled設置為 true才能把assets打包進去。沒有去深究,反正我也需要混淆下代碼。
好了,android studio 使用gradle 導出jar包,並打包assets目錄 ,我說明白了,對吧。
另附 proguard配置:
-libraryjars 'C:\Soft\android\adt\sdk\platforms\android-19\android.jar'
-optimizations !code/simplification/arithmetic
-allowaccessmodification
-repackageclasses ''
-keepattributes *Annotation*
-dontpreverify
-dontwarn android.support.**
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context,android.util.AttributeSet);
public <init>(android.content.Context,android.util.AttributeSet,int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context,android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
-keepclassmembers class * extends android.os.Parcelable {
static ** CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-keepclassmembers class * {
@android.webkit.JavascriptInterface
<methods>;
}