Ⅰ android7.0冻结开机动画无法进入Launcher
/data/system/users/0/package-restrictions.xml
这个文件存储了所有应用程序的运行状态,开机立即读取,经过系统行为的判断,如果系统必须启动的APP被禁用了,则不能启动系统,一直重复重复的某个环节
通过pm命令:
pm enable [–user USER_ID] PACKAGE_OR_COMPONENT 恢复为激活状态
pm disable [–user USER_ID] PACKAGE_OR_COMPONENT 修改为禁用状态
pm list packages -d 查看禁用的列表 (返回的package name 的列表)
查package信息(打印出来的是清单文件信息)
mpsys package 包名
/system/priv-app 系统app目录主要是底层app,如setting 、systemUI、TelephonyProvider
/system/app 系统app目录 ,主要是三方定制app,如launcher 、Email、Calendar
/data/app 普通应用,push apk至该目录,reboot设备PM会自动扫描安装该目录下的app,正常的用户安装也是把apk文件存储在这个目录下面
主要看日志确定几个过程是否正常,找到问题可能的点
没有找到intent,可能是launcher没有编译进去,如果编译进去了PackageManager是否完成扫描,没有扫描检查其他system/app或者/system/priv-app 有没有扫描
Android7.0检查setting是否被禁用,因为在Android 7.0中,启动过程中有了新的一步。一旦您的手机完全启动并且Android正在运行,就有一种方法可供开发人员在您登录前允许通信。其他所有内容都会被锁定,您无法与任何其他应用进行交互。谷歌甚至为需要立即运行的应用程序插入了一个名为“ Device Storage”的新存储区域,因为他们无法访问正常的凭据保护文件系统
Android7.0下的DirectBoot模式特点
1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。
2.Device encrypted storage,主要对应的就是Direct Boot使用的存储空间。在Direct Boot模式下和用户解锁手机后都可以使用的存储空间
Direct Boot模式下app是无法运行的
要运行的话需要在AndroidManinfest.xml中设置 android:directBootAware="true"
3.launcher启动流程增加了settings--->FallbackHome--->launcher,比较与Android6.0耗时更多
FallbackHome源码
Ⅱ android Launcher设置默认桌面图标!
附件中的apk可以查看你系统中所有应用的包名和类名。 屏幕编号一般手机有5个分屏,你想放在哪个就填哪个(0~4)
Ⅲ android 怎样调用launcher
如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自带的Home,而且不希望用户安装的Launcher来替换掉你的Launcher,应该如何来实现呢?
我们可以通过修改Framework层来实现这样的功能。
1) 首先了解一下Android的启动过程。
Android系统的启动先从Zygote开始启动,然后......(中间的过程就不说了).....一直到了SystemServer(framework)这个地方,看到这段代码:
/**
* This method is called from Zygote to initialize the system. This willcause the native
* services (SurfaceFlinger, AudioFlinger, etc..) to be started. Afterthat it will call back
* up into init2() to start the Android services.
*/
native public static void init1(String[] args);
public static void main(String[] args) {
if (SamplingProfilerIntegration.isEnabled()) {
SamplingProfilerIntegration.start();
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
SamplingProfilerIntegration.writeSnapshot("system_server");
}
}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
}
// The system server has to run all of the time, so it needs to be
// as efficient as possible with its memory usage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
System.loadLibrary("android_servers");
init1(args);
}
public static final void init2() {
Log.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
}
从SystemServer的main函数开始启动各种服务:
首先启动init1,然后启动init2.从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。
这里我们主要来关注init2的过程。init2中启动ServerThread线程,ServerThread中启动了一系列的服务,比如这些:
ActivityManagerService
EntropyService
PowerManagerService
TelephonyRegistry
PackageManagerService
AccountManagerService
BatteryService
HardwareService
Watchdog
SensorService
BluetoothService
StatusBarService
ClipboardService
InputMethodManagerService
NetStatService
ConnectivityService
AccessibilityManagerService
NotificationManagerService
MountService
DeviceStorageMonitorService
LocationManagerService
SearchManagerService
FallbackCheckinService
WallpaperManagerService
AudioService
BackupManagerService
AppWidgetService
这些大大小小的服务起来以后,开始
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady()
在systemReady后开始开始启动Launcher。在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<categoryandroid:name="android.intent.category.HOME" />)来过滤。
然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。
我们现在希望从这里弹出我们自己定制的Launcher,同时也不希望弹出选择HOME的界面,我们不希望用户修改我们的home,比如我们的home上放了好多广告,以及强制安装的程序,不希望用户把它干掉。
我们可以通过这样来实现:
2) 定义一个私有的filter选项,然后用这个选项来过滤HOME.
一般情况下我们使用Manifest中定义的<categoryandroid:name="android.intent.category.HOME"来过滤的,我们现在增加一个私有的HOME_FIRST过滤。
在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码
//lixinso:添加CATEGORY_FS_HOME
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String CATEGORY_FS_HOME= "android.intent.category.FS_HOME";
3)修改和CATEGORY_HOME相关的所有的地方,都改成CATEGORY_FS_HOME,主要是framework中的这几个地方:使用grep命令查找要修改的地方:
grep CATEGORY_HOME -l * -R
将上述文件中和CATEGORY_HOME相关的所有的地方,都改成CATEGORY_FS_HOME。
4) 写一个自己的Launcher.
可以参考android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。
在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name="android.intent.category.HOME"
现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:
<application android:process="android.process.acore3"android:icon="@drawable/icon"android:label="@string/app_name">
<activity android:name=".FirstAppActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category. FS_HOME" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
</intent-filter>
</activity>
</application>
然后将编译好的apk放到方式fs100_root/system/app目录下。
5)将Android自带的Launcher删除掉
包括源代码(packages/apps/Launcher)和apk(/out/target/proct/generic/system/app/Launcher.apk)。
6) 重新编译Android
做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包,可以用mmm命令来编译部分的改动。这里需要这样编译:
$ source build/envsetup.sh
$ lunch
$ mmm frameworks/base
$ mmm frameworks/base/services/java
$ mmm frameworks/policies/base/mid
$ mmm frameworks/policies/base/phone
重新启动开发板,从开发板上就可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。
9)我们再验证一下,如果用户装上了一个其他的Launcher(Home)会怎么样。
从网上找一个一般的Launcher或者自己写一个一般的Launcher装上去,重新启动,不会出现选择界面。
按HOME键也不会出来两个HOME来选择。
这样我们就牢牢控制了用户的桌面。
只有我们自己定制的HOME才能装上。这对于定制Android设备的厂商很有用处。
Ⅳ 如何设置系统唯一的 launcher
定义一个私有的filter选项,然后用这个选项来过滤HOME.
一般情况下我们使用Manifest中定义的<category android:name="android.intent.category.HOME"来过滤的,
我们现在增加一个私有的HOME_FIRST过滤。
在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码
//lixinso:添加CATEGORY_HOME_FIRST
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST";
3)修改和CATEGORY_HOME相关的所有的地方,都改成HOME_FIRST,主要是framework中的这几个地方:
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中
//intent.addCategory(Intent.CATEGORY_HOME);
改成intent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso:
//if (r.intent.hasCategory(Intent.CATEGORY_HOME)) {
改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST
frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中
// _intent.hasCategory(Intent.CATEGORY_HOME) &&
改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST
frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中
//mHomeIntent.addCategory(Intent.CATEGORY_HOME);
改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso
frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中
//new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso
frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中
//mHomeIntent.addCategory(Intent.CATEGORY_HOME);
改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso
frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中
//ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso
4) 写一个自己的Launcher.
可以参考android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。
在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name="android.intent.category.HOME"
现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:
<application android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".FirstAppActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME_FIRST" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY" />
</intent-filter>
</activity>
</application>
然后将编译好的apk放到/out/target/proct/generic/system/app目录下。
5)将Android自带的Launcher删除掉,包括源代码(packages/apps/Launcher)和apk(/out/target/proct/generic/system/app/Launcher.apk)。
6)
做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包。
如果之前编译过了Android源码,可以用mmm命令来编译部分的改动。
这里需要这样编译:
$ . build/envsetup.sh
$ mmm frameworks/base
$ mmm frameworks/base/services/java
$ mmm frameworks/policies/base/mid
$ mmm frameworks/policies/base/phone
7)
编译完成后重新生成img文件。
$ make snod
8) 现在可以启动Android模拟器来看效果了。
首先设置环境变量:
$ export ANDROID_PRODUCT_OUT= ./out/target/proct/generic
然后切换到
$ cd ./out/host/linux-x86/bin
运行
$ ./emulator
这样我们启动的模拟器里面用的image就是我们刚才编译好的自己定制的东西了。
从模拟器上可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。
Ⅳ android 如何让应用程序在主菜单[launcher]程序列表分类显示在各个屏中
需要向launcher发送创建桌面快捷的广播,告诉android系统创建桌面图标。
具体实现方式:
1.要在手机桌面上添加快捷方式,首先需要在manifest中添加权限。
<!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- 移除快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 查询快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
2.添加快捷方式,是向桌面应用(launcher)发送相关action的广播,相关的action如下:public static final String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
3.调用以下代码:
private void addShortcut(String name) {
Intent addShortcutIntent = new Intent(ACTION_ADD_SHORTCUT);
// 不允许重复创建
addShortcutIntent.putExtra("plicate", false);// 经测试不是根据快捷方式的名字判断重复的
// 应该是根据快链的Intent来判断是否重复的,即Intent.EXTRA_SHORTCUT_INTENT字段的value
// 但是名称不同时,虽然有的手机系统会显示Toast提示重复,仍然会建立快链
// 屏幕上没有空间时会提示
// 注意:重复创建的行为MIUI和三星手机上不太一样,小米上似乎不能重复创建快捷方式
// 名字
addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
// 图标
addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(MainActivity.this,
R.drawable.ic_launcher));
// 设置关联程序
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
launcherIntent.setClass(MainActivity.this, MainActivity.class);
launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
addShortcutIntent
.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);
// 发送广播
sendBroadcast(addShortcutIntent);
}
4.如果要创建多个,只需要调用多次即可
Ⅵ Android O 默认打开设置launcher3界面所有的APP图标LOGO形状的选项
这个选项在开发者模式打开后,会显示出来。
想要默认显示出来
在alps\packages\apps\Launcher3\src\com\android\launcher3\graphics\IconShapeOverride.java
中的isSupported()方法中添加
就可以实现。
如果想要修改默认的形状在IconShapeOverride.java中的
方法中修改。
根据config.xml中的值
可修改默认想要的形状。
Ⅶ android可以自己开发一个launcher,并且替换掉系统的吗
可以,但是不建议这么做,开发的laucher的和系统的其他app兼容性需要考虑。
开发一个laucher:在你的app的androidmanifest.xml中定义<category android:name="android.intent.category.LAUNCHER" />
删除系统的laucher:需要获得root权限,建议保留,因为充满很多危险。
默认:开发的launcher设置默认就好了。
安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher
Ⅷ android 如何默认launcher
楼主说的有点不清楚哦~
你是说设定某个桌面启动器程序为默认值吗?首先,按主屏键,出现“使用以下程序打开”,然后勾选下面的“将此程序设定为默认值”,再点击你所要选择的桌面,设置完毕。
如果你要取消默认设置,请依次进入 设定》应用程序》找到你之前设置默认的那个桌面程序并点击进入》找到“清除默认设置”,并点击即可。
注意:桌面程序的选择菜单(即是【使用以下程序打开】的菜单)只有在同时安装了多个桌面程序才会出现。
下次记住要写清楚问题描述哦~~
Ⅸ android tv 模拟器默认桌面修改 Alternate Launcher开机自动启动app
搞了个android tv盒子,想修改默认的launcher桌面,网上搜了好几天,没有成功。即使设置了如下默认开机launcher在android tv系统中也不会出来选择开启哪个launcher的选择框,可能android tv 系统跟android 系统还不太一样啊。
于是乎就在网上到处搜方法,还真搜到了一个在模拟器上成功替换默认桌面的方法。
我的模拟器android 版本是 api level 26 应该是android tv 8.0
呃,要进行替换首先模拟器上要有root权限。但是因为android 7.0之后的模拟器都默认没有root权限了。需要这样再命令行启动模拟器。找到自己的模拟器目录:
模拟器起来后,执行adb shell,提示符是$,表示没有root权限,然后su,提示符变成#,获取到root权限。
执行 pm disable-user --user 0 com.google.android.tvlauncher ,禁用google默认的android tv 桌面。执行之前一定要先安装自己的有 android.intent.category.HOME android.intent.category.LAUNCHER android.intent.category.DEFAULT 的app 哦
之后冷重新启动模拟器,你就会发现开机后的桌面变成了自己的app啦。
有空试试我的android tv 机顶盒,看看行不行。
关于不同android tv 版本禁用 google默认 launcher的命令如下,自己多试试,版本对应不一定对,原帖地址是: Alternate Launcher (No Root) on Marshmallow, Nougat, Oreo, Pie Info ,为了方便我把内容转过来:
呃。。。。恢复原有桌面。。。。