Android VLC播放器二次開發2——CPU類型檢查+界面初始化

  上一篇講了VLC整個程序的模塊劃分和界面主要使用的技術,今天分析一下VLC程序初始化過程,主要是初始化界面、加載解碼庫的操做。今天主要分析一下org.videolan.vlc.gui.MainActivity類,這個是VLC的整個程序入口。固然,嚴格來講,整個程序入口是VLCApplication類,由於VLC重載了Application,在我分析過的代碼裏面,貌似稍微複雜一點的程序,都喜歡重載Application。我本身寫的一些程序也喜歡重載Application,由於能夠提供一些全局功能和方便多頁面數據交互。
html

  給出上一篇的截圖,方便後面講解程序初始化。 java

(PS:新建的QQ羣,有興趣能夠加入一塊兒討論:Android羣:322599434)android

  

一、VLCApplication類緩存

  這裏簡單說一下VLCApplication,若是你對Application的做用的功能不瞭解,請仔細查閱相關資料,這是一個很重要知識點。VLCApplication作的事情很少,簡單來講,作了兩件事。第一個是一個本地配置的初始化,主要是Locale的配置,並且都是針對中文作特別處理,另外就是當系統內存很少的時候,回收一些bitmap的內存。剩下的就是保存一個全局的靜態對象供其餘類使用。網絡

  本地配置初始化這裏很少說,都是簡單的SharedPreferences讀寫和Locale配置,有興趣本身看看源碼。下面給出系統內存低的時候,回收bitmap緩存。這個平時可能不會太留意。架構

//Edited by mythou
//http://www.cnblogs.com/mythou/
  public void onLowMemory() 
    {
        super.onLowMemory();
        Log.w(TAG, "System is running low on memory");
     //系統內存下降的時候,回收bitmap緩存
        BitmapCache.getInstance().clear();
    }

 

二、CPU類型檢查ide

  這個功能基本上是用第三方庫作解碼器的,都須要作。由於咱們編譯FFMpeg解碼庫和其餘解碼庫的時候,通常都須要指定CPU類型,例如如今的智能手機CPU架構有ARM和Intel的X86還有一些MIPS架構CPU。ARM裏面又區分好幾種類別。因此咱們編譯的時候都須要針對不一樣類型CPU作優化。這也致使了,咱們須要檢查咱們的解碼庫跟機器的CPU類型是否匹配。函數

  之因此把這個能拿出來說,是由於之後作一些跟CPU有關應用的時候,咱們也須要檢查CPU類型。佈局

//Edited by mythou
//http://www.cnblogs.com/mythou/
  public static boolean hasCompatibleCPU(Context context)
    {
        if(errorMsg != null || isCompatible) return isCompatible;
     //讀取VLC解碼庫,這一部分裏面還有不少處理,下面會講解
        ElfData elf = readLib(context.getApplicationInfo().dataDir + "/lib/libvlcjni.so");
        if(elf == null) 
        {
            Log.e(TAG, "WARNING: Unable to read libvlcjni.so; cannot check device ABI!");
            Log.e(TAG, "WARNING: Cannot guarantee correct ABI for this build (may crash)!");
            return true;
        }
     //記錄CPU的類型,注意android2.2之後,會有兩個CPU類型
        String CPU_ABI = android.os.Build.CPU_ABI;
        String CPU_ABI2 = "none";
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { // CPU_ABI2 since 2.2
            try {
                CPU_ABI2 = (String)android.os.Build.class.getDeclaredField("CPU_ABI2").get(null);
            } catch (Exception e) { }
        }
     //各類CPU參數記錄,對這些不瞭解,能夠百度一下。
        boolean hasNeon = false, hasFpu = false, hasArmV6 = false,
                hasArmV7 = false, hasMips = false, hasX86 = false;
        float bogoMIPS = -1;
        int processors = 0;
     //判斷CPU的架構 if(CPU_ABI.equals("x86")) 
        {
            hasX86 = true;
        } 
        else if(CPU_ABI.equals("armeabi-v7a") ||
                  CPU_ABI2.equals("armeabi-v7a")) 
        {
            hasArmV7 = true;
            hasArmV6 = true; /* Armv7 is backwards compatible to < v6 */
        } 
        else if(CPU_ABI.equals("armeabi") ||
                  CPU_ABI2.equals("armeabi"))
        {
            hasArmV6 = true;
        }
      
     //......下面還有一些CPU參數識別,這裏就省略了
     //把CPU參數保存起來 machineSpecs = new MachineSpecs(); machineSpecs.hasArmV6 = hasArmV6; machineSpecs.hasArmV7 = hasArmV7; machineSpecs.hasFpu = hasFpu; machineSpecs.hasMips = hasMips; machineSpecs.hasNeon = hasNeon; machineSpecs.hasX86 = hasX86; machineSpecs.bogoMIPS = bogoMIPS; machineSpecs.processors = processors; return true; }

   上面的CPU參數屬性裏面說到了好幾種參數,若是你對ARM不瞭解,建議百度查一下。這裏簡單講解一下ABI,CPU_ABI是咱們常常都會遇見的,例如咱們在Android工程裏面的libs庫下面就有armeabi-v7a類型的庫。這裏的ABI是指Application Binary Interface。post

  ABI描述了應用程序和操做系統之間,一個應用和它的庫之間,或者應用的組成部分之間的低層接口。ABI不一樣於應用程序接口(API),API定義了源代碼和庫之間的接口,所以一樣的代碼能夠在支持這個API的任何系統中編譯,然而ABI容許編譯好的目標代碼在使用兼容ABI的系統中無需改動就能運行。

  ABI掩蓋了各類細節,例如:調用約定(控制着函數的參數如何傳送以及如何接受返回值);系統調用的編碼和一個應用如何向操做系統進行系統調用;以及在一個完整的操做系統ABI中,對象文件的二進制格式、程序庫等等。一個完整的ABI,像Intel二進制兼容標準 (iBCS) ,容許支持它的操做系統上的程序不經修改在其餘支持此ABI的操做體統上運行。其餘的 ABI 標準化細節包括 C++ name decoration 和同一個平臺上的編譯器之間的調用約定,可是不包括跨平臺的兼容性。

  簡單的說,ABI規範了應用程序對寄存器的使用方法,Call procedure,以及如何進入trap。符合某一平臺ABI規範的應用程序就能夠在這一平臺上運行。這一規範是針對binary,而不是source的。因此一樣的高級語言代碼,使用不一樣的toolchain,能夠獲得符合不一樣ABI規範的binary。

  至於其餘參數,若是有不清楚,請百度一下,其餘參數比較好理解,這裏很少說。

 

三、VLCLib解碼庫初始化

//Edited by mythou
//http://www.cnblogs.com/mythou/
  static {
        try {
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
                System.loadLibrary("iomx-gingerbread");  //第一個解碼庫 else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR2)
                System.loadLibrary("iomx-hc");  //第二個解碼庫 else
                System.loadLibrary("iomx-ics");  //第三個解碼庫
        } catch (Throwable t) {
            Log.w(TAG, "Unable to load the iomx library: " + t);
        }
        try {
            System.loadLibrary("vlcjni");  //第四個解碼庫
        } catch (UnsatisfiedLinkError ule) {
            Log.e(TAG, "Can't load vlcjni library: " + ule);
            /// FIXME Alert user
            System.exit(1);
        } catch (SecurityException se) {
            Log.e(TAG, "Encountered a security issue when loading vlcjni library: " + se);
            /// FIXME Alert user
            System.exit(1);
        }
    }

  解碼庫初始化沒有什麼特別,這裏主要是想講講VLC用到的解碼庫總共有4個,都是在LibVLC.java類裏面的靜態代碼塊加載。至於每一個解碼庫具體做用,尚未仔細分析,後面分析清楚再說。

 

四、界面初始化

 
 
//Edited by mythou
//http://www.cnblogs.com/mythou/
    //設置主界面畫面
        View v_main = LayoutInflater.from(this).inflate(R.layout.main, null);
        mMenu.setContent(v_main);
        //SlidingMenu的view視圖
        View sidebar = LayoutInflater.from(this).inflate(R.layout.sidebar, null);
        final ListView listView = (ListView)sidebar.findViewById(android.R.id.list);
        listView.setFooterDividersEnabled(true);
        mSidebarAdapter = new SidebarAdapter();
        listView.setAdapter(mSidebarAdapter);
        mMenu.setMenu(sidebar);
        //底下的信息條
        mInfoLayout = v_main.findViewById(R.id.info_layout);
        mInfoProgress = (ProgressBar) v_main.findViewById(R.id.info_progress);
        mInfoText = (TextView) v_main.findViewById(R.id.info_text);
        //ActionBar初始化
        prepareActionBar();

  界面初始化工做主要分爲下面幾個部分,能夠對照我上面給出的效果圖來分析。

  • 設置主Activity的Layout配置
  • SlidingMenu初始化
  • 底下信息條初始化
  • Actionbar初始化

  SlidingMenu的使用,我在另外一篇(Android 開發本身的網絡收音機2——電臺列表(SlidingMenu側滑欄))裏面有詳細使用介紹,這裏很少說。Activity設置View這個也沒什麼好說。底下信息條,主要就是一個進度條,主要是搜索文件和生成視頻縮略圖的時候,給用戶提示。本質上是ProgressBar和TextView的組合。最後Actionbar是使用了一個開源項目——ActionBarSherlock,在4.0的系統裏面使用這個開源項目,會直接使用系統的ActionBar,因此跟咱們使用系統的Actionbar差異不大,後面咱們專門寫一篇文章說明如何修改Actionbar。

 

五、主Activity佈局

//Edited by mythou
//http://www.cnblogs.com/mythou/
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
   <!-- 這裏的FrameLayout負責顯示切換的Fragment,是整個程序界面的主要顯示模塊-->
    <FrameLayout 
        android:id="@+id/fragment_placeholder"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="0dip" />
  
  <!-- 下面縮略圖生成進度-->  
    <RelativeLayout
        android:id="@+id/info_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone">
        <ProgressBar
            android:id="@+id/info_progress"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:progressDrawable="@drawable/progress"/>
        <TextView
            android:id="@+id/info_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dip"
            android:layout_marginRight="5dip"
            android:singleLine="true"
            android:textColor="#FFFFFFFF"
            android:shadowColor="#CC000000"
            android:shadowRadius="1.5"
            android:shadowDx="1"
            android:shadowDy="1"/>
    </RelativeLayout>
  
   <!-- 音樂後臺播放的小的控制檯-->
    <FrameLayout
        android:id="@+id/audio_mini_player"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"/>
</LinearLayout>

  最後說說主Activity的佈局,這個主Activity佈局很簡單,上一篇文章我也說過,VLC裏面大部分界面都是用Fragment做爲顯示模塊,因此使用的Activity並很少,這裏負責切換Fragment顯示的Layout是一個FrameLayout,在切換不一樣的Fragment的時候,都是依靠這個Layout來顯示。

  另外就是一個由ProgressBar和TextView組成的信息條,顯示縮略圖生成的進度。以及下面一個小控件顯示,主要是當音樂後臺播放的時候,切換到非音樂播放界面,會在底下顯示一個音樂播放的控制檯。也是使用一個FrameLayout實現。

 

系列文章

Linux 下編譯Android-VLC開源播放器詳解(附源碼下載)

Android VLC播放器二次開發1——程序結構分析

 

Edited by mythou

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3236071.html 

相關文章
相關標籤/搜索