-------------------------------------------------------------------------------------------------
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
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)
.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},
{ “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
+on property:app.phonesky.show=0
+# 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
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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合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)]
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程
文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你
文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_
文章浏览阅读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同一框内输入二行怎么换行
文章浏览阅读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次。济大数电实验报告_数据选择器及其应用
文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件
文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt
文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的
文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法
文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战
文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search