-------------------------------------------------------------------------------------------------
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)]
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
文章浏览阅读90次。【代码】js-选项卡原理。_选项卡js原理
文章浏览阅读67次。原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。它创建的实例,具有与原型一样的数据结构和值分为深度克隆和浅度克隆。浅度克隆:克隆对象的值类型(基本数据类型),克隆引用类型的地址;深度克隆:克隆对象的值类型,引用类型的对象也复制一份副本。UML图:具体代码:浅度复制:import java.util.List;/*..._prototype 设计模式
文章浏览阅读59次。入选国内首批云计算服务创新发展试点城市的北京、上海、深圳、杭州和无锡起到了很好的示范作用,不仅促进了当地产业的升级换代,而且为国内其他城市发展云计算产业提供了很好的借鉴。据了解,目前国内至少有20个城市确定将云计算作为重点发展的产业。这势必会形成新一轮的云计算基础设施建设的**。由于云计算基础设施建设具有投资规模大,运维成本高,投资回收周期长,地域辐射性强等诸多特点,各地在建...
文章浏览阅读9.4k次,点赞2次,收藏20次。一、功能及目的 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。BOOT1=x BOOT0=0 // 从用户闪存启动,这是正常的工作模式。BOOT1=0 BOOT0=1 // 从系统存储器启动,这种模式启动的程序_stm32boot0和boot1作用
文章浏览阅读3.4k次,点赞2次,收藏22次。C语言函数递归调用_c语言函数递归调用
文章浏览阅读410次。明日方舟bilibili服是一款天灾驾到战斗热血的创新二次元废土风塔防手游,精妙的二次元纸片人设计,为宅友们源源不断更新超多的纸片人老婆老公们,玩家将扮演废土正义一方“罗德岛”中的指挥官,与你身边的感染者们并肩作战。与同类塔防手游与众不同的几点,首先你可以在这抽卡轻松获得稀有,同时也可以在战斗体系和敌军走位机制看到不同。明日方舟bilibili服设定:1、起因不明并四处肆虐的天灾,席卷过的土地上出..._明日方舟抽卡模拟器
文章浏览阅读437次。Maven上传Jar到私服报错:ReasonPhrase: Repository version policy: SNAPSHOT does not allow version: xxx_repository version policy snapshot does not all
文章浏览阅读1.2k次。斐波那契数列(Fibonacci Sequence)是由如下形式的一系列数字组成的:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …上述数字序列中反映出来的规律,就是下一个数字是该数字前面两个紧邻数字的和,具体如下所示:示例:比如上述斐波那契数列中的最后两个数,可以推导出34后面的数为21+34=55下面是一个更长一些的斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,_斐波那契日
文章浏览阅读363次。PHP必会面试题1. 基础篇1. 用 PHP 打印出前一天的时间格式是 2017-12-28 22:21:21? //>>1.当前时间减去一天的时间,然后再格式化echo date('Y-m-d H:i:s',time()-3600*24);//>>2.使用strtotime,可以将任何字符串时间转换成时间戳,仅针对英文echo date('Y-m-d H:i:s',str..._//该层循环用来控制每轮 冒出一个数 需要比较的次数
文章浏览阅读1.3k次,点赞26次,收藏26次。windows下用mingw编译opencv貌似不支持cuda,选cuda会报错,我无法解决,所以没选cuda,下面两种编译方式支持。打开cmake gui程序,在下面两个框中分别输入opencv的源文件和编译目录,build-mingw为你创建的目录,可自定义命名。1、如果已经安装Qt,则Qt自带mingw编译器,从Qt安装目录找到编译器所在目录即可。1、如果已经安装Qt,则Qt自带cmake,从Qt安装目录找到cmake所在目录即可。2、若未安装Qt,则安装Mingw即可,参考我的另外一篇文章。_opencv mingw contrib
文章浏览阅读10w+次,点赞42次,收藏309次。今天给大家推荐5个好用且免费的简历模板网站,简洁美观,非常值得收藏!1、菜鸟图库https://www.sucai999.com/search/word/0_242_0.html?v=NTYxMjky网站主要以设计类素材为主,办公类素材也很多,简历模板大部个偏简约风,各种版式都有,而且经常会更新。最重要的是全部都能免费下载。2、个人简历网https://www.gerenjianli.com/moban/这是一个专门提供简历模板的网站,里面有超多模板个类,找起来非常方便,风格也很多样,无须注册就能免费下载,_hoso模板官网
文章浏览阅读142次。你听说过吗?该计划可让您以推广您的产品并在成功销售时支付佣金。它提供了新的营销渠道,使您的产品呈现在更广泛的受众面前并提高品牌知名度。此外,TikTok Shop联盟可以是一种经济高效的产品或服务营销方式。您只需在有人购买时付费,因此不存在在无效广告上浪费金钱的风险。这些诱人的好处是否足以让您想要开始您的TikTok Shop联盟活动?如果是这样,本指南适合您。_tiktok联盟