目錄:
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="" 的設計缺陷--------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------