[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-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.1       dl-ssl.google.com  就可以正常下载安装了,包括后续的更新build-tools、SDK-tools、Platform-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_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将这个类去除了。]

[java] view
plain
copy

  1. package android.view;
  2. import android.content.res.CompatibilityInfo;
  3. /** @hide */
  4. public class CompatibilityInfoHolder {
  5. private volatile CompatibilityInfo mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
  6. public void set(CompatibilityInfo compatInfo) {
  7. if (compatInfo != null && (compatInfo.isScalingRequired()
  8. || !compatInfo.supportsScreen())) {
  9. mCompatInfo = compatInfo;
  10. } else {
  11. mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
  12. }
  13. }
  14. public CompatibilityInfo get() {
  15. return mCompatInfo;
  16. }
  17. public CompatibilityInfo getIfNeeded() {
  18. CompatibilityInfo ci = mCompatInfo;
  19. if (ci == null || ci  == CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO) {
  20. return null;
  21. }
  22. return ci;
  23. }
  24. }

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文件下的文件重名,并在类的构造函数等其他地方更改名字,包名也要改。

[java] view
plain
copy

  1. /*
  2. * Copyright (C) 2011-2012 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *      http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /*
  17. * This file is auto-generated. DO NOT MODIFY!
  18. * The source Renderscript file: packages/apps/Gallery2/src/com/ku/cameragal/filtershow/filters/convolve3x3.rs
  19. */
  20. package com.android.gallery3d.filtershow.filters;
  21. import android.renderscript.*;
  22. import android.content.res.Resources;
  23. /**
  24. * @hide
  25. */
  26. public class MyScriptC_convolve3x3 extends ScriptC {
  27. private static final String __rs_resource_name = "convolve3x3";
  28. // Constructor
  29. public  MyScriptC_convolve3x3(RenderScript rs) {
  30. this(rs,
  31. rs.getApplicationContext().getResources(),
  32. rs.getApplicationContext().getResources().getIdentifier(
  33. __rs_resource_name, "raw",
  34. rs.getApplicationContext().getPackageName()));
  35. }
  36. public  MyScriptC_convolve3x3(RenderScript rs, Resources resources, int id) {
  37. super(rs, resources, id);
  38. __I32 = Element.I32(rs);
  39. __ALLOCATION = Element.ALLOCATION(rs);
  40. __F32 = Element.F32(rs);
  41. __U8_4 = Element.U8_4(rs);
  42. }
  43. private Element __ALLOCATION;
  44. private Element __F32;
  45. private Element __I32;
  46. private Element __U8_4;
  47. private FieldPacker __rs_fp_ALLOCATION;
  48. private FieldPacker __rs_fp_F32;
  49. private FieldPacker __rs_fp_I32;
  50. private final static int mExportVarIdx_gWidth = 0;
  51. private int mExportVar_gWidth;
  52. public synchronized void set_gWidth(int v) {
  53. setVar(mExportVarIdx_gWidth, v);
  54. mExportVar_gWidth = v;
  55. }
  56. public int get_gWidth() {
  57. return mExportVar_gWidth;
  58. }
  59. public Script.FieldID getFieldID_gWidth() {
  60. return createFieldID(mExportVarIdx_gWidth, null);
  61. }
  62. private final static int mExportVarIdx_gHeight = 1;
  63. private int mExportVar_gHeight;
  64. public synchronized void set_gHeight(int v) {
  65. setVar(mExportVarIdx_gHeight, v);
  66. mExportVar_gHeight = v;
  67. }
  68. public int get_gHeight() {
  69. return mExportVar_gHeight;
  70. }
  71. public Script.FieldID getFieldID_gHeight() {
  72. return createFieldID(mExportVarIdx_gHeight, null);
  73. }
  74. private final static int mExportVarIdx_gPixels = 2;
  75. private Allocation mExportVar_gPixels;
  76. public void bind_gPixels(Allocation v) {
  77. mExportVar_gPixels = v;
  78. if (v == null) bindAllocation(null, mExportVarIdx_gPixels);
  79. else bindAllocation(v, mExportVarIdx_gPixels);
  80. }
  81. public Allocation get_gPixels() {
  82. return mExportVar_gPixels;
  83. }
  84. private final static int mExportVarIdx_gIn = 3;
  85. private Allocation mExportVar_gIn;
  86. public synchronized void set_gIn(Allocation v) {
  87. setVar(mExportVarIdx_gIn, v);
  88. mExportVar_gIn = v;
  89. }
  90. public Allocation get_gIn() {
  91. return mExportVar_gIn;
  92. }
  93. public Script.FieldID getFieldID_gIn() {
  94. return createFieldID(mExportVarIdx_gIn, null);
  95. }
  96. private final static int mExportVarIdx_gCoeffs = 4;
  97. private float[] mExportVar_gCoeffs;
  98. public synchronized void set_gCoeffs(float[] v) {
  99. mExportVar_gCoeffs = v;
  100. FieldPacker fp = new FieldPacker(36);
  101. for (int ct1 = 0; ct1 < 9; ct1++) {
  102. fp.addF32(v[ct1]);
  103. }
  104. int []__dimArr = new int[1];
  105. __dimArr[0] = 9;
  106. setVar(mExportVarIdx_gCoeffs, fp, __F32, __dimArr);
  107. }
  108. public float[] get_gCoeffs() {
  109. return mExportVar_gCoeffs;
  110. }
  111. public Script.FieldID getFieldID_gCoeffs() {
  112. return createFieldID(mExportVarIdx_gCoeffs, null);
  113. }
  114. private final static int mExportForEachIdx_root = 0;
  115. public Script.KernelID getKernelID_root() {
  116. return createKernelID(mExportForEachIdx_root, 3, null, null);
  117. }
  118. public void forEach_root(Allocation ain, Allocation aout) {
  119. // check ain
  120. if (!ain.getType().getElement().isCompatible(__U8_4)) {
  121. throw new RSRuntimeException("Type mismatch with U8_4!");
  122. }
  123. // check aout
  124. if (!aout.getType().getElement().isCompatible(__U8_4)) {
  125. throw new RSRuntimeException("Type mismatch with U8_4!");
  126. }
  127. // Verify dimensions
  128. Type tIn = ain.getType();
  129. Type tOut = aout.getType();
  130. if ((tIn.getCount() != tOut.getCount()) ||
  131. (tIn.getX() != tOut.getX()) ||
  132. (tIn.getY() != tOut.getY()) ||
  133. (tIn.getZ() != tOut.getZ()) ||
  134. (tIn.hasFaces() != tOut.hasFaces()) ||
  135. (tIn.hasMipmaps() != tOut.hasMipmaps())) {
  136. throw new RSRuntimeException("Dimension mismatch between input and output parameters!");
  137. }
  138. forEach(mExportForEachIdx_root, ain, aout, null);
  139. }
  140. }

14、      在ImageFilterSharpen.java中,将ScriptC_convolve3x3 mScript改为MyScriptC_convolve3x3
mScript,并在相应地方同步更改类名。

经过上述步骤,Android4.2源码Gallery2、Camera模块成功导入Eclipse,并能正常编译,稍后会将编译出的apk共享出来。

  

[2013.9.8网络首发]导入Android4.2源码里的Gallery2和Camera模块至Eclipse全过程的更多相关文章

  1. 2013年7月份第1周51Aspx源码发布详情

    启睿网络信息服务器实例源码  2013-7-5 [ VS2005 ]功能介绍:睿网络信息服务器,QiRui Net Information Services简称QRNIS,该软件前身系KCIS.当前版 ...

  2. 2013年7月份第4周51Aspx源码发布详情

    大型企业通用管理ERP源码  2013-7-26 [VS2010]2013.7.4更新内容:1.修复决策模式-客户等级不能保存问题.2.修复企业知识库有报错问题.3.修复运营模式-人力资源分析模块-在 ...

  3. [导入]Eclipse 导入/编译 Hadoop 源码

    http://www.cnblogs.com/errorx/p/3779578.html 1.准备工作 jdk: eclipse: Maven: libprotoc :https://develope ...

  4. 【转】如何在Ubuntu11.10(32位)下编译Android4.0源码(图文)

    原文网址:http://blog.csdn.net/flydream0/article/details/7046612 关于如何下载Android4.0的源码请参考我的另一篇文章: http://bl ...

  5. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  6. 利用PHPExcel 实现excel数据的导入导出(源码实现)

    利用PHPExcel 实现excel数据的导入导出(源码实现) 在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现 提前将phpexcel类下 ...

  7. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  8. 2013年8月份第2周51Aspx源码发布详情

    上班族网站(毕设)源码  2013-8-16 [VS2010]源码描述:自己做的毕业设计,上班族网站项目是专门针对上班族群体设计和开发的网站项目.该网站主要涵盖了论坛平台,笑话模块,名言模块,资讯模块 ...

  9. 2013年8月份第1周51Aspx源码发布详情

    校企工作室OA源码  2013-8-9 [VS2010]源码描述:主要模块及系统管理功能说明:一.考勤功能模块:考勤分成三个功能,显示签到功能,查询功能,管理功能.1.签到功能分析:在签到功能中,我们 ...

随机推荐

  1. leetcode 3Sum Closest python

    class Solution(object): def threeSumClosest(self, nums, target): """ :type nums: List ...

  2. js返回值

    看下js变量.作用域.内存文档. 1. <script type="text/javascript"> function c(){ return 23; } var a ...

  3. 写一个jq插件

    本文章摘自博客园的http://www.cnblogs.com/JustinYoung/archive/2010/03/30/jquery-chajian.html,写此文章只是方便自己记载技术 一个 ...

  4. xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应

    xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 <div class="dyleft"> ...

  5. seajs 学习笔记

    seajs的作者是玉伯,具体好处优点等详见官方网址 介绍 1 模块定义define define(function(require,exports,module){ //require 引入需要的模块 ...

  6. 学习zepto.js(原型方法)

    学习zepto.js(原型方法)[1] 转载 新的一周,新的开始,今天来学习一下zepto里边的原型方法,就是通过$.进行调用的方法,也是可以通过$.fn进行扩展的方法: $.camelCase(): ...

  7. JavaEE Tutorials (16) - Java消息服务概念

    16.1JMS API概述198 16.1.1什么是消息传送198 16.1.2什么是JMS API199 16.1.3何时使用JMS API199 16.1.4Java EE平台如何使用JMS AP ...

  8. 桂林电子科技大学出校流量控制器Android版1.0.0

    每次玩游戏的时候,总是要开着电脑挂着出校控制器,真是浪费国家资源啊,,, 突然想起学校有个开放流量的网页,无奈UC等浏览器真是尝试优化js脚本啊,挂在后台,不到几分钟就掉线了,悲剧啊~~~ 还好And ...

  9. 利用UIScrollView和UIPageControl实现多页图片欢迎页面

    在.h文件当中实现UIScrollViewDelegate协议,让控制器充当代理: #import <UIKit/UIKit.h> @interface RPRootViewControl ...

  10. Let the Balloon Rise(map)

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...