google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展。可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了。之前导4.0的camera那时不费吹灰之力就搞成了。下面的文字记录是我摸索了近十天终于导成功的记录,给大家分享了。
一、开发环境的搭建
1、 点击http://developer.android.com/sdk/index.html下载adt-bundle-windows-x86-20130522(426M)。尽管部分机子上有非adt-bundle搭建的开发环境,但考虑到google已不支持以往android sdk + adt + Eclipse的方式,改推adt-bundle的方式,故杂家以adt-bundle-windows-x86-20130522搭建的开发环境为基础。(注:这里默认JDK已经安装配置好了。)
2、 点击http://developer.android.com/sdk/installing/installing-adt.html 选择在线或离线方式升级ADT版本为22.0.5。上面的adt-bundle自带的ADT版本是22.0.1,不支持解析rs文件,会导致后面的工作功亏一篑,因此一定要升级。如果在线安装ADT失败,考虑将C:\Windows\System32\drivers\etc\hosts文件添加一行:74.125.237.1dl-ssl.google.com 就可以正常下载安装了,包括后续的更新build-tools、SDK-tools、Platform-tools。具体参考前文
更新SDK-tools、Platform-tools、build-tools版本分别为22.0.5、18.0.1、18.0.1,
二、导入前的准备
1、 编译Android4.2的源码,目的是为了得到后面的四个classes文件,如果通过其他途径有这四个文件也可以不编译。4.2的源码编译需要在64位机子上。这四个文件稍后会上传到网上。
2、 将F:\AndroidSource4.2_r1\packages\apps下的Gallery2文件夹和Camera文件夹复制到桌面一份,后续将先导入Gallery2再导入Camera。
3、 在桌面新建一个Camera4.2Need文件夹,将/out/target/commom/obj/JAVA_LIBRARIES/core_intermediates/、/out/target/commom/obj/JAVA_LIBRARIES/framework_intermediates/、/out/target/commom/obj/JAVA_LIBRARIES/mp4parser_intermediates/、/out/target/commom/obj/JAVA_LIBRARIES/ xmp_toolkit_intermediates这四个路径下的classes.jar文件分别重命名为core_intermediates、framework_intermediates、mp4parser_intermediates、xmp_toolkit_intermediates放到Camera4.2Need文件夹,后续这个文件夹可以放到工作空间以免丢失。
三、开始导入
1、 打开eclipse,点击File---New----Project---Android---Android Project from Existing Code,选择桌面的那个Gallery2文件夹,test不要勾选,copy projects到工作空间要勾选。
导入后会报错如下,不用管:
2、 导入后首先检查gen文件夹是否解析了rs文件,正常解析的话会生成ScriptC_convolve3x3.java文件和convolve3x3.d,如果没有生成则说明当前开发环境无法解析rs文件(com.android.gallery3d.filtershow.filters包下的convolve3x3.rs文件),需要重新配置开发环境。
3、 右击工程的属性或按alt+enter快捷键,选中Java Build Path,点击Source,选择Add Folder,将gallerycommon和src_pd勾选上。如果这两个文件夹不勾选,后续会找不到很多类和包,而这些缺失并不是缺少.classes文件导致的。如果提示重复,就按如下步骤进行.
4、 将Android Dependenices文件夹下的那两个空包删除。找到源码Gallery2下的gallerycommon文件夹,需要将这里的文件按对应的包名,添加到gallerycommon文件夹下。新建gallerycommon文件夹,新建包名com.android.gallery3d.common;然后将gallerycommon文件夹下的java文件复制过去。其他的包类似。对源码里的src_pd也做同样的操作。【注:在java build path属性里,source目录下src_pc和gallerycommon这两个文件夹必须勾选,否则新建的包会自动跑到src目录下。】最终得到的结果如下:
[注:这个过程比较灵活,只要最终将两个文件夹下的包导入进去即可,确保包名正确。]
5、 按alt+enter快捷键,选中java build path,点Libraries---Add Library,选择User Library,并将下面的那个选项勾上,表示它的级别很高。New一个Library,名字为Camera4.2Need,将刚准备的四个.jar文件添加进来。
6、 然后点Order and Export,将Camera4.2Need这个库的位置放在Android4.2.2的前面。调整后的顺序如下:
7、 点击res文件夹,点开values文件夹,可以看到里面的filtershow_strings.xml、photoeditor_strings.xml、strings.xml有错误,原因是里面有重复定义。将报错的地方删掉即可!每删掉一个地方,对应的另一个文件报错的地方就会恢复正常。可以按照这种方法对values-xx开头的文件夹都做相同的处理,但事实上,由于我们只要简体中文,所以只保留values-zh-rCN文件夹即可,对此文件夹的报错也作上述处理。其他的values-xx文件夹统统删掉。
8、 在导入camera文件之前需要逐一对照camera下的res文件夹和当前gallery工程下的res文件夹下的文件有无重名。如两者的values文件夹下都有atrrs.xml文件,需要将camera的那一份重命名为atrrs_camera.xml,否则会发生覆盖导致出错。导入时点击Gallery工程,注意一定是导到Gallery工程目录下。右击选择—import---General---File System,其中的.git文件夹及test文件夹、Android.mk、CleanSpec.mk不要选。
9、 点击Clean,重新编译仍然会有错。WidgetTypeChooser.java报错,但实质上并不是这个文件出了问题。这也正是ADT-Bundle安装的eclipse没有自己下载的Eclipse好用的表现之一,当出现大量错误时,前者会乱报错。这时gen文件夹下com.android.gallery3d下的R文件已经生成。整个工程的错误在包com.android.camera.ui下的各个java文件中,这些java文件都导入了com.android.camera.R,但实质上和camera相关的资源ID都被整合到gen文件夹下的com.android.gallery3d.R文件中了。也即本来应该是camera的R文件整合到gallery的R文件中去了,com.android.camera.R这个文件根本没有生成。因此凡是import com.android.camera.R;有这句话的地方一定会报错,奇怪的是eclipse还显示不出来。用import com.android.gallery3d.R;来代替这句话即可。
10、 在修改了com.android.camera.ui包下的各个java文件后,对com.android.camera包下的java文件也要进行修改,凡是引用了R的地方都会报错,但eclipse可能显示不出来。一定要保证com.android.camera.ui包下凡是引用R文件的地方都要导入Gallery3d.R包。
11、 在编译的时候会将错误显示到WidgetTypeChooser.java中,并在下方输出错误为:The project was not built since its build path is incomplete. Cannot find the class file for android.view.CompatibilityInfoHolder. Fix thebuild path then try building this project GalleryUnknownJava Problem。即找不到android.view.CompatibilityInfoHolder,参考http://124.16.139.131:24080/lxr/source/frameworks/base/core/java/android/view/CompatibilityInfoHolder.java?v=android-4.0.4新建包android.view,然后将新建CompatibilityInfoHolder.java。[备注:在有的版本上并没有遇到这个问题,有可能是android4.2将这个类去除了。]
package android.view;
import android.content.res.CompatibilityInfo;
/** @hide */
public class CompatibilityInfoHolder {
private volatile CompatibilityInfo mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
public void set(CompatibilityInfo compatInfo) {
if (compatInfo != null && (compatInfo.isScalingRequired()
|| !compatInfo.supportsScreen())) {
mCompatInfo = compatInfo;
} else {
mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
}
}
public CompatibilityInfo get() {
return mCompatInfo;
}
public CompatibilityInfo getIfNeeded() {
CompatibilityInfo ci = mCompatInfo;
if (ci == null || ci == CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO) {
return null;
}
return ci;
}
}
12、 再次clean编译会报错:某个函数需要的api版本要大于11,当前最低版本为10.需修改AndroidManifest.xml文件,最低api版本为11,目标版本为17,因为我们的手机是4.2对应级别为17。
13、 再次clean编译会报错:在ImageFilterSharpen.java函数里找不到forEach_root()函数。通过对源码编译的输出路径out进行搜索,在/out/target/common/obj/APPS/GALLERY2_intermediates/src/com/android/Gallery3d/filtershow/filters文件夹下找到ScriptC_convolve3x3.java一共可以找到3份同名的文件,只有这个路径下的代码有forEach_root(Allocation, Allocation)接口。将此文件复制出来一份,粘贴到com.android.gallery3d.filtershow.filters下,将名字改为MyScriptC_convolve3x3.java,否则会跟gen文件下的文件重名,并在类的构造函数等其他地方更改名字,包名也要改。
/*
* Copyright (C) 2011-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This file is auto-generated. DO NOT MODIFY!
* The source Renderscript file: packages/apps/Gallery2/src/com/ku/cameragal/filtershow/filters/convolve3x3.rs
*/
package com.android.gallery3d.filtershow.filters;
import android.renderscript.*;
import android.content.res.Resources;
/**
* @hide
*/
public class MyScriptC_convolve3x3 extends ScriptC {
private static final String __rs_resource_name = "convolve3x3";
// Constructor
public MyScriptC_convolve3x3(RenderScript rs) {
this(rs,
rs.getApplicationContext().getResources(),
rs.getApplicationContext().getResources().getIdentifier(
__rs_resource_name, "raw",
rs.getApplicationContext().getPackageName()));
}
public MyScriptC_convolve3x3(RenderScript rs, Resources resources, int id) {
super(rs, resources, id);
__I32 = Element.I32(rs);
__ALLOCATION = Element.ALLOCATION(rs);
__F32 = Element.F32(rs);
__U8_4 = Element.U8_4(rs);
}
private Element __ALLOCATION;
private Element __F32;
private Element __I32;
private Element __U8_4;
private FieldPacker __rs_fp_ALLOCATION;
private FieldPacker __rs_fp_F32;
private FieldPacker __rs_fp_I32;
private final static int mExportVarIdx_gWidth = 0;
private int mExportVar_gWidth;
public synchronized void set_gWidth(int v) {
setVar(mExportVarIdx_gWidth, v);
mExportVar_gWidth = v;
}
public int get_gWidth() {
return mExportVar_gWidth;
}
public Script.FieldID getFieldID_gWidth() {
return createFieldID(mExportVarIdx_gWidth, null);
}
private final static int mExportVarIdx_gHeight = 1;
private int mExportVar_gHeight;
public synchronized void set_gHeight(int v) {
setVar(mExportVarIdx_gHeight, v);
mExportVar_gHeight = v;
}
public int get_gHeight() {
return mExportVar_gHeight;
}
public Script.FieldID getFieldID_gHeight() {
return createFieldID(mExportVarIdx_gHeight, null);
}
private final static int mExportVarIdx_gPixels = 2;
private Allocation mExportVar_gPixels;
public void bind_gPixels(Allocation v) {
mExportVar_gPixels = v;
if (v == null) bindAllocation(null, mExportVarIdx_gPixels);
else bindAllocation(v, mExportVarIdx_gPixels);
}
public Allocation get_gPixels() {
return mExportVar_gPixels;
}
private final static int mExportVarIdx_gIn = 3;
private Allocation mExportVar_gIn;
public synchronized void set_gIn(Allocation v) {
setVar(mExportVarIdx_gIn, v);
mExportVar_gIn = v;
}
public Allocation get_gIn() {
return mExportVar_gIn;
}
public Script.FieldID getFieldID_gIn() {
return createFieldID(mExportVarIdx_gIn, null);
}
private final static int mExportVarIdx_gCoeffs = 4;
private float[] mExportVar_gCoeffs;
public synchronized void set_gCoeffs(float[] v) {
mExportVar_gCoeffs = v;
FieldPacker fp = new FieldPacker(36);
for (int ct1 = 0; ct1 < 9; ct1++) {
fp.addF32(v[ct1]);
}
int []__dimArr = new int[1];
__dimArr[0] = 9;
setVar(mExportVarIdx_gCoeffs, fp, __F32, __dimArr);
}
public float[] get_gCoeffs() {
return mExportVar_gCoeffs;
}
public Script.FieldID getFieldID_gCoeffs() {
return createFieldID(mExportVarIdx_gCoeffs, null);
}
private final static int mExportForEachIdx_root = 0;
public Script.KernelID getKernelID_root() {
return createKernelID(mExportForEachIdx_root, 3, null, null);
}
public void forEach_root(Allocation ain, Allocation aout) {
// check ain
if (!ain.getType().getElement().isCompatible(__U8_4)) {
throw new RSRuntimeException("Type mismatch with U8_4!");
}
// check aout
if (!aout.getType().getElement().isCompatible(__U8_4)) {
throw new RSRuntimeException("Type mismatch with U8_4!");
}
// Verify dimensions
Type tIn = ain.getType();
Type tOut = aout.getType();
if ((tIn.getCount() != tOut.getCount()) ||
(tIn.getX() != tOut.getX()) ||
(tIn.getY() != tOut.getY()) ||
(tIn.getZ() != tOut.getZ()) ||
(tIn.hasFaces() != tOut.hasFaces()) ||
(tIn.hasMipmaps() != tOut.hasMipmaps())) {
throw new RSRuntimeException("Dimension mismatch between input and output parameters!");
}
forEach(mExportForEachIdx_root, ain, aout, null);
}
}
14、 在ImageFilterSharpen.java中,将ScriptC_convolve3x3 mScript改为MyScriptC_convolve3x3 mScript,并在相应地方同步更改类名。
经过上述步骤,Android4.2源码Gallery2、Camera模块成功导入Eclipse,并能正常编译,稍后会将编译出的apk共享出来。
欢迎android爱好者加群248217350 备注:yanzi
---------------------本文系原创,转载请注明作者:yanzi1225627
分享到:
相关推荐
在Android系统中,Gallery2是用于展示图片和视频的原生应用,主要负责提供用户界面以及与媒体库的交互。这个应用在Android 4.2版本中被广泛使用,因此对于开发者来说,深入理解其源码是提升Android UI设计和多媒体...
Android 4.2 API是Android操作系统的一个重要版本,它带来了许多新特性和改进,为开发者提供了更丰富的功能和更好的用户体验。这个API文档是开发者理解和利用Android 4.2功能的关键资源,它包含了详细的API参考、...
2. android.iml:这个文件代表一个IntelliJ IDEA的模块文件,每个模块代表项目中的一个独立部分,比如应用的主模块或库模块。iml文件包含了模块的设置,包括源代码目录、资源目录、依赖项、编译配置等。对于Android...
android.util.Base64类
RAR文件密码恢复软件(RAR.Password.Unlocker.v4.2.0.0.Cracked-MAZE)
android的开发移动端MQTT服务器所需要的依赖包文件。这个是paho的1.1.1版本的,可下载到本地使用。
在本文中,我们将深入探讨如何使用Eclipse这一强大的集成开发环境(IDE)来开发Android源码。Android SDK和Eclipse的结合为开发者提供了高效、便捷的开发体验。首先,我们需要确保拥有正确的开发环境。 **一、Android...
Camera1是早期版本,主要在API Level 9到21之间使用,而Camera2是新版本,自API Level 21引入,提供了更多的控制和更好的性能。根据描述,这个源码可能是基于Camera2 API,因为它通常更稳定,且适用于现代设备。 1....
《Addison.Wesley.Eclipse.Rich.Client.Platform.Designing.Coding.and.Packaging.Java.Application》是一本深入探讨Eclipse Rich Client Platform(RCP)开发的专业书籍,配套源码的提供使得学习过程更具实践性。...
在本篇中,我们将深入探讨Android 4.2的源代码,了解其核心组件、架构以及如何在Eclipse环境中进行源码阅读和分析。 1. **Android架构概述** Android系统基于Linux内核,分为多个层次,包括硬件抽象层(HAL)、库...
SQLite.Interop.dll for sqlite expert professional 4.2 用与SQLite Expert打开本地已加密的数据库的插件。适用32位和64位。 1.直接将下载的文件复制到SQLite Expert安装路径(如:c:\Program Files (x86)\SQLite ...
在本文中,我们将详细探讨如何在Ubuntu 10.04 64位系统上下载和编译Android 4.2的源代码。这个过程主要包括以下几个步骤:源码下载、编译环境安装以及源码的编译。 1. **源码的下载** - 首先,你需要安装`curl`和`...
Android应用通常需要处理UI线程和后台线程的交互,Gallery3D源码中的`util`模块展示了如何有效地进行线程管理,以避免阻塞UI。同时,源码还包含了内存缓存策略,如LRU(最近最少使用)缓存,以减少频繁的内存分配和...
app来源小米应用商店 http://app.mi.com/details?id=com.shenyaocn.android.WebCam 进入这个网页有详细的应用介绍 这个网页 https://blog.csdn.net/xiaoqiang_007_/article/details/106578900 有使用示例
android的开发移动端MQTT服务器所需要的依赖包文件。可下载到本地使用。
将Android 4.4源码与Eclipse关联,意味着开发者可以直接在IDE中浏览、搜索和修改源码,这极大地提高了开发效率和学习过程中的直观性。 要将Android源码关联到Eclipse,你需要完成以下步骤: 1. 下载并安装ADT...
本项目将SystemUI源码导入到Eclipse集成开发环境中,并且经过适配和调整,使得该源码能够在Eclipse环境下正常运行,这对于开发者深入理解Android系统的工作原理以及进行自定义系统UI的开发具有重要意义。 在将...
Eclipse 4.2,包含ADT最新版(2013年6月8号前),对于我这种公司网络限速但csdn除外的人来说,是种福音,分享出来,有需要的同学可以下载。
在使用AndroidStudio导入Android系统源码时,需要的idegen.jar文件。放在out/host/linux-x86/framework/目录下即可。
1. **Camera API**:Android 4.4引入了Camera2 API,它是对旧版Camera API的重大升级,提供了更底层的控制,允许开发者调整更多参数,如曝光、对焦、白平衡等。Camera2 API分为控制层、设备层和流处理层,开发者可以...