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