MyException - 我的异常网
当前位置:我的异常网» Android » [2013.9.8网络首发]导入Android4.2源码里的Gallery2

[2013.9.8网络首发]导入Android4.2源码里的Gallery2跟Camera模块至Eclipse全过程

www.MyException.Cn  网友分享于:2013-10-09  浏览:77次
[2013.9.8网络首发]导入Android4.2源码里的Gallery2和Camera模块至Eclipse全过程

       google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展。可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了。之前导4.0的camera那时不费吹灰之力就搞成了。下面的文字记录是我摸索了近十天终于导成功的记录,给大家分享了。

一、开发环境的搭建

1、      点击http://developer.android.com/sdk/index.html下载adt-bundle-windows-x86-20130522426M)。尽管部分机子上有非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.1       dl-ssl.google.com  就可以正常下载安装了,包括后续的更新build-toolsSDK-toolsPlatform-tools。具体参考前文

[android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

更新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_intermediatesframework_intermediatesmp4parser_intermediatesxmp_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,将gallerycommonsrc_pd勾选上。如果这两个文件夹不勾选,后续会找不到很多类和包,而这些缺失并不是缺少.classes文件导致的。如果提示重复,就按如下步骤进行.

4、      将Android Dependenices文件夹下的那两个空包删除。找到源码Gallery2下的gallerycommon文件夹,需要将这里的文件按对应的包名,添加到gallerycommon文件夹下。新建gallerycommon文件夹,新建包名com.android.gallery3d.common;然后将gallerycommon文件夹下的java文件复制过去。其他的包类似。对源码里的src_pd也做同样的操作。【注:在java build path属性里,source目录下src_pcgallerycommon这两个文件夹必须勾选,否则新建的包会自动跑到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.xmlphotoeditor_strings.xmlstrings.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.mkCleanSpec.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文件中了。也即本来应该是cameraR文件整合到galleryR文件中去了,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源码Gallery2Camera模块成功导入Eclipse,并能正常编译,稍后会将编译出的apk共享出来。

欢迎android爱好者加群248217350     备注:yanzi

--------------------- 本文系原创,转载请注明作者:yanzi1225627

 

 

 

 

 

2楼suannai03145小时前
您的文章已被推荐到CSDN首页,感谢您的分享。
1楼suannai03145小时前
您的文章已被推荐到CSDN首页,感谢您的分享。

文章评论

我是如何打败拖延症的
我是如何打败拖延症的
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
旅行,写作,编程
旅行,写作,编程
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
鲜为人知的编程真相
鲜为人知的编程真相
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
一个程序员的时间管理
一个程序员的时间管理
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
总结2014中国互联网十大段子
总结2014中国互联网十大段子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
中美印日四国程序员比较
中美印日四国程序员比较
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员的鄙视链
程序员的鄙视链
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
如何成为一名黑客
如何成为一名黑客
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
10个调试和排错的小建议
10个调试和排错的小建议
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我的丈夫是个程序员
我的丈夫是个程序员
程序员和编码员之间的区别
程序员和编码员之间的区别
编程语言是女人
编程语言是女人
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
为什么程序员都是夜猫子
为什么程序员都是夜猫子
每天工作4小时的程序员
每天工作4小时的程序员
程序员都该阅读的书
程序员都该阅读的书
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有