1、应用设置
在应用的AndroidManifest.xml文件中的作为Home界面的Activity的intent-filter节点中添加如下代码:
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
2、打包设置
将应用打包成build版本,将apk复制到/system/priv-app/应用名称的文件夹/中,查看apk中有没有so文件,如果有,将so文件复制到/system/lib/中,并在apk同级目录中新建/lib/arm/文件夹,创建刚刚导入os文件的软链接。
3、修改源代码
frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
3.1 在ResolveListAdapter中添加getDefaultHomePosition(String packageName)方法,用于获取默认home app在List<DisplayResolveInfo> 中的位置,代码如下:
3.2 在ResolverActivity中添加设置默认app的方法setupDefaultLauncher(),代码如下:
//用于记录默认home app是否设置过
private static final String DEFAULT_HOME = " home app包名";
private void setupDefaultLauncher() {
String first = "";
try{
first = SystemProperties.get(DEFAULT_HOME);
}catch(Exception e){
Log.w(TAG,"exception error get DEFAULT_HOME");
}
//判断默认home 是否设置过,如果获取的字符串为空代表,未设置,否则return不在进行设置
if (!TextUtils.isEmpty(first)) {
return;
}
//使用包名获取所需设置的默认home app在ResolveListAdapter中的位置
int position = mAdapter.getDefaultHomePosition("home app包名");
//如果不存在则return
if (position == -1) {
if (DEBUG)
Log.w(TAG,"not find default Home");
return;
}
//设置默认home app后,则添加记录
try{
SystemProperties.set(DEFAULT_HOME,DEFAULT_HOME);
}catch(Exception e){
Log.w(TAG,"exception error set DEFAULT_HOME");
}
//设置默认home app,并跳转
startSelected(position, true, true);
//结束此activity
dismiss();
}
3.3 为了保证mAdapter被初始化 setupDefaultLauncher()的调用添加到ResolverActivity的onCreate函数中,代码如下:
int count = mAdapter.mList.size();
//添加的代码
setupDefaultLauncher();
//原有逻辑
//如果系统中home app大于1
if (count > 1 || (count == 1 && mAdapter.getOtherProfile() != null)) {
//初始化代码
.........
//如果home app等于1则设置唯一的home app为Home
} else if (count == 1) {
........
}
4 编译framework代码
$cd framework/base
$mm
执行如下命令:
$adb remount
$adb push framework-res.apk /system/framework/
$adb push framework.jar /system/framework/
$adb push services.jar /system/framework/ (如果有修改的话)
以命令
注意:有的系统编译framework后还生成了secondary_framework.jar,也需要push。
5 运行
make snod生成新的system.img,然后使用adb进行刷机。
6 需要注意的问题:
6.1 Android应用里面通过gradle引用的第三方库中如果含有so库,也需要将这些文件拷贝到/system/lib文件中
6.2 可以使用git Bush查看so文件是32位还是64位,决定放进/system/lib还是/system/lib64中,命令为file *
6.3 查看应用中使用到的so文件可以通过解压apk文件,查看里面的libs文件夹中的文件。