1. 程式人生 > >記錄下Gradle化Android Gallery3D應用的過程

記錄下Gradle化Android Gallery3D應用的過程

意義

Android系統裡面有很多優秀的應用。Gallery3D就是十分優秀的一個。裡面包含了renderscript影象處理,OpenGL特效渲染等一系列的功能。很多同學以為它是在Android原始碼裡面,所以一直敬而遠之。但實際上它幾乎沒有使用什麼私有的API,完全可以獨立出來用SDK編譯成app放到其他版本的手機上面執行。我在一年前研究濾鏡的時候做過一個版本的Gallery3D應用,但是一年過去了,Gallery3D程式碼也改了很多,是時候重新做一個了。這次記錄了一下過程。

準備程式碼

Android的原始碼下載可以參考 Android原始碼下載。但是我們並不需要全部下載。repo init -u https://android.googlesource.com/platform/manifest

之後就能夠在本地的.repo目錄下看到manifest.xml。開啟這個xml檔案能夠看到Android所有的原始碼git地址。我們只需要Gallery2這一個的。拼一下連結就是:https://android.googlesource.com/platform/packages/apps/Gallery2。git clone之後切一個穩定版本的tag就可以開始我們的Gradle過程了(我這裡使用的android-6.0.1_r68)。

匯入到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