網絡首發]導入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將這個類去除了。]

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


 

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 plaincopy
  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. /* 
  18.  * This file is auto-generated. DO NOT MODIFY! 
  19.  * The source Renderscript file: packages/apps/Gallery2/src/com/ku/cameragal/filtershow/filters/convolve3x3.rs 
  20.  */  
  21. package com.android.gallery3d.filtershow.filters;  
  22.   
  23. import android.renderscript.*;  
  24. import android.content.res.Resources;  
  25.   
  26. /** 
  27.  * @hide 
  28.  */  
  29. public class MyScriptC_convolve3x3 extends ScriptC {  
  30.     private static final String __rs_resource_name = "convolve3x3";  
  31.     // Constructor  
  32.     public  MyScriptC_convolve3x3(RenderScript rs) {  
  33.         this(rs,  
  34.              rs.getApplicationContext().getResources(),  
  35.              rs.getApplicationContext().getResources().getIdentifier(  
  36.                  __rs_resource_name, "raw",  
  37.                  rs.getApplicationContext().getPackageName()));  
  38.     }  
  39.   
  40.     public  MyScriptC_convolve3x3(RenderScript rs, Resources resources, int id) {  
  41.         super(rs, resources, id);  
  42.         __I32 = Element.I32(rs);  
  43.         __ALLOCATION = Element.ALLOCATION(rs);  
  44.         __F32 = Element.F32(rs);  
  45.         __U8_4 = Element.U8_4(rs);  
  46.     }  
  47.   
  48.     private Element __ALLOCATION;  
  49.     private Element __F32;  
  50.     private Element __I32;  
  51.     private Element __U8_4;  
  52.     private FieldPacker __rs_fp_ALLOCATION;  
  53.     private FieldPacker __rs_fp_F32;  
  54.     private FieldPacker __rs_fp_I32;  
  55.     private final static int mExportVarIdx_gWidth = 0;  
  56.     private int mExportVar_gWidth;  
  57.     public synchronized void set_gWidth(int v) {  
  58.         setVar(mExportVarIdx_gWidth, v);  
  59.         mExportVar_gWidth = v;  
  60.     }  
  61.   
  62.     public int get_gWidth() {  
  63.         return mExportVar_gWidth;  
  64.     }  
  65.   
  66.     public Script.FieldID getFieldID_gWidth() {  
  67.         return createFieldID(mExportVarIdx_gWidth, null);  
  68.     }  
  69.   
  70.     private final static int mExportVarIdx_gHeight = 1;  
  71.     private int mExportVar_gHeight;  
  72.     public synchronized void set_gHeight(int v) {  
  73.         setVar(mExportVarIdx_gHeight, v);  
  74.         mExportVar_gHeight = v;  
  75.     }  
  76.   
  77.     public int get_gHeight() {  
  78.         return mExportVar_gHeight;  
  79.     }  
  80.   
  81.     public Script.FieldID getFieldID_gHeight() {  
  82.         return createFieldID(mExportVarIdx_gHeight, null);  
  83.     }  
  84.   
  85.     private final static int mExportVarIdx_gPixels = 2;  
  86.     private Allocation mExportVar_gPixels;  
  87.     public void bind_gPixels(Allocation v) {  
  88.         mExportVar_gPixels = v;  
  89.         if (v == null) bindAllocation(null, mExportVarIdx_gPixels);  
  90.         else bindAllocation(v, mExportVarIdx_gPixels);  
  91.     }  
  92.   
  93.     public Allocation get_gPixels() {  
  94.         return mExportVar_gPixels;  
  95.     }  
  96.   
  97.     private final static int mExportVarIdx_gIn = 3;  
  98.     private Allocation mExportVar_gIn;  
  99.     public synchronized void set_gIn(Allocation v) {  
  100.         setVar(mExportVarIdx_gIn, v);  
  101.         mExportVar_gIn = v;  
  102.     }  
  103.   
  104.     public Allocation get_gIn() {  
  105.         return mExportVar_gIn;  
  106.     }  
  107.   
  108.     public Script.FieldID getFieldID_gIn() {  
  109.         return createFieldID(mExportVarIdx_gIn, null);  
  110.     }  
  111.   
  112.     private final static int mExportVarIdx_gCoeffs = 4;  
  113.     private float[] mExportVar_gCoeffs;  
  114.     public synchronized void set_gCoeffs(float[] v) {  
  115.         mExportVar_gCoeffs = v;  
  116.         FieldPacker fp = new FieldPacker(36);  
  117.         for (int ct1 = 0; ct1 < 9; ct1++) {  
  118.             fp.addF32(v[ct1]);  
  119.         }  
  120.   
  121.         int []__dimArr = new int[1];  
  122.         __dimArr[0] = 9;  
  123.         setVar(mExportVarIdx_gCoeffs, fp, __F32, __dimArr);  
  124.     }  
  125.   
  126.     public float[] get_gCoeffs() {  
  127.         return mExportVar_gCoeffs;  
  128.     }  
  129.   
  130.     public Script.FieldID getFieldID_gCoeffs() {  
  131.         return createFieldID(mExportVarIdx_gCoeffs, null);  
  132.     }  
  133.   
  134.     private final static int mExportForEachIdx_root = 0;  
  135.     public Script.KernelID getKernelID_root() {  
  136.         return createKernelID(mExportForEachIdx_root, 3nullnull);  
  137.     }  
  138.   
  139.     public void forEach_root(Allocation ain, Allocation aout) {  
  140.         // check ain  
  141.         if (!ain.getType().getElement().isCompatible(__U8_4)) {  
  142.             throw new RSRuntimeException("Type mismatch with U8_4!");  
  143.         }  
  144.         // check aout  
  145.         if (!aout.getType().getElement().isCompatible(__U8_4)) {  
  146.             throw new RSRuntimeException("Type mismatch with U8_4!");  
  147.         }  
  148.         // Verify dimensions  
  149.         Type tIn = ain.getType();  
  150.         Type tOut = aout.getType();  
  151.         if ((tIn.getCount() != tOut.getCount()) ||  
  152.             (tIn.getX() != tOut.getX()) ||  
  153.             (tIn.getY() != tOut.getY()) ||  
  154.             (tIn.getZ() != tOut.getZ()) ||  
  155.             (tIn.hasFaces() != tOut.hasFaces()) ||  
  156.             (tIn.hasMipmaps() != tOut.hasMipmaps())) {  
  157.             throw new RSRuntimeException("Dimension mismatch between input and output parameters!");  
  158.         }  
  159.         forEach(mExportForEachIdx_root, ain, aout, null);  
  160.     }  
  161.   
  162. }  


14、      在ImageFilterSharpen.java中,將ScriptC_convolve3x3 mScript改爲MyScriptC_convolve3x3 mScript,並在相應地方同步更改類名。

經過上述步驟,Android4.2源碼Gallery2Camera模塊成功導入Eclipse,並能正常編譯,稍後會將編譯出的apk共享出來。

歡迎android愛好者加羣248217350     備註:yanzi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章