您的位置:首页 > 移动开发 > Android开发

记录下Gradle化Android Gallery3D应用的过程

2017-03-03 13:51 239 查看

意义

Android系统里面有很多优秀的应用。Gallery3D就是十分优秀的一个。里面包含了renderscript图像处理,OpenGL特效渲染等一系列的功能。很多同学以为它是在Android源码里面,所以一直敬而远之。但实际上它几乎没有使用什么私有的API,完全可以独立出来用SDK编译成app放到其他版本的手机上面运行。我在一年前研究滤镜的时候做过一个版本的Gallery3D应用,但是一年过去了,Gallery3D代码也改了很多,是时候重新做一个了。这次记录了一下过程。

准备代码

Android的源码下载可以参考 Android源码下载。但是我们并不需要全部下载。
repo init -u https://android.googlesource.com/platform/manifest[/code]之后就能够在本地的.repo目录下看到manifest.xml。打开这个xml文件能够看到Android所有的源码git地址。我们只需要Gallery2这一个的。拼一下链接就是: href="https://android.googlesource.com/platform/packages/apps/Gallery2" target=_blank>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[/code] 
然后我们把里面的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息