1、 开发环境
ubuntu版本:18.04
开发平台:RK356x
Android版本:android11
2、目的
android11 系统自带了一个启动器Launcher3,在android源码路径下的packages/apps/Launcher3下,现需要将我们自己开发的Launcher放到android源码上,让系统启动的时候自动运行我们的Launcher,从而达到想要的效果。
3、方法
1.在源码android\vendor\rockchip\common\apps\路径下新建一个目录hybLauncher
2. 将hybLauncher.apk软件包拷贝进去到hybLauncher文件夹中(文件夹名和apk的名需要一样)
3.在hybLauncher文件夹中新建一个Android.mk文件(相当于linux下的Makefile文件)
Android.mk内容如下,(可以参考一下apps目录下的其他程序Android.mk)
###############################################################################
# hybLauncher
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hybLauncher
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)
4. 修改apps目录下的app.mk文件
PRODUCT_PACKAGES += \
ComAssistant \
DoubleCameraTest \
GPSTest \
Presentation \
RpGpio \
TDGPSTest \
+ hybLauncher
PRODUCT_PACKAGES += \
RKUpdateService
完成了以上四步后,重新编译,在Android系统启动后,在应用桌面上就应该可以查看得到了。如果想将hybLauncher程序变成默认桌面启动项,可以完成以下操作
源码路径:android\frameworks\base\core\java\com\android\internal\app\ResolverActivity.java
protected void onCreate(Bundle savedInstanceState, Intent intent,
CharSequence title, int defaultTitleRes, Intent[] initialIntents,
List<ResolveInfo> rList, boolean supportsAlwaysUseOption) {
setTheme(appliedThemeResId());
super.onCreate(savedInstanceState);
if (mResolvingHome)
{
setDefaultLauncher();
finish();
return;
}
//省略......
}
private void setDefaultLauncher() {
try {
final PackageManager pm = getPackageManager();
String defPackageName = "包名";
String defClassName = "类名";
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> list = new ArrayList<ResolveInfo>();
list = pm.queryIntentActivities(intent, 0);
final int N = list.size();
ComponentName[] set = new ComponentName[N];
int bestMatch = 0;
for (int i = 0; i < N; i++) {
ResolveInfo r = list.get(i);
set[i] = new ComponentName(r.activityInfo.packageName,
r.activityInfo.name);
if (r.match > bestMatch)
bestMatch = r.match;
}
ComponentName preActivity = new ComponentName(defPackageName, defClassName);
pm.addPreferredActivity(filter, bestMatch, set, preActivity);
} catch (Exception e) {
e.printStackTrace();
}
}
完成上述步骤后,重新编译,系统启动后就会自动启动hybLauncher。
4、扩展
软件包:7-zip.exe和AXMLPrinter2.jar
如果只有apk软件包,需要得到该apt中的packagename和classname的话,需要下载7-Zip.exe来打开apt并且提取里面的文件内容。
需注意的是AndroidManifest.xml文件,打开该文件是乱码,需要通过反编译出来。
在window上按下window键+R
###进入到AndroidManifest.xml所在的目录#######
C:\Users\Administrator>cd Desktop
C:\Users\Administrator\Desktop>java -jar AXMLPrinter2.jar AndroidManifest.xml
java -jar AXMLPrinter2.jar AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.screen.hybLauncher"
>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16"
>
</uses-sdk>
<application
android:theme="@7F060001"
android:label="@7F050000"
android:icon="@7F020000"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:launchMode="2"
>
<activity
android:label="@7F050000"
android:name="com.screen.hybLauncher.HomeScreen"
android:excludeFromRecents="true"
android:launchMode="2"
android:screenOrientation="5"
>
<intent-filter
>
<action
android:name="android.intent.action.MAIN"
>
</action>
<category
android:name="android.intent.category.HOME"
>
</category>
<category
android:name="android.intent.category.DEFAULT"
>
</category>
</intent-filter>
</activity>
</application>
</manifest>
从上述可以得到包名和类名
package="com.screen.hybLauncher"
android:name="com.screen.hybLauncher.HomeScreen"