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將這個類去除了。]
- 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