Android 5.1 - 7.1 系统(framework)定制、修改、移植、总结

1:修改开机logo

修改开机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/

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