记录下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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值