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="" 的设计缺陷--------------------------------------------------


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

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

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

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

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

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

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

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







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