Android 底层知识拾零(2)-程序员宅基地

技术标签: 程序员  python  android  开发语言  

-------------------------------------------------------------------------------------------------

DroidSansHebrew-Bold.ttf 希伯来语

DroidSansHebrew-Regular.ttf

-------------------------------------------------------------------------------------------------

DroidSansMono.ttf 西里尔和拉丁字母扩充附加

-------------------------------------------------------------------------------------------------

DroidSerif-Bold.ttf 拉丁字母:衬线体

DroidSerif-BoldItalic.ttf

DroidSerif-Italic.ttf

DroidSerif-Regular.ttf

-------------------------------------------------------------------------------------------------

MTLmr3m.ttf 繁体中文字库

-------------------------------------------------------------------------------------------------

NanumGothic.ttf 谚文字母(朝鲜语、韩语)

-------------------------------------------------------------------------------------------------

padauk.ttf 官方缅甸语字库

ZawgyiOne.ttf 民间缅甸语字库

-------------------------------------------------------------------------------------------------

Roboto-Bold.ttf 欧洲使用的拉丁、西里尔字母

Roboto-Regular.ttf

External/noto-fonts

-------------------------------------------------------------------------------------------------

NotoColorEmoji.ttf 表情字符

-------------------------------------------------------------------------------------------------

NotoSansBengaliUI-Bold.ttf 孟加拉语字库

NotoSansBengaliUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansDevanagariUI-Bold.ttf 印度语字库

NotoSansDevanagariUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansKannadaUI-Bold.ttf 卡纳达语字库(印度)

NotoSansKannadaUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansKhmerUI-Bold.ttf 高棉语字库(柬埔寨)

NotoSansKhmerUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansLaoUI-Bold.ttf 老挝语字库

NotoSansLaoUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansMalayalamUI-Bold.ttf 马拉雅拉姆文字库(印度)

NotoSansMalayalamUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansTamilUI-Bold.ttf 泰米尔语字库(印度、斯里兰卡、新加坡)

NotoSansTamilUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansTeluguUI-Bold.ttf 泰卢固语(印度)

NotoSansTeluguUI-Regular.ttf

-------------------------------------------------------------------------------------------------

NotoSansThaiUI-Bold.ttf 泰语字库

NotoSansThaiUI-Regular.ttf

=======================================================

2.Android手机做热点时,如何获取连过来设备的具体信息?

1、连接过来的设备的信息存放在/data/misc/dhcp/dnsmasq.leases中

2、它的格式是:

/系统id,不需取值/client mac地址/client ip地址/ client device name/加权后mac地址,也不需取值

1357041758 88:00:12:34:56:78 192.168.43.133 android-184cc6c105d7a3b 01:88:00:12:34:56:78

3、参考WifiServie.java的getClientIp()方法,可以自定义这个方法取得device name,具体如下:

public String getClientDeviceName(String deviceAddress) {//传mac地址进来

enforceAccessPermission();

if (TextUtils.isEmpty(deviceAddress)) {

return null;

}

//读取对应的文件信息

for (String s : readClientList(“/data/misc/dhcp/dnsmasq.leases”)) {

if (s.indexOf(deviceAddress) != -1) {

String[] fields = s.split(" ");

//校验数据是否破损

if (fields.length > 4) {

//返回第4个栏位

return fields[3];

}

}

}

return null;

}

3.在Fastboot里添加命令

fastboot 是android 默认的一种debug 方法,它的好处是在进入linux kernel 之前

即可操作。

默认fastboot 支持的命令:

usage: fastboot [ ]

commands:

update reflash device from

update.zip

flashall flash boot

  • recovery + system

flash [ ] write a file to a flash

partition

erase erase a flash

partition

format format a flash

partition

getvar display a

bootloader variable

boot [ ] download and boot kernel

flash:raw boot [ ] create bootimage and flash it

devices list all

connected devices

continue continue

with autoboot

reboot reboot

device normally

reboot-bootloader reboot device

into bootloader

help show this

help message

options:

-w erase userdata and cache (and

format if supported by partition type)

-u do not first erase partition

before formatting

-s specify device serial number or path to

device port

-l with “devices”, lists device

paths

-p specify product name

-c override kernel commandline

-i specify a custom USB vendor id

-b <base_addr> specify a custom kernel base

address

-n specify the nand page size.

default: 2048

-S [K|M|G] automatically sparse files

greater than size. 0 to disable

fastboot 提供了扩展的命令符号

fastboot oem command args

下面以fastboot oem hello test 来说明如何扩展

(1).在bootable/bootloader/lk/app/mt_boot/fastboot.c

的fastboot_init 函数中添加一个新的register

//第一个参数是命令的名称

//第二个参数是命令的执行函数

//第三个参数是在security IC 中是否还提供此命令

fastboot_register(“oem hello”, cmd_oem_hello, FALSE);

(2). 实现cmd_oem_hello 函数

void cmd_oem_hello(const char *arg, void *data, unsigned size) {

//注意args 是以command 结束开始,即" args"

if(!strncmp(arg, " OK", strlen(" OK"))){

fastboot_okey(“OK”);

}else{

fastboot_fail(“Not OK”);

}

}

(3). 与PC 端交互

您可以使用下面已经定义好的三个函数与PC 端交互

fastboot_okey(const char* result);

fastboot_fail(const char* reason);

fastboot_info(const char* reason);

注意这三个打印字符串的长度都不能超过64-1-4 = 59 个字

4.在任意界面按某个实体键进入某个Activity

有些手机会有附加的功能键,比如拍照实体键,甚至有两端式的,轻按聚焦,深按拍照。那么类似功能是如何在Android手机上实现的呢?

可以修改源码下

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件中的如下方法:

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event,int policyFlags)

找到如下代码段:

else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {

if (down && repeatCount == 0 && !keyguardOn) {

showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);

}

return -1;

}

在这个else if后面增加相应代码:

else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {

if (down && repeatCount == 0 && !keyguardOn) {

showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);

}

return -1;

} //add begin

else if (keyCode == KeyEvent.KEYCODE_XXX) {

if (down && repeatCount == 0 && !keyguardOn) {

mContext.startActivity(new Intent(“intent.xxx”)

.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

}

return -1;

} // add end

注意:

1、上面写的KeyEvent.KEYCODE_XXX是预设定好的实体键的键值,根据需要来设定即可;

2、startActivity(new Intent(“intent.xxx”)中的intent.xxx需要根据所启动的activity来写

5.在关机界面添加重启功能

Google原生的Android系统一般是没有“重启”这个选项的。有时候重启也是不可或缺的一个Feature,那么如何在源码环境下添加这个选项呢?

1. 在frameworks\base\core\res\res\values\strings.xml

中添加标签:

Reboot

当然这只是英语语系的,需要添加其它语系的标示,把"Reboot" 替换成其它语言。

2. 在alps\frameworks\base\core\res\res\drawable-hdpi 中添加图标:

zms_ic_lock_power_reboot.png

3. 打开frameworks\policies\base\phone\com\android\internal\policy\impl\GlobalActions.java

大概在这个文件的261行有这样的代码:

mItems = Lists.newArrayList(

// silent mode

mSilentModeToggle,

// next: airplane mode

mAirplaneModeOn,

// last: power off

在这里,我们添加power reboot 的新的item.

具体这个mItems 更新为如下:

mItems = Lists.newArrayList(

// silent mode

mSilentModeToggle,

// next: airplane mode

mAirplaneModeOn,

// last: power off

new SinglePressAction(

com.android.internal.R.drawable.ic_lock_power_off,

R.string.global_action_power_off) {

public void onPress() {

// shutdown by making sure radio and power are handled

accordingly.

ShutdownThread.shutdown(mContext, true);

}

public boolean showDuringKeyguard() {

return true;

}

public boolean showBeforeProvisioning() {

return true;

}

}//zms add start

,

new SinglePressAction(

com.android.internal.R.drawable.zms_ic_lock_power_reboot,

R.string.zms_global_action_power_reboot) {

public void onPress() {

// reboot by making sure radio and power are handled

accordingly.

ShutdownThread.reboot(mContext, null, true);

}

public boolean showDuringKeyguard() {

return true;

}

public boolean showBeforeProvisioning() {

return true;

}

}

//zms add end.

);

经过这样的添加/修改后,这项feature 即可运行。

注意如果测试的话,因为有修改framework 中的文件,最好new 一下整个工程。

另外还需要修改一下ShutdownThread.java 中的那个dialog 显示描述,不然将依旧看到“关机”的信息。

位置:frameworks/base/services/java/com/android/server/power/ShutdownThread.java

不同版本的代码位置可能有所差别,可以在根目录下find一下:

find -name ShutdownThread.java

如下:

sConfirmDialog = new AlertDialog.Builder(context)

.setTitle((mReboot && !mRebootSafeMode)

? com.android.internal.R.string.reboot_title
(mRebootSafeMode
? com.android.internal.R.string.reboot_safemode_title
com.android.internal.R.string.power_off))

.setMessage(resourceId)

.setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

beginShutdownSequence(context);

if (sConfirmDialog != null) {

sConfirmDialog = null;

}

}

})

.setNegativeButton(com.android.internal.R.string.no, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

synchronized (sIsStartedGuard) {

sIsStarted = false;

}

if (sConfirmDialog != null) {

sConfirmDialog = null;

}

}

})

.create();

6.使用init.rc触发脚本实现隐藏内置应用

【实现逻辑】

通过在property_service.c中设置标志位,在设置中实现接口改变标志位,

使用init.rc中声明的服务来侦听标志位的变化,显式启动声明的服务,执行对应的脚本,把应用后缀从apk重命名为bak,从而实现隐藏(显示逻辑相反)。

【实现步骤】以隐藏Google Play Store(system/priv-app/Phonesky.apk)为例:

1.首先在system/core/init/property_service.c中声明并初始化标志位,0为隐藏,1为显示,默认隐藏

{ “app.launcher.start”, AID_SYSTEM, 0},

  • { “app.phonesky.show”, AID_SYSTEM, 0}, //Add By zj

{ “cdma.”, AID_RADIO, 0 }, //Add by gfzhu VIA

2.在设置的开发者选项中实现对应的接口:

文件路径:packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java

①声明和初始化:

private static final String SHOW_PHONESKY = “show_phonesky”;

private CheckBoxPreference mShowPhonesky;

mShowPhonesky = findAndInitCheckboxPref(SHOW_PHONESKY);

②CheckBox的逻辑:

(BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);

  •  } else if (preference == mShowPhonesky) { // ZJ Add
    
  •       if(mShowPhonesky.isChecked())
    
  •       {
    
  •          SystemProperties.set("app.phonesky.show","1");
    
  •       }else{
    
  •          SystemProperties.set("app.phonesky.show","0");
    
  •       }
    

} else if (preference == mBtHciSnoopLog) {

③增加一个Preference:

packages/apps/Settings/res/xml/development_prefs.xml

android:targetClass=“com.android.settings.SetFullBackupPassword” />

  •   <CheckBoxPreference 
    
  •    android:key="show_phonesky" 
    
  •    android:title="@string/show_phonesky" 
    
  •    />
    

<CheckBoxPreference

④添加对应语言的string字符:

Show Google Play Store

⑤设置中新增一个监听,初始化Checkbox的逻辑:

packages/apps/Settings/src/com/android/settings/BootReceiver.java

内容如下:

package com.android.settings;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.SystemClock;

import android.util.Log;

import android.os.SystemProperties;

public class BootReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

String action = arg1.getAction();

if(action.equals(Intent.ACTION_BOOT_COMPLETED))

{

SharedPreferences shared = arg0.getSharedPreferences(“com.android.settings_preferences”, Context.MODE_PRIVATE);

boolean show_phonesky = shared.getBoolean(“show_phonesky”, false);

if(show_phonesky){

SystemProperties.set(“app.phonesky.show”,“1”);

}else{

SystemProperties.set(“app.phonesky.show”,“0”);

}

}

}

}

⑥在Settings的AndroidManifest文件中添加BroadcastReceiver的权限和声明:

3.在init.rc中添加对应的服务和触发条件:

路径:mediatek/config/esky27_tb_ccn_mlc_kk/init.rc

+# ZJ Add START

+#Hide or Show Google Play Dynamicly

+#disabled:服务不会自动运行,必须显式地通过服务器来启动。

+#oneshot:当此服务退出时不会自动重启。

+service hidePhonesky /system/bin/hidePhonesky

  •   disabled
    
  •   oneshot    
    

+service showPhonesky /system/bin/showPhonesky

  •   disabled
    
  •   oneshot    
    

+#on property:sys.boot_completed=1

+# start renamePhonesky

+on property:app.phonesky.show=1

  • start showPhonesky

+on property:app.phonesky.show=0

  • start hidePhonesky

+# ZJ Add END

4.隐藏和显示应用的脚本:

隐藏应用:vendor/ThirdParty/App/dte/hidePhonesky

内容:

#!/system/bin/sh

#!/system/bin/busybox

mount -o remount,rw /system;

mv /system/priv-app/Phonesky.apk /system/priv-app/Phonesky.bak

显示应用:vendor/ThirdParty/App/dte/showPhonesky

内容:

#!/system/bin/sh

#!/system/bin/busybox

mount -o remount,rw /system;

mv /system/priv-app/Phonesky.bak /system/priv-app/Phonesky.apk

5.拷贝脚本到system/bin目录下:

参考以下格式添加到对应的mk文件:

+#添加重命名GooglePlay脚本

+PRODUCT_COPY_FILES += \

  •   vendor/ThirdParty/App/dte/hidePhonesky:system/bin/hidePhonesky \
    
  •   vendor/ThirdParty/App/dte/showPhonesky:system/bin/showPhonesky \
    
  •   vendor/ThirdParty/App/dte/Phonesky.bak:system/priv-app/Phonesky.bak
    

7.修改链接电脑时的“总线已报告设备描述”显示名称

在:Android USB Gadget Driver中进行修改

static const char longname[] = “Gadget Android”;

/* Default vendor and product IDs, overridden by userspace */

#define VENDOR_ID 0x0BB4

#define PRODUCT_ID 0x0001

/* Default manufacturer and product string , overridden by userspace */

// 制造商

#define MANUFACTURER_STRING “MediaTek”

// 设备描述,可以在“总线已报告设备描述”中看到

#define PRODUCT_STRING “MTP”

#define USB_LOG “USB”

8.开机动画包bootanimation的制作规范

除了一些特别厂商,其他大部分Android设备的开机动画包的文件名都是bootanimation.zip。可以通过adb查看system/media/路径查看,如果没有一般会调用系统开机动画,即android字样。这点三星有些不同,它的格式是bootsamsung.qmg。今天只说一下具有普适性的bootanimation.zip的制作。

这是三星的:

一、保证bootanimation.zip压缩包下的图片Size和格式完全统一

二、请写规范的配置文件desc.txt

desc.txt每个参数的实际意义,以如下的case为例:

480 854 10

p 1 0 part0

p 0 0 part1

1.第一行的参数前两位480和854分别表示要显示动画的width和height. 默认情况下应该与Display的width和height一致,如果设置比Display的size要小,则动画会居中显示,周边将用黑框填充.

2.第一行的第三个参数10是定义动画播放的预订帧率(FPS),这个帧率fps是指:每秒动画播放的帧数。此帧数是一个理想值,并不一定代表动画实际帧率,假设预订帧率为FPS_I,预订每一帧解析的时间t_I, 则t_I=1/FPS_I。

实际帧率的规则是:假设某一帧从解析到渲染耗时为t_r,当t_r<=t_l,则渲染完这一帧后,动画这个thread会sleep(t_l-t_r)的时间,也就说这一帧最后的耗时就t_l;假设某一帧从解析到渲染耗时为t_r,当t_r>t_l,则渲染完这一帧后,动画这个thread会马上开始下一帧,也就说这一帧最后的耗时就t_r。所以,desc.txt内设置的这个帧率并不能代表动画的实际帧率,实际的帧率是和系统开机的performance有关,因此不是说在desc.txt设置帧率越大越好,反而容易出现当某一帧耗时较长,就容易给用户某一帧卡顿的体验,目前这个FPS的值一般设置在13左右。当然,设置FPS为13并不是说系统的performance比较低,本身在开机动画阶段,系统进入Bootup Android阶段,许多进程需要启动,系统的主要工作应该集中与开机启动的进程,因此不建议动画的图片过于复杂,导致系统开机的Performance变差。

3.第二行和第三行情况类似,一般用于分别设置顺序播放和无限循环播放的相关参数.第一个参数p是google default的设计,请保留以p开头。第二个参数1表示这一行对应folder所需要循环播放的次数,如果是0则表示是无限循环播放,直到系统ready后通过被动退出。第三个参数0表示这一行对应folder里面的每一帧图片依次解析渲染完成后,要进入下一个循环,动画这个线程需要pause多久。第四个参数part0表示对应设置规则的folder的path。

Note1:默认的设计,都是将顺序播放的动画放在一个folder,定义这个folder所需要循环的次数;在无限循环的folder内放置一张图片,保证动画没有收到退出指令的时候,动画可以一直显示.

Note2:由于循环播放的folder中的每帧都是以纹理对象存储在纹理内存中再upload到GPU做渲染的,以便下次循环播放不需要重新解析.如果动画包中的图片太多或者图片的size很大时,则会导致占用较多的memory,因此为保证开机的performance,开机动画不建议太复杂.

注意事项:

1.压缩包里面除了desc.txt以外不能存在其他非图片格式的文件,否则会引起bootanimation程序崩溃,所以在windows系统下打包bootanimation.zip的时候,如果浏览过图片,要删掉生成隐藏文件Thumbs.db,或者在linux下打包。

2.压缩包内的文件结构是单层的,就是双击压缩包预览,直接看到part0,part1文件夹和sesc.txt文件,而不能是bootanimation文件夹。

3.desc.txt文件内容不要有多余的空行

4.制作完成后可以adb push到设备的/system/media/下面重启看一下效果。

9.修改内核版本编译信息中的user和host字段

有客户需要修改内核版本号中的字段,如下图红线标注区域:

修改方法:

以修改为“qizi@qizi001"为例:

打开kernel/scripts/mkcompile_h,做如下修改即可:

----------------------------------------------------------------------------------

@@ -73,8 +73,8 @@ UTS_TRUNCATE=“cut -b -$UTS_LEN”

echo \#define UTS_VERSION \“`echo $UTS_VERSION | $UTS_TRUNCATE`\”

-  echo \#define LINUX_COMPILE_BY \“`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`\”

-  echo \#define LINUX_COMPILE_HOST \“`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\”

+  echo \#define LINUX_COMPILE_BY \“`echo “qizi” | $UTS_TRUNCATE`\”

+  echo \#define LINUX_COMPILE_HOST \“`echo “qizi001” | $UTS_TRUNCATE`\”

echo \#define LINUX_COMPILER \“`$CC -v 2>&1 | tail -n 1`\”

) > .tmpcompile

----------------------------------------------------------------------------------

附:

在对应的buildinfo文件中修改ro.build.user和ro.build.host两个属性不能达到预期效果。

10.Android 4.4限制Root权限的逻辑

android  4.4 版本后,su 权限严重被限制, 如无法直接访问data 区域,无法直接remount system image, 无法设置system property。

Google 不遗余力的提高android系统的安全性, 而针对su 这个即令人恨,又令人爱的命令,就痛下杀手。主要体现在三个方面:

1. 限制user 版本adbd process 的capabilities bound set。循环CAPBSET_DROP 动作,将Process的root capabilities 进行了强行限制。仅仅保留了CAP_SETUID, CAP_SETGID 这两项,用于run-as使用,可参考源码中system/core/adb/adb.c 中的drop_capabilities_bounding_set_if_need 函数。这样导致的情况是,在user 版本中usb debug 的su 受到极大的限制,仅仅能够模拟对应的uid/gid,而无法拿去真正的root 权限。

2. 限制所有app 的capabilities bound set, 在android 4.4 上,zygote fork app 时,特意对所有fork 出来的子进程,进行了CAPBSET_DROP 动作,将Process 的root capabilities 进行了强行限制。 使得即使这些APK 徒有Root 权限,而无真实的capabilites.

这样导致的情况是, app 执行su 时,其权限受到了严格的管控,比如无法逃脱DAC 权限管控。但因为依旧具有root uid/gid, 所以在framework 层的permission 限制上依旧畅通无阻。

3. SElinux 权限限制。 在user 版本上,没有导入有效的SElinux policy, 这样一旦本身受SElinux 限制的process 使用su 时,同样会受到SElinux 的限制。 目前只有4个process 会受到此影响,即zygote, netd, installd, vold.消除这种限制的手法即是external/sepolicy/android.mk 里面的

ifeq ($(TARGET_BUILD_VARIANT),user)

BOARD_SEPOLICY_IGNORE+=external/sepolicy/su.te

else

BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te

endif

更新成:

ifeq ($(TARGET_BUILD_VARIANT),user)

BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te

else

BOARD_SEPOLICY_IGNORE+=external/sepolicy/su_user.te

endif

11.Android自动连接WiFi优先级规则,以及查看已连接WiFi的密码

目前Android的WiFi自动连接的优先级规则如下:

1、priority值的范围设定为[0,1000000),如果超出此范围则会reset;

2、最近连接过的AP拥有最高priority,在自动连接中会首先尝试连接它;

3、未连接过但是扫描到的AP,按其信号值强弱排序,越强的显示靠前,但是,还得综合

AP的安全因素,基本情况是:WPA/WPA2 > WEP > signal level high > signal level low > noise low > noise

high

4、如果是预置的AP,可能会人为设定其最高的priority;

看一下源码,代码路径:frameworks/base/wifi/java/android/net/wifi/

WifiConfigStore.java

boolean selectNetwork(int netId) {

if (VDBG) localLog(“selectNetwork”, netId);

if (netId == INVALID_NETWORK_ID) return false;

// Reset the priority of each network at start or if it goes too high.

if (mLastPriority == -1 || mLastPriority > 1000000) {

Xlog.d(TAG, “Need to reset the priority, mLastPriority:” + mLastPriority);

for(WifiConfiguration config : mConfiguredNetworks.values()) {

if (config.networkId != INVALID_NETWORK_ID) {

config.priority = 0;

addOrUpdateNetworkNative(config);

}

}

mLastPriority = 0;

}

// Set to the highest priority and save the configuration.

WifiConfiguration config = new WifiConfiguration();

config.networkId = netId;

config.priority = ++mLastPriority;

addOrUpdateNetworkNative(config);

mWifiNative.saveConfig();

/* Enable the given network while disabling all other networks */

enableNetworkWithoutBroadcast(netId, true);

/* Avoid saving the config & sending a broadcast to prevent settings

  • from displaying a disabled list of networks */

return true;

}

有时候,我们会忘记已连接WiFi的密码,应用市场也有相关的应用可以帮我们读取。其实如有有Root权限,用RE文件管理器(Root Explorer)就可以查看了。文件路径:

/data/misc/wifi/sockets/wpa_supplicant.conf

每一个network包裹起来的就是一个连接过的WiFi热点,其中ssid是名字,psk就是密码了,也可以看到其他信息,包括加密类型key_mgmt和优先级priority,是否自动连接autojoin等,如下图:

12.让一个应用不在“全部应用列表”中显示

首先修改一下这个文件:

packages/apps/Settings/src/com/android/settings/applications/ApplicationsState.java

下面是Git Diff 的结果:

diff --git a/packages/apps/Settings/src/com/android/settings/applications/ApplicationsState.java b/packages/apps/Settings/src/com/android/settings/applications/ApplicationsState.java

index e87d7cf…3f1a507 100644 (file)

— a/packages/apps/Settings/src/com/android/settings/applications/ApplicationsState.java

+++ b/packages/apps/Settings/src/com/android/settings/applications/ApplicationsState.java

@@ -33,6 +33,8 @@ import java.util.HashMap;

import java.util.List;

import java.util.regex.Pattern;

+import android.os.TCToolManager;

/**

  • Keeps track of information about all installed applications, lazy-loading

  • as needed.

@@ -42,6 +44,8 @@ public class ApplicationsState {

static final boolean DEBUG = false;

static final boolean DEBUG_LOCKING = false;

  •   final TCToolManager mTCTool;
    

public static interface Callbacks {

public void onRunningStateChanged(boolean running);

public void onPackageListChanged();

@@ -404,6 +408,8 @@ public class ApplicationsState {

mThread.start();

mBackgroundHandler = new BackgroundHandler(mThread.getLooper());

  •           mTCTool = (TCToolManager)mContext.getSystemService(Context.TCHIP_TOOL_SERVICE);
    

// Only the owner can see all apps.

if (UserHandle.myUserId() == 0) {

mRetrieveFlags = PackageManager.GET_UNINSTALLED_PACKAGES |

@@ -548,6 +554,13 @@ public class ApplicationsState {

if (DEBUG_LOCKING) Log.v(TAG, “rebuild acquired lock”);

AppEntry entry = getEntryLocked(info);

entry.ensureLabel(mContext);

  •                    if (mTCTool.isHide(info.packageName)) {
    
  •                        if(TCToolManager.DEBUG)
    
  •                            TCToolManager.Log("hide app:" + info.loadLabel(mPm) + ":" + info.packageName);
    
  •                        continue;
    
  •                    }
    

if (DEBUG) Log.i(TAG, "Using " + info.packageName + ": " + entry);

filteredApps.add(entry);

if (DEBUG_LOCKING) Log.v(TAG, “rebuild releasing lock”);

然后添加以下三个文件到指定路径:

frameworks/base/core/java/android/os/ITCToolService.aidl:

/**

  • Copyright 2007, The Android Open Source Project

  • Licensed under the Apache License, Version 2.0 (the “License”);

  • you may not use this file except in compliance with the License.

  • You may obtain a copy of the License at

  • http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing, software

  • distributed under the License is distributed on an “AS IS” BASIS,

  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  • See the License for the specific language governing permissions and

  • limitations under the License.

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

ress or implied.

  • See the License for the specific language governing permissions and

  • limitations under the License.

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-w0hoPTR0-1713756720259)]

[外链图片转存中…(img-vdNRj42R-1713756720260)]

[外链图片转存中…(img-BEhiHebL-1713756720261)]

[外链图片转存中…(img-FnyHB7mq-1713756720262)]

[外链图片转存中…(img-jPDUSfyU-1713756720263)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

[外链图片转存中…(img-2TuNi6VE-1713756720264)]

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

[外链图片转存中…(img-eicYwsxn-1713756720265)]

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

[外链图片转存中…(img-RgDwVoYp-1713756720266)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-5hiMRIyI-1713756720266)]

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

[外链图片转存中…(img-ax5rzBi0-1713756720268)]

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84132204/article/details/138068941

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search