Android 5.1 - 7.1 系統(framework)定製、修改、移植、總結 - 上篇

 

目錄

1:修改開機logo

2:Framework(SysteimUI) Android在狀態欄增加耳機拔插圖標

3:Android--隱藏狀態欄圖標

4:android 5.1 usb調試默認關閉設置方法

5:【Audio】【音量曲線】【響度】如何修改音量曲線?

6:【audio】【底噪】【功放延遲關閉問題】如何解決在關閉喇叭後喇叭還是有幾秒底噪問題?

 7:【audio】【usb】【UAC】如何在高通平臺關閉usb audio驅動功能?

8:【Modem】【GPS】GPS定位基礎術語介紹 

9:android:關掉系統的 安全模式

10:google全家桶套餐下載地址 

11:【Android】在SElinux下 如何獲得對一個內核節點的訪問權限 

12:如何區分歐標和美標耳機

13: 高通耳機增益簡單調試方案

14:高通工具acdb音頻配置文件使用方案 

15:屏蔽所有物理按鍵

 16: vendor下的應用第一次自啓

 17:Android framework 修改系統聲音最大值默認值以及系統亮度默認值最大值位置 

18:消除原生Android網絡狀態上的驚歎號

 18:件上是單麥但是代碼中默認配置是雙麥屬性的問題

  19:Android系統修改所有應用能讀寫SD卡

20:Android 6.0以上 默認允許應用彈窗申請權限 

21:Android 系統增加默認屬性 Settings.System.putInt

21:Android 系統USER版本去掉 USB插入調試確認框

22 編譯 報錯:error while loading shared libraries: libz.so.1: cannot open shared object file

23高通平臺關閉usb audio驅動功能?

24 提高Android源代碼的編譯效率

25Android編譯環境常用的配置 

26:android 物聯設備 省電開發之cpu降頻 

27:Android 插拔充電器增加聲音

28:高通SPI屏視頻播放RGB紅藍顏色反了,在電腦播放正常

29: android5.1 按下power鍵 系統不休眠

30: android5.1  電話白名單以及黑名單 邏輯

31: android5.1-7.1- 8.1 電話接通成功並廣播


修改開機logo有兩種方法,一種直接去改c語言代碼,第二種替換圖片用python生成splash。第一種方法我沒試過,感覺挺麻煩的,還有分辨率限制,超過多少分辨率就不能用第一種方法。

  1. 修改的文件路徑LINUX/android/bootable/bootloader/lk/splash
  2. 準備好logo圖片(png、bmp格式)
  3. 查看中原圖片的分辨率,修改logo圖片 保證 分辨率 一致
  4. 生成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全家桶套餐下載地址 

https://opengapps.org/

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的聯通情況。
但對於不能訪問谷歌服務器的地區,問題就來了:

  1. 如果谷歌(谷歌服務)認爲WiFi網絡無法聯網,就不會自動連接到該WiFi熱點。而且如果設備有移動網絡可用,就會自動切換到2G/3G/LTE。並且讓WiFi網絡的標誌上面顯示感嘆號標誌。

  2. 出現感嘆號的同時,該服務會一直試探服務器,直到聯通爲止。該過程會消耗流量和電量,甚至導致部分設備無法休眠。

  3. 這個感嘆號會使廣大強迫症晚期患者無法接受。

對於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/

24 提高Android源代碼的編譯效率

 編譯效率指南

1 開始編譯

(1) 在 .bashrc文件末尾添加:

         export USE_CCACHE = 1

         echo export USE_CCACHE=1 >> ~/.bashrc

(2) 爲了提高編譯效率,設置編譯器高速緩存:

        prebuilts/misc/linux-x86/ccache/ccache -M 50G

25Android編譯環境常用的配置 

一:編譯源碼不要生成odex 問題: 
    1: 禁止apk生成odex: 修改../build/core/package.mk   
          LOCAL_DEX_PREOPT := ture  -> LOCAL_DEX_PREOPT := false
    2: 禁止jar包生成odex: 修改/build/core/java_library.mk  
          LOCAL_DEX_PREOPT := ture  ->  LOCAL_DEX_PREOPT:= false  

    3:禁止當前apk編譯生成odex,在android.mk內增加:

          LOCAL_DEX_PREOPT := false

二:配置編譯的時候使用的資源mdpi / hdpi / xhdpi

   進入build/core/product_config.mk文件:

# Default to medium-density assets.

# (Can be overridden in the device config,e.g.: PRODUCT_AAPT_CONFIG += hdpi)

PRODUCT_AAPT_CONFIG := $(strip \

   $(PRODUCT_AAPT_CONFIG) \

    $(if$(filter %dpi,$(PRODUCT_AAPT_CONFIG)),,mdpi))

PRODUCT_AAPT_PREF_CONFIG := $(strip$(PRODUCT_AAPT_PREF_CONFIG))

PRODUCT_AAPT_CONFIG := mdpi xlarge hdpi xhdpilarge

 

修改PRODUCT_AAPT_CONFIG := mdpi那麼會有限編譯mdpi下的資源文件,如果mdpi目錄下沒有對應的文件纔會去hdpi下面去查找。
 

26:android 物聯設備 省電開發之cpu降頻 

1.CPU的工作頻率

單位赫茲或者兆赫茲,具體含義不解釋,說實話也不太清楚,不過可以確認一點的是,CPU的工作頻率越高,耗電量越大,反之亦然。我們做這個模塊省電的終極目標就是降低cpu的工作頻率。

2.CPU的調控模式

英文詞爲:Governor,解釋爲調速器,控制器。大家都指導android的framework是基於linux平臺的,那麼cpu的管理體系這塊也跟linux基本上一樣,其中包括cat命令,和一些文件的讀寫配置都是基本上差不多的。Linux在管理CPU方面,提供瞭如下集中調控模式,分別爲:

1.performance,這個不多說,就是將cpu的工作頻率調整到最大模式,讓cpu充分的工作。

2.powersave,將cpu的工作頻率調整到節能模式,也就是這個模式下的cpu平率是最低的。

3.ondemand,定期檢查負載。當負荷超越了閾值,設置的CPU運行以最高的頻率。當負載低於相同的閾值,設置的CPU運行在下一個的最低頻率。導致更少的延遲比。這個理解起來可能比較困難,我用白話大概解釋一下,ondemand從字面翻譯是“根據需求,按照需要”,cpu在工作的時候頻率會在一個最大值和最小值之間波動,當負載提高時,該調控期會自動提高cpu的頻率,反之亦然。“Causes less latency than the conservative governor.”這句話的意思是,該模式跟conservative相比,會導致更少的延遲。ok,那讓我們再看看conservative是如何解釋的。

4.conservative,改詞用來形容保守的,守舊的。該模式與ondemand的最大區別在於,conservative模式不會立刻在負載增加的情況下將cpu頻率調整到最大,他會調整到比目前頻率稍微大的頻段去工作,保守,實在是保守!所以換來的結果是,在某種極端情況下,該模式的延遲會大於ondemand。

5.usersapce,該模式將cpu的掌控權交給了用戶態,也就是交給了應用程序,應用程序可以通過配置文件的方式修改cpu的頻率信息,上面3種模式好比linux已經給你定義好的4種模式,userspace好比上面4種模式無法滿足我的需求,我需要自定義!(由於第四種方式需要進行大量的文件操作和配置,本文不闡述了,與省電的目標相差比較遠)

 

ok!我們瞭解了這5種省電模式,那麼如何查看你的android手機當前運行在哪種模式下呢?當前的cpu運行的工作頻率是多少呢?最大最小頻率是多少?我如何修改模式呢?

其實很簡單,android的cat命令都爲我們解決了這些問題,首先要強調的是,必須要獲得系統的root權限,才能進行以下操作。

 

第一步:adb shell 進入root 命令行模式

第二步 cd /sys/devices/system/cpu/cpu0/cpufreq 進入這個目錄下面

第三步 ls

第四步 你能看見很多的文件

第五步 參考下面的命令,打一遍就清楚了,不過爲了給傻瓜提供更好的服務,我還是儘可能的將命令的使用和作用寫的詳細。

/**
  * cpu cat命令大全
  * cat [%cpuFreqPath%]/cpuinfo_cur_freq   (當前cpu頻率)
  * cat [%cpuFreqPath%]/cpuinfo_max_freq  (最大cpu頻率)
  * cat [%cpuFreqPath%]/cpuinfo_min_freq  (最小cpu頻率)
  * cat [%cpuFreqPath%]/related_cpus  (cpu數量標號,從0開始,如果是雙核,結果爲0,1)
  * cat [%cpuFreqPath%]/scaling_available_frequencies  (cpu所有可用頻率)
  * cat [%cpuFreqPath%]/scaling_available_governors  (cpu所有可用調控模式)
  * cat [%cpuFreqPath%]/scaling_available_governors  (cpu所有可用調控模式)
  * cat [%cpuFreqPath%]/scaling_cur_freq  (?????)
  * cat [%cpuFreqPath%]/scaling_driver (調控驅動)
  * cat [%cpuFreqPath%]/scaling_governor (當前使用哪種調控模式)
  * cat [%cpuFreqPath%]/scaling_max_freq (?????)
  * cat [%cpuFreqPath%]/scaling_min_freq (?????)
  * cat [%cpuFreqPath%]/scaling_setspeed (?????)
  * cat [%cpuFreqPath%]/cpuinfo_transition_latency (變頻延遲)
  */

 

熟悉了這些語法和密令之後,我們就可以很輕鬆的明白,如何省電了,無非就是將cpu降頻嘛,把當前的調控模式調整爲powersave就可以了嘛,不錯,但是還不完全正確。

首先我先講一下如何通過命令行改寫當前的調控模式,很簡單,一句命令:

echo "你想使用的調控模式" /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

 

但是因爲手機出場適配等問題,有些機器上是沒有powersave這個模式的,對了,你一定要確認當前手機是否有powersave這個模式,具體怎麼看就在我上面給的命令大全裏面,自己找!在沒有powersave模式的情況下,我們只好通過更狠的方法修改cpu的頻率,那就是直接改寫cpu的頻率,命令:

echo 2331000 > cpu0/cpufreq/scaling_min_freq  設置最小的工作頻率,同時也可以設置最大的工作頻率。

ok!設置cpu的頻率的兩種方式我基本上說清楚了,本質沒什麼差別。那麼在實際java端的開發中,我們如何使用呢?

 

27:Android 插拔充電器增加聲音

修改方法如下:
需要修改的文件路徑如下
frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java。
在這個類中的如下代碼增加修改:

   以下音源可以adb shell ->  cd system/media 下查看ogg音源並替換

   final Uri soundUri = Uri.parse("file://" + "/system/media/audio/notifications/F1_MissedCall.ogg");;

 private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
              //省略若干 ........
           //通過增加對如下廣播的監聽,實現需要的效果。注意增加廣播的註冊
            else if (action.equals(Intent.ACTION_POWER_CONNECTED) || action.equals(Intent.ACTION_POWER_DISCONNECTED)){
              android.util.Log.d("fxjsound","charging sounds");
            final boolean enabled = Settings.Global.getInt(getContext().getContentResolver(),
                            Settings.Global.CHARGING_SOUNDS_ENABLED, 1) != 0;
                 if (enabled) {
                     final Uri soundUri = Uri.parse("file://" + "/system/media/audio/notifications/F1_MissedCall.ogg");;
                     if (soundUri != null) {
                         final Ringtone sfx = RingtoneManager.getRingtone(getContext(), soundUri);
                         if (sfx != null) {
                             sfx.setStreamType(AudioManager.STREAM_SYSTEM);
                             sfx.play();
                         }
                     }
                }
            }
            // end
        }
    };


 

28:高通SPI屏視頻播放RGB紅藍顏色反了,在電腦播放正常

--- a/kernel/drivers/video/msm/mdss/mdp3_ppp_data.c
+++ b/kernel/drivers/video/msm/mdss/mdp3_ppp_data.c
@@ -89,8 +89,10 @@ const uint32_t pack_patt_lut[MDP_IMGTYPE_LIMIT] = {
 };
 
 const uint32_t swapped_pack_patt_lut[MDP_IMGTYPE_LIMIT] = {
-       [MDP_RGB_565] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
-       [MDP_BGR_565] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
+       //[MDP_RGB_565] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
+       //[MDP_BGR_565] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
+       [MDP_RGB_565] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
+       [MDP_BGR_565] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
        [MDP_RGB_888] = PPP_GET_PACK_PATTERN(0, CLR_B, CLR_G, CLR_R, 8),
        [MDP_BGR_888] = PPP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
        [MDP_BGRA_8888] = PPP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R,

29: android5.1 按下power鍵 系統不休眠

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

 

 @Override // Binder call
         public void goToSleep(long eventTime, int reason, int flags) {
+            if(true){
+                return;
+            }
             if (eventTime > SystemClock.uptimeMillis()) {
                 throw new IllegalArgumentException("event time must not be in the future");
             }

 

30: android5.1  電話白名單以及黑名單 邏輯

需求: 來電檢測號碼如果是設置好的黑名單則掛斷,用戶是察覺不到

修改文件 packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java

 /**
     * Adds the specified call to the main list of live calls.
     *
     * @param call The call to add.
     */
    private void addCall(Call call) {
        Log.v(this, "addCall(%s)", call);
        //add code start 
        //判斷是否來電
        if(call.isIncoming()){
                //獲取設置好的電話通訊錄
                //這裏使用系統數據庫 並且使用逗號來分隔
                String  sysContacts =  Settings.System.getString(mContext.getContentResolver(),"sys.smartship.contacts");
                String[] split = sysContacts.split(",");
                String phoneNumber  = call.getNumber();
                if(!"".equals(phoneNumber)  || split.length != 0 )
                {
                        for (int i = 0 ; i < split.length ; i++ ){
                                if( split[i].equals(phoneNumber)){
                                    //有一樣的號碼則 掛斷
                                     call.disconnect();
                                     break;
                                }
                        }
                }
        }// if(call.isIncoming())
         //add code end
        call.addListener(this);
        mCalls.add(call);

        // TODO: Update mForegroundCall prior to invoking
        // onCallAdded for calls which immediately take the foreground (like the first call).
        for (CallsManagerListener listener : mListeners) {
            listener.onCallAdded(call);
        }
        updateCallsManagerState();
    }

 

31: android5.1-7.1- 8.1 電話接通成功並廣播

定位代碼文件

    packages/services/Telecomm/src/com/android/server/telecom/CallAudioManager.java

    @Override
    public void onCallStateChanged(Call call, int oldState, int newState) {
        onCallUpdated(call);
        //add code start 
        if(newState == CallState.ACTIVE){
             Intent intent =new Intent();
             intent.setAction("接通的廣播");
             mContext.sendBroadcast(intent);
        }
        //add code end
    }

注 : 如果想知道是來電接通還是去電接通   通過Call 對象 call.isIncoming() 來判斷

32: android 連接電腦時固定usb端口號 

diff --git a/device/qcom/common/rootdir/etc/init.qcom.usb.rc b/device/qcom/common/rootdir/etc/init.qcom.usb.rc

old mode 100644

new mode 100755

index eb45b64..88f6ff3

--- a/device/qcom/common/rootdir/etc/init.qcom.usb.rc

+++ b/device/qcom/common/rootdir/etc/init.qcom.usb.rc

@@ -27,7 +27,8 @@

 on init

     write /sys/class/android_usb/android0/f_rndis/wceis 1

-    write /sys/class/android_usb/android0/iSerial ${ro.serialno}

+    #write /sys/class/android_usb/android0/iSerial ${ro.serialno}

+       write /sys/class/android_usb/android0/iSerial 0

 on charger

     setprop sys.usb.config mass_storage

33:打開驅動DEBUG 日誌

diff --git a/kernel/arch/arm/configs/msm8909-1gb_defconfig b/kernel/arch/arm/configs/msm8909-1gb_defconfig

index 8ff4053..7513c85 100644

--- a/kernel/arch/arm/configs/msm8909-1gb_defconfig

+++ b/kernel/arch/arm/configs/msm8909-1gb_defconfig

@@ -614,3 +614,5 @@ CONFIG_MSM_CORE_CTL_HELPER=y

 CONFIG_HAVE_ARCH_SECCOMP_FILTER=y

 CONFIG_SECCOMP=y

 CONFIG_SECCOMP_FILTER=y

+CONFIG_DEBUG_LL=y

+CONFIG_EARLY_PRINTK=y

 34:高通USER關閉QLOAD下載

--- a/kernel/drivers/power/reset/msm-poweroff.c

+++ b/kernel/drivers/power/reset/msm-poweroff.c

@@ -63,7 +63,7 @@ static void *emergency_dload_mode_addr;

 static bool scm_dload_supported;

 

 static int dload_set(const char *val, struct kernel_param *kp);

-static int download_mode = 1;

+static int download_mode = 0;  //richal changed:disable qdload mode

 module_param_call(download_mode, dload_set, param_get_int,

                        &download_mode, 0644);

 static int panic_prep_restart(struct notifier_block *this,

 

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