記錄下Gradle化Android Gallery3D應用的過程
意義
Android系統裡面有很多優秀的應用。Gallery3D就是十分優秀的一個。裡面包含了renderscript影象處理,OpenGL特效渲染等一系列的功能。很多同學以為它是在Android原始碼裡面,所以一直敬而遠之。但實際上它幾乎沒有使用什麼私有的API,完全可以獨立出來用SDK編譯成app放到其他版本的手機上面執行。我在一年前研究濾鏡的時候做過一個版本的Gallery3D應用,但是一年過去了,Gallery3D程式碼也改了很多,是時候重新做一個了。這次記錄了一下過程。
準備程式碼
Android的原始碼下載可以參考 Android原始碼下載。但是我們並不需要全部下載。repo init -u https://android.googlesource.com/platform/manifest
匯入到Android studio
在Android Studio啟動介面,點選Import Project(Eclipse ADT, Gradle, etc.)
然後選中我們剛才Clone的專案一路下一步就可以了。這個時候會有一個報錯:
不用驚慌,在build.gradle裡面加上renderscriptTargetApi和修改下compileSDKVersion就可以了。如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.android.gallery3d"
minSdkVersion 14
targetSdkVersion 24
renderscriptTargetApi 18
renderscriptSupportModeEnabled true
ndk {
moduleName "libjni_eglfence"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
然後再sync一下,會得到很多duplicate string的錯誤(Android原始碼裡面aapt多支援一個叫product的tag,但是SDK並不支援),另外還有一張空白的圖片資源導致編譯不過(可能原始碼裡面的aapt版本和SDK裡面的不同,所以原始碼裡面能編譯)。我們刪除這張空白的filter_show_state_button_background
圖片,然後除了values和values-zh-rCN以外所有的語言資源包,然後再把剩下的strings.xml裡面帶有product tag的重複字串刪除一個。然後儲存再次sync,這次sync就沒有任何錯誤了,可以嘗試編譯了。^_^
修改錯誤程式碼
別以為這樣就成功了,出現一大堆找不到類的錯誤。一類是在gallery2d目錄下的程式碼,Android Studio沒有匯入的;一類是其他的依賴庫的程式碼。我們很容易發現gallerycommon和src_pd目錄下所有的類都沒有匯入進來。直接把gallerycommon/src/com/android/
和src_pd/src/com/android/
所有的包複製到Android Studio的com.android
包下,再次編譯會發現已經少了很多錯誤。根據錯誤資訊,還需要加入supportv4和supportv13,我們再加入後再試試。現在看起來只缺少這兩個包了:
這兩個從包名上看就知道是在Google原始碼的第三方庫了。我們可以藉助原始碼瀏覽工具確認它們的程式碼在哪裡,而不需要clone整個Android的原始碼,方法如下:
1) 開啟http://androidxref.com/,然後選中6.0.1_r10,搜尋我們缺少的類名。這裡我在Symble處搜尋XMPMeta
確定了我們需要的庫在/external/xmp_toolkit/工程下。然後clone下來
git clone https://android.googlesource.com/platform/external/xmp_toolkit
然後我們把裡面的java檔案通過新建一個module的形式匯入到我們的Android studio裡面。相似的,mp4parser和coremedia兩個庫也可以通過這個方式去下載下來,然後匯入到Android Studio裡面。現在工程結構如下:
再次編譯。發現httpClient找不到。然後我發現發生這個錯誤的類根本沒有使用過,所以直接將HttpClientFactory.java刪除掉即可。最後Java已經編譯通過,剩下一個NDK的編譯錯誤了。我們直接把jni目錄通過externalNativeBuild引入即可,並且zailocal.properties裡面加入
ndk.dir=/Users/yutao/Library/Android/android-ndk-r10e/
現在的build.gradle長這個樣子:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.android.gallery3d"
minSdkVersion 14
targetSdkVersion 24
renderscriptTargetApi 18
renderscriptSupportModeEnabled true
externalNativeBuild {
ndkBuild {
abiFilters "armeabi-v7a"
}
}
}
externalNativeBuild {
ndkBuild {
path file("src/main/jni/Android.mk")
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile "com.android.support:support-v4:24.2.1"
compile "com.android.support:support-v13:24.2.1"
compile project(':xmp')
compile project(':mp4parser')
}
這個時候咱們的專案就已經能成功執行啦。
意義
整個過程沒有什麼技術含量,只是分享一個方法,希望能幫助到一些有這類需要的同學。
幸運的是native部分並沒有依賴系統裡面的第三方庫,否則還需要引入native的庫,自己寫Android.mk連結。
獻上我已經做好的能直接使用的工程地址:
https://github.com/tbruceyu/GradleAndroidGallery3D