android4.4簡單摘要

目錄:

1.內置音樂文件至手機

2.更新nv參數

3.android源碼如何客戶定製化

4.主流的手機芯片廠商

5.textview自動滾動顯示

6.adb push、pull的使用

7.android 佈局文件中添加的 android:defaultValue="" 的設計缺陷。

1. ------------------------------------------------- two ways build mp3 files into you phone-------------------------------------------------------------------

方式一:

A:在vendor下添加:

vendor\sprd\sprd_media\internal_media.mk://編譯時會自動將文件拷貝到system/preloadmedia下。
vendor\sprd\sprd_media\media\1.mp3

internal_media.mk中的內容爲:

LOCAL_PATH:= vendor/sprd/sprd_media

PRODUCT_COPY_FILES += \
	$(LOCAL_PATH)/media/1.mp3:system/preloadmedia/xxx.mp3

當然想編譯的時候能執行到該.mk文件,必須將該.mk路徑添加到平臺的全局.mk文件當中,這裏我的全局.make文件路徑爲:

X:\mocor_sc9820\device\sprd\scx35l\sp9820w_6c10\sp9820w_6c10.mk

將include vendor/sprd/sprd_media/internal_media.mk 添加至sp9820w_6c10.mk當中,這樣就能編譯執行到了。


方式二:
1.在X:\mocor_sc9820\zrevo\public-binary\packages.xml文件中添加mp3文件拷貝路徑。

  <package name="a40_ruiou_inlay_ring">
      <file dst="system/preloadmedia/harer.mp3" src="project/a40/media/harer.mp3" />
  </package>

2.編譯系統會找到package name="a40_ruiou_inlay_ring”這個mp3資源路徑, 是在當前project中customer_a40_xx02-ruio.cfg中被調用的

[a40_xx02-ruio-ruio]
CUSTOM_SP=BASE
packages=audio_para
wificonnectivity_cfg
bootsound
bootanimation
a40_ruiou_inlay_ring


3.在該路徑下X:\mocor_sc9820\zrevo\public-binary\project\a40\media添加mp3原文件。


目前還在熟悉爲什麼上述兩種方法拷貝文件,爲什麼還需要修改以下代碼文件:
在frameworks/base/core/java/android/os/FileUtils.java文件中添加:

public class FileUtils {
 ........
    public static boolean copyFolder(File srcFile, File destFile) {
        if (!srcFile.isDirectory()) {
            return false;
        }
        if (!destFile.exists() && !destFile.mkdirs()) {
            return false;
        }
        boolean result = true;
        File[] list = srcFile.listFiles();
        if (list == null) {
            return result;
        }
        for (File f:list) {
            if (f.isDirectory()) {
                result &= copyFolder (f,new File(destFile,f.getName()));
            } else {
                result &= copyFile(f,new File(destFile,f.getName()));
            }
        }
        return result;
    }
 ........
}

在packages/providers/MediaProvider/src/com/android/providers/media/MediaScannerService.java文件中添加:
 public class MediaScannerService extends Service implements Runnable
{
........
    private static String PRELOAD_SRC = "/system/preloadmedia";
    private static String PRELOAD_FLAG = "mediapreloaded";    
.........
private final class ServiceHandler extends Handler
{
        @Override
        public void handleMessage(Message msg)
        {
            Bundle arguments = (Bundle) msg.obj;
            String filePath = arguments.getString("filepath");
            
            try {
                if (filePath != null) {
                    IBinder binder = arguments.getIBinder("listener");
                    IMediaScannerListener listener = 
                            (binder == null ? null : IMediaScannerListener.Stub.asInterface(binder));
                    Uri uri = null;
                    try {
                        uri = scanFile(filePath, arguments.getString("mimetype"));
                    } catch (Exception e) {
                        Log.e(TAG, "Exception scanning file", e);
                    }
                    if (listener != null) {
                        listener.scanCompleted(filePath, uri);
                    }
                } else {
                    String volume = arguments.getString("volume");
                    String[] directories = null;
                    
                    if (MediaProvider.INTERNAL_VOLUME.equals(volume)) {
                        // scan internal media storage
                        directories = new String[] {
                                Environment.getRootDirectory() + "/media",
                        };
                    } else if (MediaProvider.EXTERNAL_VOLUME.equals(volume)) {
                        // scan external storage volumes
                        /* SPRD: we scan external storage separately @{ */
                        //directories = mExternalStoragePaths;
                        if (!getSharedPreferences(PRELOAD_FLAG, Context.MODE_PRIVATE)
                                .getBoolean(PRELOAD_FLAG, false)) {
                            if (doPreloadMedia(PRELOAD_SRC,
                                    Environment.getInternalStoragePath().getPath())) {
                                getSharedPreferences(PRELOAD_FLAG, Context.MODE_PRIVATE).edit()
                                        .putBoolean(PRELOAD_FLAG, true).commit();
                            }
                        }                        
                        String path = arguments.getString("path");
                        if (path != null) {
                            directories = new String[] {arguments.getString("path")};
                        } else {
                            directories = mExternalStoragePaths;
                        }
                        /* @} */
                    }

                    if (directories != null) {
                        if (true) Log.d(TAG, "start scanning volume " + volume + ": "
                                + Arrays.toString(directories));
                        scan(directories, volume);
                        if (true) Log.d(TAG, "done scanning volume " + volume);
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Exception in handleMessage", e);
            }

            //stopSelf(msg.arg1);
        }
    };
    private boolean doPreloadMedia(String src, String dst) {
        if (!android.os.FileUtils.copyFolder(new File(src), new File(dst))) {
            Log.e(TAG, "doPreloadMedia failed");
            return false;
        }
        return true;
    }
}
}

2. ------------------------------------------------------------- updata nv parameters----------------------------------------------------------------------------------

首先清楚一個概念:nv是什麼:

      Nv爲非易失性數據,從字面意思可以理解作用。比如鬧鐘時間,設置好後,關機後,應該依然有效,則保存在Nv中。

      Nv裏面有射頻相關的:包括髮射接收等邏輯控制參數,溫度補償,校準參數等。以及音頻相關參數Nv是必須保存的

      可變數據,寫在flash中。手機IO控制參數、充電耗流等電流控制等等。

其次:android中update了nv_parameter參數,通常會影響到那些功能和性能:

      整機備份升級,開機、駐網、打電話。


最後給單個獨立的分支項目update下nv參數:

在android4.4源碼workspace文件夾下存在默認的nvitem.bin文件

在zrevo/public-binary/nvitem/nvitem.bin下也存在nvitem.bin文件

如果需要給單獨的每個分支或者單獨項目配置獨立的NV_parameter,目前的做法是:

X:\mocor_sc9820\zrevo\a53a_xx02-ruiou\binary\uk\nvitem\下增加nvitem.bin文件就行。

其中路徑中a53a_xx02-ruiou是當前項目分支名稱

其中路徑中UK是當前分支項目中子板級特定的資源指定文件名稱。


3. -------------------------------------------------------------android 源碼客戶定製化----------------------------------------------------------------------------------

拿4.4整套源碼來說吧,一套代碼下可能存在多個不同的客戶項目,意味着多個人在同一套代碼上開發各自的項目,這樣的話,如果沒有控制好代碼

,很大可能出現:時間越長代碼越來越亂,到最後可能就根本無法維護,需要浪費大量的不必要的時間。

那如何有效的對代碼進行有效的管理呢?

1.在解決一個問題的時候首先應該考慮的是:這個問題或者客戶需求是 A:公共的問題  B:單個項目存在的問題。

     公共問題:所有的項目都應該存在或者都有這個新需求,或者說是源碼本身存在問題,針對這種情況,要做好的是添加詳細的配注信息

                     讓別人一看就能懂,不需要添加相關的宏控或者判斷條件。

     單個項目存在的問題:只有這個項目有這個新需求,或者只有這個項目存在問題,那我們就需要把它們與公共的代碼區分開來,做到不影響其他項目

                     同時看情況,這個項目的該問題或者該需求能否存在兼容性,如果其他的項目也遇到這個需求或問題,能否方便的解決,這也是關鍵。

2.如何代碼定製化呢?

     1.overlay:是常用的一種方式,像平常的開關機動畫,鈴聲,牆紙,音頻參數,屬性xml文件,基本上所有的功能都可以overlay。

     2.FeatureOption:宏控的方式,但是宏控也考慮兩種情況:

     A.項目公共宏,REVO_S_PRJ_MODEL=ITA_Z2312,這個宏可以用來控制該項目單獨存在的普通的問題

         級別:項目單獨存在的問題。

     B.單獨創建一個新的 FeatureOption:如果要解決的問題能看作是一個特定的功能,或大多數項目可能都存在的共性問題,

         那可以考慮單獨創建一個 FeatureOption用來獨立出來。

         級別:僅僅低於公共問題(系統問題);

     

4.--------------------------------------------------------------------------------主流的手機芯片廠商-----------------------------------------------------------------------------

1.  Qualcomm (美國高通)

2.  Mtk   (臺灣聯發科)

3.  Samsung exynos(南韓三星獵戶座序列)

4.  Apple(蘋果)

5.  華爲(Hisilicon)

6.  上海展訊


高通主要定位在高端機上面,目前也是市場上用的最多的。Mtk次以高通,主要集中在中國市場上,展訊咱就不說了,低端機沒有疑問,2018年之前至少

很多窮的國家就是使用了這個公司的芯片。


5.---------------------------------------------------------------------------簡單的讓textview過長時自動滾動顯示--------------------------------------------------------------

佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="#ffffff"
              android:gravity="center"
        >

    <TextView android:id="@+id/text1"
              android:layout_width="80dp"
              android:layout_height="40dp"
              android:ellipsize="marquee"
              android:marqueeRepeatLimit="marquee_forever"
              android:focusable="true"
              android:scrollHorizontally="true"
              android:focusableInTouchMode="true"
              android:layout_centerInParent="true"
              android:textColor="#0551A5"
              android:layout_marginLeft="20dp"
              android:layout_marginRight="20dp"
              android:singleLine="true"/>
    <!--android:focusable="true"是否獲取焦點-->
    <!--focusableInTouchMode:通過觸摸獲取焦點-->
    <!--android:ellipsize="marquee"設置爲跑馬燈-->
    <!--android:marqueeRepeatLimit="marquee_forever"滾動次數裏面可以直接寫數字-->
    <!--marquee_forever表示永遠滾動-->
    <!--android:scrollHorizontally="true"水平滾動-->
    <!--android:singleLine="true"單行輸入-->

</LinearLayout>

同時代碼端需要獲取當前textview的id,設置該控件爲

//mEmergency_prompt = (TextView) findViewById(R.id.emergency_prompt);

 //mEmergency_prompt.setSelected(true);

----------------------------------------------------------------adb push /adb pull 的作用-------------------------------------------------------------------

首先明白一個概念:adb 是android debug bridge 意思也就是android調試橋。

通過adb想把電腦上的文件複製到手機系統中,就需要用到adb push 命令。

通過adb想把手機系統中的某個文件複製到電腦上,就需要使用adb pull 命令。

這裏只說一點:要想能正常push文件到手機系統中,需要獲取root權限,指令:adb root,同時需要連接到手機指令:adb remount,

分別給出push 和pull 的使用例子吧:

將電腦本地的framework.jar文件push到system/framework/

adb push "Z:\mocor_sc9820\out\target\product\sp9820w_6c10\system\framework\framework.jar" system/framework/

將手機系統中system/build.prop文件pull到電腦上

adb pull /system/build.prop  c:\Users\Administrator\

注意:push 和 pull 他的/符號 和\符號的使用 剛好相反。

pull的話,我試過,如果要pull成功,需要退出adb shell 狀態 才能pull成功。

--------------------------------------------android 佈局文件中添加的 android:defaultValue="" 的設計缺陷--------------------------------------------------


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------







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