1:修改開機logo
修改開機logo有兩種方法,一種直接去改c語言代碼,第二種替換圖片用python生成splash。第一種方法我沒試過,感覺挺麻煩的,還有分辨率限制,超過多少分辨率就不能用第一種方法。
- 修改的文件路徑LINUX/android/bootable/bootloader/lk/splash
- 準備好logo圖片(png、bmp格式)
- 查看中原圖片的分辨率,修改logo圖片 保證 分辨率 一致
- 生成splash.img鏡像文件
注:圖片分辨率很重要!很重要!很重要!
生成splash.img 步驟
The steps to generate a splash.img:
1 sudo apt-get install python-imaging
2 python ./logo_gen.py boot_001.png (*.bmp)
爲了減少編譯時間可以直接將生成好的splash.img將刷機包中的文件替換掉。
2:Framework(SysteimUI) Android在狀態欄增加耳機拔插圖標
Android 4.1在拔插耳機時,狀態欄沒有提示圖標。最近做了這個新的需求,步驟如下:
1、在\frameworks\base\packages\SystemUI\res\drawable-Xdpi下增加一個耳機圖片stat_sys_headset.png。drawable-Xdpi中的X根據手機的分辨率來確定,我的手機用的是drawable-hdpi;
2、在\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarPolicy.java中增加下面的代碼:
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
updateAlarm(intent);
}
else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
updateSyncState(intent);
}
else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
updateBluetooth(intent);
}
/*add code for adding headset icon in statusbar.*/
else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
updateHeadsetState(intent);
}
//end
else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
updateVolume();
}
else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
updateSimState(intent);
}
else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
updateTTY(intent);
} else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) {
// when acceptting the locale change event,reload USB connection notification.
boolean isUsbConnected = mStorageManager.isUsbMassStorageConnected();
mStorageNotification.onUsbMassStorageConnectionChanged(isUsbConnected);
}
}
};
public PhoneStatusBarPolicy(Context context) {
mContext = context;
// init StorageNotification object
mStorageNotification = new StorageNotification(mContext);
mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
// listen for broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_ALARM_CHANGED);
filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
/*add code for adding headset icon in statusbar.*/
filter.addAction(Intent.ACTION_HEADSET_PLUG);
//end
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
// add locale change event filter
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
int numPhones = MSimTelephonyManager.getDefault().getPhoneCount();
mSimState = new IccCard.State[numPhones];
for (int i=0; i < numPhones; i++) {
mSimState[i] = IccCard.State.READY;
}
// storage
mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
mStorageManager.registerListener(mStorageNotification);
// TTY status
mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0, null);
mService.setIconVisibility("tty", false);
// Cdma Roaming Indicator, ERI
mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_0, 0, null);
mService.setIconVisibility("cdma_eri", false);
// bluetooth status
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
int bluetoothIcon = R.drawable.stat_sys_data_bluetooth;
if (adapter != null) {
mBluetoothEnabled = (adapter.getState() == BluetoothAdapter.STATE_ON);
if (adapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {
bluetoothIcon = R.drawable.stat_sys_data_bluetooth_connected;
}
}
mService.setIcon("bluetooth", bluetoothIcon, 0, null);
mService.setIconVisibility("bluetooth", mBluetoothEnabled);
/*add code for adding headset icon in statusbar.*/
mService.setIcon("headset", R.drawable.stat_sys_headset, 0, null);
mService.setIconVisibility("headset", false);
//end
// Alarm clock
mService.setIcon("alarm_clock", R.drawable.stat_sys_alarm, 0, null);
mService.setIconVisibility("alarm_clock", false);
// Sync state
mService.setIcon("sync_active", R.drawable.stat_sys_sync, 0, null);
mService.setIcon("sync_failing", R.drawable.stat_sys_sync_error, 0, null);
mService.setIconVisibility("sync_active", false);
mService.setIconVisibility("sync_failing", false);
// volume
mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0, null);
mService.setIconVisibility("volume", false);
updateVolume();
}
/*add code for adding headset icon in statusbar.*/
private final void updateHeadsetState(Intent intent) {
boolean mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1);
Slog.v(TAG, "updateHeadsetState: HeadsetState: " + mIsHeadsetOn);
mService.setIconVisibility("headset", mIsHeadsetOn);
}
在\frameworks\base\core\res\res\values\config.xml中加入耳機圖標控制字段(headset):
<string-array name="config_statusBarIcons">
<item><xliff:g id="id">ime</xliff:g></item>
<item><xliff:g id="id">sync_failing</xliff:g></item>
<item><xliff:g id="id">sync_active</xliff:g></item>
<item><xliff:g id="id">gps</xliff:g></item>
<item><xliff:g id="id">bluetooth</xliff:g></item>
<item><xliff:g id="id">nfc</xliff:g></item>
<item><xliff:g id="id">tty</xliff:g></item>
<item><xliff:g id="id">speakerphone</xliff:g></item>
<item><xliff:g id="id">mute</xliff:g></item>
<item><xliff:g id="id">volume</xliff:g></item>
<item><xliff:g id="id">wifi</xliff:g></item>
<item><xliff:g id="id">cdma_eri</xliff:g></item>
<item><xliff:g id="id">phone_signal_second_sub</xliff:g></item>
<item><xliff:g id="id">data_connection</xliff:g></item>
<item><xliff:g id="id">phone_evdo_signal</xliff:g></item>
<item><xliff:g id="id">phone_signal</xliff:g></item>
<item><xliff:g id="id">battery</xliff:g></item>
<item><xliff:g id="id">alarm_clock</xliff:g></item>
<item><xliff:g id="id">secure</xliff:g></item>
<item><xliff:g id="id">clock</xliff:g></item>
<item><xliff:g id="id">headset</xliff:g></item>
</string-array>
因爲所加代碼中的 mService.setIcon和mService.setIconVisibility最終會調用到StatusBarManagerService,它的構造函數有mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons));語句,找到config_statusBarIcons所在的配置文件爲config.xml。如果沒加,會再seticon(StatusBarManagerService類裏)函數裏
3:Android--隱藏狀態欄圖標
目前狀態欄圖標有通知圖標和系統圖標
通知圖標主要是指各應用發過來的通知,比如未接電話,截圖,後臺播放音樂等,系統圖標主要有藍牙,耳機,wifi,數據流量,時間和電池...
1,不顯示通知圖標,
在/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java中
public void updateNotificationIcons {
for (int i = 0; i < N; i++) {
NotificationData.Entry ent = activeNotifications.get(i);
+ final String pkg = ent.notification.getPackageName();
+ android.util.Log.d("StatusBarIconController","pkg========"+pkg);
//比如如果包名不是收音機的,就不顯示圖標
+ if (!pkg.contains("com.android.fmradio")) {
+ continue;
}
if (notificationData.isAmbient(ent.key)
&& !NotificationData.showNotificationEvenIfUnprovisioned(ent.notification)) {
continue;
}
}
2.不顯示系統圖標,系統圖標的顯示是在以下文件,比如藍牙,wifi,耳機等
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/
PhoneStatusBarPolicy.java
將不要顯示圖標,將setIconVisibility()改爲false即可,比如,如果不要鬧鐘圖標
private void updateAlarm() {
....
- - - mService.setIconVisibility(SLOT_ALARM_CLOCK, mCurrentUserSetup && hasAlarm);
+++ mService.setIconVisibility(SLOT_ALARM_CLOCK, false);
}
3,系統圖標中比較特殊的時間和電池在
/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingStart="7dp"
android:gravity="center_vertical|start"
+++ android:visibility="gone" //時間
/>
/frameworks/base/packages/SystemUI/res/layout/system_icons.xml
<com.android.systemui.BatteryMeterView android:id="@+id/battery"
android:layout_height="14.5dp"
android:layout_width="9.5dp"
+++ android:visibility="gone" 電池
android:layout_marginBottom="@dimen/battery_margin_bottom"/>
4:android 5.1 usb調試默認關閉設置方法
packages/apps/Provision/src/com/android/provision/DefaultActivity.java
在該文件中加入下面的代碼:
if (!android.os.SystemProperties.getBoolean("ro.inet.adb_enabled",true)) {
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0);
}
同時在system.prop中添加:
ro.inet.adb_enabled=false
5:【Audio】【音量曲線】【響度】如何修改音量曲線?
對應場景可能是: 當把媒體音量調到最小一級時,喇叭/耳機音量仍然很大,如何解決? |
如圖1所示:
1. 音量曲線是通過四個點繪製而成,點(x,y)座標中,x取值範圍是0->100以內的整數,y是-100->0以內的有一位小數的任意數值,並且隨着x數值的增大,y也增大,也就是說該曲線是遞增曲線。
2. y數值與具體增益值線性相關。但其實真正增益amplification與y數值具體對應關係如下代碼所描述:
安卓7/8/9配置修改位置爲:
frameworks/av/services/audiopolicy/config/ default_volume_tables.xml
如喇叭音量曲線可以修改以下代碼段:
<!-- Default is Speaker Media Volume Curve -->
<point>1,-3000</point>
<point>33,-2200</point>
<point>66,-1200</point>
<point>100,0</point>
</reference>
如圖1所示:
1. 音量曲線是通過四個點繪製而成,點(x,y)座標中,x取值範圍是0->100以內的整數,y是-100->0以內的有一位小數的任意數值,並且隨着x數值的增大,y也增大,也就是說該曲線是遞增曲線。
2. y數值與具體增益值線性相關。但其實真正增益amplification與y數值具體對應關係如下代碼所描述:
安卓7/8/9配置修改位置爲:
frameworks/av/services/audiopolicy/config/ default_volume_tables.xml
如喇叭音量曲線可以修改以下代碼段:
<!-- Default is Speaker Media Volume Curve -->
<point>1,-3000</point>
<point>33,-2200</point>
<point>66,-1200</point>
<point>100,0</point>
</reference>
6:【audio】【底噪】【功放延遲關閉問題】如何解決在關閉喇叭後喇叭還是有幾秒底噪問題?
按鍵音或音樂暫停後有3S底噪,怎麼辦?2017.05.06
這個是平臺端參數設定,可修改參數3s延遲問題可參考舊版本修改方法。如果找不到,可諮詢MTK平臺修改。
修改代碼路徑爲: Framworks/av/services/audioflinger/AudioFlinger.h,把AudioFlinger.h文件裏面的
static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(0)//3
默認是3,需將3改成0s。
7:【audio】【usb】【UAC】如何在高通平臺關閉usb audio驅動功能?
使用usb camera的時候由於誤選經常會選擇到UAC Camera導致系統默認聲卡的功能異常,如無法錄音播放語音等,可以通過以下方式關閉usb audio驅動功能。
diff --git a/kernel/msm-3.18/sound/Makefile b/kernel/msm-3.18/sound/Makefile
index ce9132b..2c8b762 100644
--- a/kernel/msm-3.18/sound/Makefile
+++ b/kernel/msm-3.18/sound/Makefile
@@ -5,7 +5,7 @@ obj-$(CONFIG_SOUND) += soundcore.o
obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
obj-$(CONFIG_SOUND_PRIME) += oss/
obj-$(CONFIG_DMASOUND) += oss/
-obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
+obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ \
firewire/ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ atmel/
obj-$(CONFIG_SND_AOA) += aoa/
8:【Modem】【GPS】GPS定位基礎術語介紹
1、GPS冷啓動:(1)初次使用;(2)電池耗盡導致星曆信息丟失;(3)關機狀態下將接收機移動1000公里以上距離。
2、GPS溫啓動:距離上次定位的時間超過兩個小時的啓動。
3、GPS熱啓動:距離上次定位的時間小於兩個小時的啓動。
4、AGPS:輔助GPS定位,一般基站輔助,可大大縮短冷啓動時間,由於 google supl server在國內不能用,需要客戶使用第三方廠商的位置服務器,比如國內千尋公司。由於AGPS主要以GPS定位爲主,並不能改善室內定位的效果。
5、NLP:網絡定位,直接使用第三方SDK獲取現成定位數據,開發者可直接下載百度或高德的SDK進行開發,方法簡單。
9:android:關掉系統的 安全模式
當 Android 設備在安全模式(Safe Mode)下工作時,任何的第三方應用程序或相關文件(主要爲apk應用程序文件)都不可以使用,但可以使用 Android 設備的任務管理器選項進行卸載或管理應用程序,即Android 設備的操作系統或軟件或相關文件出現問題導致系統進不了正常界面或不能正常啓動系統時,則可以將設備進入安全模式(Safe Mode)卸載或管理原系統以外安裝的應用程序或驅動文件或其他第三方相關文件,當在安全模式(Safe Mode)下完全卸載或管理了相關第三方安裝的應用程序仍然不可以解決問題後,再進行安裝或升級或更新操作系統或其他方法來解決問題。進入安全模式時,主界面的左下方顯示“安全模式”或“Safe Mode”提示。安全模式進入方法:機器啓動後,在開機動畫前, 按住 Menu 或 音量減鍵至開機完成,就可以進入安全模式。安全模式退出方法:若需要退出安全模式,當且Android 設備在沒有進行過特別使用或使用不當時(設備未使用非原裝充電器充電,設備未拆過機等),將設備關機,然後重新開機,即可以退出安全模式,正常進入系統.系統檢測是否進入安全模式的調用實現列出:frameworks/base/services/java/com/android/server/SystemServer.java frameworks/base/services/java/com/android/server/wm/WindowManagerService.javaframeworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -7532,7 +7532,7 @@ public class WindowManagerService extends IWindowManager.Stub
Log.i(TAG, "SAFE MODE not enabled");
}
mPolicy.setSafeMode(mSafeMode);
- return mSafeMode;
+ return false;
}
public void displayReady() {
10:google全家桶套餐下載地址
11:【Android】在SElinux下 如何獲得對一個內核節點的訪問權限
Android 5.0下,因爲採取了SEAndroid/SElinux的安全機制,即使擁有root權限,或者對某內核節點設置爲777的權限,仍然無法在JNI層訪問。
本文將以用戶自定義的內核節點/dev/wf_bt爲例,手把手教會讀者如何在JNI層獲得對該節點的訪問權限。
第一步:找到需要訪問該內核節點的進程(process),筆者自己這個節點由system_server進程來訪問
第二步:打開文件AndroidL/android/external/sepolicy/file_contexts.be 仿照這個文件裏的寫法,爲你的節點定義一個你想要的名字:
在CODE上查看代碼片派生到我的代碼片
/dev/tegra.* u:object_r:video_device:s0
/dev/tf_driver u:object_r:tee_device:s0
/dev/tty u:object_r:owntty_device:s0
/dev/tty[0-9]* u:object_r:tty_device:s0
# We add here
/dev/wf_bt u:object_r:wf_bt_device:s0
wf_bt_device是自定義,其他左右兩邊的內容都和上面的範例一致。
第三步:打開文件AndroidL/android/external/sepolicy/device.te 仿照這個文件裏的寫法,將剛剛第二步寫的wf_bt_device聲明爲dev_type:
在CODE上查看代碼片派生到我的代碼片
# Device types
type device, dev_type, fs_type;
type alarm_device, dev_type, mlstrustedobject;
type adb_device, dev_type;
type ashmem_device, dev_type, mlstrustedobject;
type audio_device, dev_type;
type binder_device, dev_type, mlstrustedobject;
type block_device, dev_type;
# We add here
type wf_bt_device, dev_type;
第四步: AndroidL/android/external/sepolicy/目錄下很多.te文件都是以進程名來結尾的,比如有針對surfaceflinger進程的surfaceflinger,有針對vold進程的vold.te, 剛剛從第一步得到,這個節點是由system_server進程來訪問,所以,我們找到system_server.te打開,加入允許這個進程對/dev/wf_bt的讀寫權限,
在CODE上查看代碼片派生到我的代碼片
# Read/Write to /proc/net/xt_qtaguid/ctrl and and /dev/xt_qtaguid.
allow system_server qtaguid_proc:file rw_file_perms;
allow system_server qtaguid_device:chr_file rw_file_perms;
# chr_file表示字符設備文件,如果是普通文件用file,目錄請用dir
# rw_file_perms代表讀寫權限
allow system_server wf_bt_device:chr_file rw_file_perms;
這句話的意思是:允許system_server進程擁有對wf_bt_device的這個字符設備的讀寫權限。 改了這些之後,你就可以make installclean;make -j16編譯image來驗證權限是否獲取成功。
fd =open("/dev/wf_bt",O_RDONLY | O_NOCTTY); 就可以成功訪問了。
在framework寫一個文件,比如:cache/hideapp.txt 但是在launcher2裏是不能訪問的,會報一個FileNotFoundException的異常。 這也是沒權限訪問的原因。 因此接下來就添加權限 在AndroidL/android/external/sepolicy/目錄下, 首先在file_contexts裏添加
/cache/hideapp.txt u:object_r:meig_pub_file:s0
然後再在file.te裏添加
type meig_pub_file, file_type;
12:如何區分歐標和美標耳機
1. 使用錯誤標準的耳機導致異常
當使用錯誤標準耳機時,會遇到以下情況:
1.音頻被抑制,左右聲道的聲音丟失、雜音、沒有立體感
2.麥克風不能正常工作
3.耳機的掛斷、接聽按鍵不能正常工作。
2. Pin腳順序
目前國際上通用的四孔手機耳機接口標準有兩個,一個是OMTP的標準,一個是CTIA的標準。
CTIA(美標)的3.5mm接口:插針接法是左聲道-右聲道-地線-麥克風。
OMTP(歐標)的3.5mm接口:插針接法是左聲道-右聲道-麥克風-地線。
其中歐標耳機插針如上圖所示。
3. 測試方法
如何使用萬用表檢測耳機標準
從右到左,暫定爲1、2、3、4腳。
如何運用萬用表區分耳機是美標還是歐標?
原理其實就是測量左聲道對地電阻
將萬用表調節到阻抗測量功能,量程選在100歐姆,
當測量上圖中的1和3腳時,阻抗在32歐姆左右,則爲美標耳機。
當測量上圖中的1和4腳時,阻抗在32歐姆左右,則爲歐標耳機。
13: 高通耳機增益簡單調試方案
1. 對應代碼文件位置
platform filepath
msm8917 hardware/qcom/audio/configs/msm8937/mixer_paths_qrd_sku2.xml
msm8937 hardware/qcom/audio/configs/msm8937/mixer_paths_qrd_sku2.xml
msm8953 hardware/qcom/audio/configs/msm8953/mixer_paths_qrd_sku3.xml
msm8909 device/qcom/msm8909/mixer_paths_skua.xml
2. 音頻路徑配置以及調試參數確認
1) 默認情況下,耳機的音頻路徑是以CDC_HPH_R和CDC_HPH_L同時作爲音源
<path name="headphones">
<ctl name="MI2S_RX Channels" value="Two" />
<ctl name="RX1 MIX1 INP1" value="RX1" />
<ctl name="RX2 MIX1 INP1" value="RX2" />
<ctl name="RDAC2 MUX" value="RX2" />
<ctl name="HPHL" value="Switch" />
<ctl name="HPHR" value="Switch" />
<ctl name="RX1 Digital Volume" value="84" />
</path>
調試參數爲:"RX1 Digital Volume"和"RX2 Digital Volume"
2) 如果耳機的音頻路徑只以CDC_HPH_R作爲音源
<path name="headphones">
<ctl name="MI2S_RX Channels" value="One" />
<ctl name="RX2 MIX1 INP1" value="RX1" />
<ctl name="RDAC2 MUX" value="RX2" />
<ctl name="HPHR" value="Switch" />
<ctl name="Ext Spk Switch" value="On" />
</path>
調試參數爲:"RX2 Digital Volume"
3) 如果耳機的音頻路徑只以CDC_HPH_L作爲音源
<path name="headphones">
<ctl name="MI2S_RX Channels" value="One" />
<ctl name="RX1 MIX1 INP1" value="RX1" />
<ctl name="HPHL" value="Switch" />
<ctl name="Ext Spk Switch" value="On" />
</path>
調試參數爲:"RX1 Digital Volume"
3. 調試參數介紹
注意:RXn Digital Volume
對應的n取值範圍是1、2和3。
對應的XX取值範圍爲0-124,"0" means -84dB, "84" means0dB, and "124" means +40dB。
4. 驗證RXn Digital Volume對應的XX最合適取值,可以在播放音樂時,在adb窗口通過下列命令實時調整:
adb root
adb shell
tinymix "RXn Digital Volume" "84"
tinymix "RXn Digital Volume" "99"
tinymix "RXn Digital Volume" "XX"
注意:如果耳機走的是默認音頻路徑,請同步執行命令對"RX1 Digital Volume"和"RX2 Digital Volume"進行配置,如下所示:
tinymix "RX1 Digital Volume" "99"
tinymix "RX2 Digital Volume" "99"
5. 修改方法(以msm8917平臺爲例)
(1)導入配置,重啓生效
adb root
adb remount
adb push mixer_paths_qrd_sku2.xml /etc/mixer_paths_qrd_sku2.xml
adb reboot
(2)同步修改hardware/qcom/audio/configs/msm8937/mixer_paths_qrd_sku2.xml,編譯system.img,重新下載生效
14:高通工具acdb音頻配置文件使用方案
方法1.push到機器特定路徑下,重啓機器驗證
adb root
adb remount
msm8909: adb push QRD_Speaker_cal.acdb /etc/acdbdata/QRD/
msm8916: adb push QRD_Speaker_cal.acdb /etc/acdbdata/QRD/
msm8917: adb push QRD_Speaker_cal.acdb /etc/acdbdata/QRD/
msm8937: adb push QRD_SKU2_Speaker_cal.acdb /etc/acdbdata/QRD/
msm8939: adb push QRD_SKUL_Speaker_cal.acdb /etc/acdbdata/QRD/
msm8953: adb push QRD_Speaker_cal.acdb /etc/acdbdata/QRD/
adb shell sync
adb reboot
注意:如果無法push,先執行adb disable-verity,然後重啓機器,再重複以上操作。
方法2. 編譯system鏡像下載燒錄
msm8909: 把QRD_Speaker_cal.acdb重命名爲Speaker_cal.acdb,替換到LA.BR.1.2.7-06210-8x09.0\vendor\qcom\proprietary\mm-audio\audcal\family-b\acdbdata\8909\QRD\代碼路徑下,重新編譯system.img即可。
msm8916: 把QRD_Speaker_cal.acdb重命名爲Speaker_cal.acdb,替換到LA.BR.1.2.4-05310-8x16.0\vendor\qcom\proprietary\mm-audio\audcal\family-b\acdbdata\8916\QRD\代碼路徑下,重新編譯system.img即可。
msm8917: 把QRD_Speaker_cal.acdb重命名爲Speaker_cal.acdb,替換到LA.UM.5.6\vendor\qcom\proprietary\mm-audio\audcal\family-b\acdbdata\8937\QRD\代碼路徑下,重新編譯system.img即可。
msm8937: 把QRD_SKU2_Speaker_cal.acdb重命名爲Speaker_cal.acdb,替換到LA.UM.5.6\vendor\qcom\proprietary\mm-audio\audcal\family-b\acdbdata\8937\QRD\msm8952-sku2-snd-card\代碼路徑下,重新編譯system.img即可。
msm8939: 把QRD_SKUL_Speaker_cal.acdb重命名爲Speaker_cal.acdb,替換到LA.BR.1.2.4-05310-8x16.0\vendor\qcom\proprietary\mm-audio\audcal\family-b\acdbdata\8916\QRD\msm8939-snd-card-skul\代碼路徑下,重新編譯system.img即可。
msm8953: 把QRD_Speaker_cal.acdb重命名爲Speaker_cal.acdb,替換到LA.UM.5.6\vendor\qcom\proprietary\mm-audio\audcal\family-b\acdbdata\8953\QRD\代碼路徑下,重新編譯system.img即可。
15:屏蔽所有物理按鍵
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java
computeScreenConfigurationLocked 方法將hardKeyboardAvailable改爲false。
boolean hardKeyboardAvailable = false;
16: vendor下的應用第一次自啓
frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java 6938行左右
for (int i=0; i<mStartedUsers.size(); i++) {
UserStartedState uss = mStartedUsers.valueAt(i);
if (uss.mState == UserStartedState.STATE_BOOTING) {
uss.mState = UserStartedState.STATE_RUNNING;
final int userId = mStartedUsers.keyAt(i);
Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
broadcastIntentLocked(null, null, intent, null,
new IIntentReceiver.Stub() {
@Override
public void performReceive(Intent intent, int resultCode,
String data, Bundle extras, boolean ordered,
boolean sticky, int sendingUser) {
synchronized (ActivityManagerService.this) {
requestPssAllProcsLocked(SystemClock.uptimeMillis(),
true, false);
/// M: Mobile Management Feature @{
mAmPlus.monitorBootReceiver(false, "Normal Bootup End");
/// @}
}
}
},
0, null, null,
android.Manifest.permission.RECEIVE_BOOT_COMPLETED,
AppOpsManager.OP_NONE, true, false, MY_PID, Process.SYSTEM_UID,
userId);
}
}
在
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
下添加一行intent.setFlags(32);
17:Android framework 修改系統聲音最大值默認值以及系統亮度默認值最大值位置
(Android4.4.3),找到文件代碼位置
修改系統音量:
文件位置:/frameworks/base/media/java/android/media/
這裏要修改兩個文件:
1.修改音量最大值 :修改AudioManager.java下的DEFAULT_STREAM_VOLUME值即可。
2.修改音量默認值:修改AudioService.java下的MAX_STREAM_VOLUME即可。
修改系統亮度:
文件位置:/frameworks/base/core/res/res/values/config.xml
1.最大值:config_screenBrightnessSettingMaximum
2.最小值:config_screenBrightnessSettingMinmum
3.默認值:config_screenBrightnessSettingDefault
18:消除原生Android網絡狀態上的驚歎號
谷歌在Android5.0之後的版本加入了CaptivePotalLogin服務。本服務的功能是檢查網絡連接互聯網情況,主要針對於Wi-Fi,不讓Android設備自動連接那些不能聯網的無線熱點,白白耗電。
該服務的原理就是讓接入無線熱點後,測一下網站connectivitycheck.gstatic.com的聯通情況。
但對於不能訪問谷歌服務器的地區,問題就來了:
如果谷歌(谷歌服務)認爲WiFi網絡無法聯網,就不會自動連接到該WiFi熱點。而且如果設備有移動網絡可用,就會自動切換到2G/3G/LTE。並且讓WiFi網絡的標誌上面顯示感嘆號標誌。
出現感嘆號的同時,該服務會一直試探服務器,直到聯通爲止。該過程會消耗流量和電量,甚至導致部分設備無法休眠。
這個感嘆號會使廣大強迫症晚期患者無法接受。
對於Android Source開發的同學,最好的解決辦法自然是修改源碼:
方案1:更換測試地址
frameworks/base/packages/SettingsProvider/res/values/defaults.xml:diff --git a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml index bede17d..508d384 100644 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml +++ b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml @@ -215,5 +215,5 @@ <bool name="def_guest_user_enabled">true</bool> <!-- Default for Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED --> - <integer name="def_captive_portal_detection_enabled" translatable="false">1</integer> + <integer name="def_captive_portal_detection_enabled" translatable="false">0</integer> </resources>
18:件上是單麥但是代碼中默認配置是雙麥屬性的問題
心板業務線上的客戶經常遇到這種設計問題,硬件上是單麥但是代碼中默認配置是雙麥屬性的問題。
這裏講解下如何調整單雙麥屬性配置以及該配置對設備音效的影響?
1. 代碼位置
8909平臺:device\qcom\msm8909\system.prop
8937平臺:hardware\qcom\audio\configs\msm8937\msm8937.mk
8953平臺:hardware\qcom\audio\configs\msm8953\msm8953.mk
2. 屬性解讀
以下屬性的意義:
ro.qc.sdk.audio.fluencetype可以配置爲none,fluence。其中fluence是高通提供的是雙麥降噪音效FLUENCEV5。
persist.audio.fluence.voicecall可以配置true和false,其中只有當ro.qc.sdk.audio.fluencetype配置爲fluence且persist.audio.fluence.voicecall配置爲true,對應聽筒通話模式走雙麥。
persist.audio.fluence.voicerec=false可以配置true和false,其中只有當ro.qc.sdk.audio.fluencetype配置爲fluence且persist.audio.fluence.voicerec配置爲true,對應通話錄音功能走雙麥,默認配置爲false,無需調整。
persist.audio.fluence.audiorec=false可以配置true和false,其中只有當ro.qc.sdk.audio.fluencetype配置爲fluence且persist.audio.fluence.audiorec配置爲true,對應普通錄音功能走雙麥。
persist.audio.fluence.speaker=false可以配置true和false,其中只有當ro.qc.sdk.audio.fluencetype配置爲fluence且persist.audio.fluence.speaker配置爲true,對應免提通話模式走雙麥。
注意,這裏有個小技巧,比如ro.qc.sdk.audio.fluencetype配置爲fluence後,也是可以調整普通錄音功能或者免提通話模式或者聽筒通話模式的一個或者多個使用的單麥的。
當然只有這樣音效更好的話才需要這麼配置。
3. 屬性名稱變更問題
在安卓8和安卓9系統中,屬性名稱有所變更。
對應變更如下:
ro.vendor.audio.sdk.fluencetype
persist.vendor.audio.fluence.voicecall
persist.vendor.audio.fluence.voicerec
persist.vendor.audio.fluence.audiorec
persist.vendor.audio.fluence.speaker
4. 屬性配置
當硬件上是雙麥,但是配置爲單麥屬性的話,既會導致資源浪費,也不利於音效優化。
反過來,如果硬件上是單麥但是軟件上配置爲雙麥屬性的話,音效必然不會很好。
19:Android系統修改所有應用能讀寫SD卡
需要Android源碼/frameworks\base\data\etc\platform.xml
找到
<permission name="android.permission.WRITE_EXTERNAL_STORAGE">
<group gid="sdcard_rw" />
修改爲
<permission name="android.permission.WRITE_EXTERNAL_STORAGE">
<group gid="sdcard_rw" />
<group gid="media_rw" />
保存,將系統燒錄到板中即可。
20:Android 6.0以上 默認允許應用彈窗申請權限
方案如下:
在 ap/packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java 中;
在 onCreate 中,源碼爲DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); final int permissionPolicy = devicePolicyManager.getPermissionPolicy(null);
改爲:
DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); // modify final int permissionPolicy = DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT;
21:Android 系統增加默認屬性 Settings.System.putInt
這種方式會保存變量到Settings 數據庫中,飛行模式等的開關就是用這種方式實現的。
首先需要定義一個系統屬性值
路徑:frameworks/base/core/java/android/provider/Settings.java
public static final String ACTION_MINTECH_NOTIFY_SETTINGS = "android.settings.mintech.notify";(自定義)
在public static final String[] SETTINGS_TO_BACKUP 數組中添加:
public static final String[] SETTINGS_TO_BACKUP = { STAY_ON_WHILE_PLUGGED_IN, // moved to global WIFI_USE_STATIC_IP, WIFI_STATIC_IP, WIFI_STATIC_GATEWAY, WIFI_STATIC_NETMASK, ACTION_MINTECH_NOTIFY_SETTINGS, //自定義添加的 WIFI_STATIC_DNS1, WIFI_STATIC_DNS2, WIFI_AUTO_CONNECT_TYPE, BLUETOOTH_DISCOVERABILITY, BLUETOOTH_DISCOVERABILITY_TIMEOUT, DIM_SCREEN, SCREEN_OFF_TIMEOUT, SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_MODE, SCREEN_AUTO_BRIGHTNESS_ADJ, VIBRATE_INPUT_DEVICES, MODE_RINGER_STREAMS_AFFECTED, VOLUME_VOICE, VOLUME_SYSTEM, VOLUME_RING, VOLUME_MUSIC, VOLUME_ALARM, VOLUME_NOTIFICATION,
需要import android.provider.Settings;
1)獲取方法如下:
@Override public void onResume() { super.onResume(); if(Settings.System.getInt(getContentResolver(), Settings.System.XXXX,0)==1) { //寫邏輯 }else //寫邏輯 } }
2)設置
if (/**設置邏輯判斷*/) { Settings.System.putInt(getContentResolver(), Settings.System.XXX, 1); } else { Settings.System.putInt(getContentResolver(),Settings.System.VIVIEN_FASTFOOD, 0); }
21:Android 系統USER版本去掉 USB插入調試確認框
修改路徑: x\frameworks\base\packages\SystemUI\src\com\android\systemui\usb\UsbDebuggingActivity.java
public class UsbDebuggingActivity extends AlertActivity implements DialogInterface.OnClickListener { private static final String TAG = "UsbDebuggingActivity"; private CheckBox mAlwaysAllow; private UsbDisconnectedReceiver mDisconnectedReceiver; private String mKey; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0) { mDisconnectedReceiver = new UsbDisconnectedReceiver(this); } Intent intent = getIntent(); String fingerprints = intent.getStringExtra("fingerprints"); mKey = intent.getStringExtra("key"); if (fingerprints == null || mKey == null) { finish(); return; } //1:去掉彈窗的初始化 /* final AlertController.AlertParams ap = mAlertParams; ap.mTitle = getString(R.string.usb_debugging_title); ap.mMessage = getString(R.string.usb_debugging_message, fingerprints); ap.mPositiveButtonText = getString(android.R.string.ok); ap.mNegativeButtonText = getString(android.R.string.cancel); ap.mPositiveButtonListener = this; ap.mNegativeButtonListener = this; // add "always allow" checkbox LayoutInflater inflater = LayoutInflater.from(ap.mContext); View checkbox = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); mAlwaysAllow = (CheckBox)checkbox.findViewById(com.android.internal.R.id.alwaysUse); mAlwaysAllow.setText(getString(R.string.usb_debugging_always)); ap.mView = checkbox; setupAlert();*/ /:2:將onclik事件的代碼移植過來 並設置 allow & alwaysAllow 爲true boolean allow = true;// (which == AlertDialog.BUTTON_POSITIVE); boolean alwaysAllow = true;//allow && mAlwaysAllow.isChecked(); try { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); if (allow) { service.allowUsbDebugging(alwaysAllow, mKey); } else { service.denyUsbDebugging(); } } catch (Exception e) { Log.e(TAG, "Unable to notify Usb service", e); } finish(); } //...省略部分代碼 @Override public void onClick(DialogInterface dialog, int which) { boolean allow = true;// (which == AlertDialog.BUTTON_POSITIVE); boolean alwaysAllow = true;//allow && mAlwaysAllow.isChecked(); try { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); if (allow) { service.allowUsbDebugging(alwaysAllow, mKey); } else { service.denyUsbDebugging(); } } catch (Exception e) { Log.e(TAG, "Unable to notify Usb service", e); } finish(); } }
參照代碼中的第一點和第二點
22 編譯 報錯:error while loading shared libraries: libz.so.1: cannot open shared object file
arm-linux-gcc 交叉編譯報錯:
error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
這個問題就是你64位的操作系統沒有32位的類庫,而android的SDK是要32位支持的,如果沒裝就只能是報上面的錯!
解決:
# sudo apt-get update
# sudo apt-get install lib32z1
23高通平臺關閉usb audio驅動功能?
使用usb camera的時候由於誤選經常會選擇到UAC Camera導致系統默認聲卡的功能異常,如無法錄音播放語音等,可以通過以下方式關閉usb audio驅動功能。
diff --git a/kernel/msm-3.18/sound/Makefile b/kernel/msm-3.18/sound/Makefile
index ce9132b..2c8b762 100644
--- a/kernel/msm-3.18/sound/Makefile
+++ b/kernel/msm-3.18/sound/Makefile
@@ -5,7 +5,7 @@ obj-$(CONFIG_SOUND) += soundcore.o
obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
obj-$(CONFIG_SOUND_PRIME) += oss/
obj-$(CONFIG_DMASOUND) += oss/
-obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
+obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ \
firewire/ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ atmel/
obj-$(CONFIG_SND_AOA) += aoa/