意义
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