2015-01-16 22:27:46 yinhaide 阅读数 5537

上一篇博客已经完成了Android源码的编译工作,我们来看下源码目录(我的源码为三方移植包,所以目录会多了一点)

其中,package/app目录下放着我们的系统应用,也就是我们手机中出厂自带的,不能卸载掉的应用。其实是可以卸载掉的,具体操作请看我的博客。


现在我们要自己写系统应用,我就拿已经写好的来分析


分析:系统应用是没有eclipse下一下这些目录的,也就是该包不能在eclipse下打开,在编译该包是才会生成相应的R.java文件


其次,一个核心文件是:Android.mk文件,代码如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files) 
# LOCAL_SRC_FILES := $(call all-java-files-under, src)
# Also link against our own custom library.
# LOCAL_JAVA_LIBRARIES := framework	
LOCAL_PACKAGE_NAME := 
LOCAL_JNI_SHARED_LIBRARIES := librockchip_update_jni
LOCAL_REQUIRED_MODULES := librockchip_update_jni
LOCAL_STATIC_JAVA_LIBRARIES += ftp4j-1.7.2
#LOCAL_CERTIFICATE := media
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
include $(CLEAR_VARS) 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := ftp4j-1.7.2:/libs/ftp4j-1.7.2.jar
include $(BUILD_MULTI_PREBUILT)
# ============================================================
# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))
因为涉及到jni调用库文件,所以相对复杂了点,假如没有jni调用的话,我们的结构如下,读者可以作对比:

LOCAL_PATH:= $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_MODULE_TAGS := optional 
LOCAL_SRC_FILES :=$(call all-java-files-under, src)  
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4  
#  将编译生成RKUpdateService.apk文件  
LOCAL_PACKAGE_NAME := RKUpdateService 
LOCAL_CERTIFICATE := platform 
include $(BUILD_PACKAGE) 

Android.mk文件的大多数内容都是标准的写法,只有下面两行代码需要了解一下。

LOCAL_PACKAGE_NAME := RKUpdateService 
LOCAL_CERTIFICATE := platform 

     其中第一行需要根据不同的Android系统应用进行修改。系统会根据LOCAL_PACKAGE_ NAME变量的值生成APK文件,例如,本例该变量的值是FirstSystemApp,所以会在out/target/product/ maguro/system/app目录生成FirstSystemApp.apk文件,如果Android设备已经获取了root权限,直接将该文件使用adb push命令上传到/system/app目录即可。如果Android设备没有root权限,就只能通过刷机的方式安装系统应用了。要注意的是FirstSystemApp.apk不能通过普通应用的方式进行安装。LOCAL_CERTIFICATE变量表示签名类型,系统应用通常设为platform,表示Platform签名。

 以下是具体的编译流程
1:用文本编辑器编辑工程RKUpdateService(不能用eclipse)。
2:将工程导入rk3188_4.2_qnb01\packages\apps中。
3:退出到根rk3188目录执行:source build/envsetup.sh
4:执行lunch 然后选择9
5:mmm  packages/apps/RKUpdateService/ 将在rk3188_4.2_qnb01/out/target/product/rk30sdk/system/app下生成RKUpdateService.apk
6:删掉rk3188_4.2_qnb01\packages\apps\RKUpdateService

到此即可结束,自己写的系统APK已经写到系统里面了,make了整个工程之后会写到system.img中,以下步奏读者可不理会,只是写给自己的。
7:将rk3188_4.2_qnb01/out/target/product/rk30sdk/system/app/RKUpdateService.apk复制到rk188_4.2_qnb01\device\rockchip\common\app\apk\RKUpdateService(不确定是否必须)。
8:make -j16
9:./mkimage.sh ota打包



2018-02-04 16:10:27 u010784887 阅读数 1185

Android 应用程序主要由 PackageMangerService 来管理, 包括 apk 安装, 卸载, 以及查询;

开机启动—-加载 Apk 等资源
PackageMangerService 会在手机启动的时候扫描手里里所有 apk (包括 jar, aar),

apk, jar, aar 本质上都是压缩包, 里面包含了App 运行需要组件和数据.

PackageMangerService 会把这些包的信息读取出来加载在内存中, 这样系统运行的时候就能很快的找到每个应用和组件的信息;

这个过程中其实还会优化资源, 比如将 App 文件的优化:

Android 5.0 之前: dex 转化成 odex,
Android 5.0 之后: dex 转化为oat;

开机完成—-提供安装卸载和查询功能
App 分类: 系统应用 和 普通应用
系统应用:
位于/system/app/ 或者 /system/priv-app/ 目录下;
其中 /system/priv-app/ 目录是 Android 4.4 开始出现的目录, 该目录存放一些系统底层App, 如: Settings, SystemUI 等.
/system/app/ 存放的是常用的系统应用, 如: Phone, Contacts, Camera 等;

系统应用不能删除,只能升级.

普通应用
位于/data/app/

2019-05-28 16:33:35 qq_18420641 阅读数 253

真机连接下打开命令行输入:adb shell 进入shell模式,输入:logcat | grep ActivityManager,可以实时查看当前正在运行的Activity。

这个可以实时查看app进程变化,如上图 我们打开系统的资源管理器 ,会出现 com.android.rk/.RockExplorer    =====com.android.rk为当前应用的进程RockExplorer   为当前启动的Activity的名称 

PackageManager packageManager = MainActivity.this.getPackageManager();

Intent it= packageManager.getLaunchIntentForPackage("com.android.rk");
startActivity(it);

即可启动

 

2017-03-10 13:41:59 xuhang1993 阅读数 6432

今天给app添加权限,当用户禁止后会弹出alert提示用户,咱们这个app需要这个权限 没这个权限app的一些功能就不能使了,但用户已经关了 也不知道在哪打开 所以加个去设置的按钮 点击然后跳到系统应用管理 设置权限

 Intent intent =  new Intent();
 intent.setAction("android.intent.action.MAIN");
 intent.setClassName("com.android.settings", "com.android.settings.ManageApplications");
 startActivity(intent);

权限管理:

Intent intent = new Intent();                                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
intent.setData(uri);
startActivity(intent);

这样就OK了.

2013-03-20 10:46:50 twlkyao 阅读数 745

AndroidManifest.xml

      AndroidManifest.xml是Android应用的描述文件,它描述了该应用的相关信息,主要包括以下各个元素。

包名(package)

      指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生程序包将以此命名。本包名应当在Android系统运行时唯一。

认证(certificate)

      指定本应用程序所授予的信任级别,目前有的认证级别有platform(system)、shared、media以及应用自定义的认证。不同的认证可以享受不同的权限。

权限组(permission-group)

      权限组的定义是为了描述一组具有共同特性的权限。Android系统中预订了一些组,它们是:

·         android.permission-group.COST_MONEY

·         android.permission-group.MESSAGES

·         android.permission-group.MESSAGES

·         android.permission-group.PERSONAL_INFO

·         android.permission-group.LOCATION

·         android.permission-group.NETWORK

·         android.permission-group.ACCOUNTS

·         android.permission-group.HARDWARE_CONTROLS

·         android.permission-group.PHONE_CALLS

·         android.permission-group.SYSTEM_TOOLS

·         android.permission-group.DEVELOPMENT_TOOLS

      从字面意思我们就可以理解每个组的特性。具体含义可以参考SDK文档。

权限(permission)

      权限用来描述是否拥有做某件事的权力。Android系统中权限是分级的,前分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。

      系统中所有预定义的权限根据作用的不同,分别属于不同的级别。

      对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用拥有platform级别的认证才能申请。

      当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。

      系统应用可以使用任何权限。权限的声明者可无条件使用该权限。

      目前Android系统定义了许多权限,通过SDK文档用户可以查询到哪些操作需要哪些权限,然后按需申请。

权限树(permission-tree)

      权限树的设置是为了统一管理一组权限,声明于该树下的权限所有者归属该应用。系统提供了API,应用可以在运行时动态添加。
    Ø PackageManager.addPermission()
 

应用安装

      Android系统中,安装应用时不能指定安装目录,所有的应用都只能装在预置文件夹下。

      Android系统支持数种安装方式,而播思通讯的Ophone平台在此基础上支持更多方式。

<使用预置安装工具

      Android系统中,应用安装包.apk文件属于默认支持的文件类型,它的的mime type被定义为"application/vnd.android.package-archive"。

      系统内置了安装工具来解析并安装.apk文件。你可以从OPhone平台的文件管理器中找到对应安装包,点击即可启动安装步骤。这里给出了相应的代码,有兴趣的开发者可以尝试使用。

view plaincopy to clipboardprint?

1.   Intent apkintent = new Intent(Intent.ACTION_VIEW); final Uri puri = Uri.fromFile(new File(path)); //path is the path of source apk apkintent.setDataAndType(puri, "application/vnd.android.package-archive"); startActivity(apkintent);  

 

使用API安装

      Android系统提供了安装应用的API:PackageManager.installPackage(final Uri packageURI, 
     final IPackageInstallObserver observer, final int flags); 

·         uri给出了原文件的地址

·         observer实现了回调函数packageInstalled(final String packageArchiveName, final int returnCode) 以检查安装是否成功

·         flags提供安装标识。Android平台提供的标识有: 

1.PackageManager.FORWARD_LOCK_PACKAGE = 0x00000001
标识本应用属于受限应用,应用将会被安装到保护目录,只有该应用可以访问代码段和不属于resource的asset资源。
2.PackageManager.REPLACE_EXISTING_PACKAGE = 0x00000002;
应用如已存在,则先删除再安装。
3.PackageManager.SDCARD_PACKAGE = 0x00000004;

 

      由OPhone平台扩展,标识该应用安装目录为存储卡,默认为data分区。

      因为手机中data分区大小有限,因此OPhone平台默认将应用装到存储卡上。

      本API需要"android.permission.INSTALL_PACKAGES"权限,该权限属于签名级别,因此只有系统级别的应用程序才能使用。

拷贝即安装

      Android支持拷贝即安装的方式,即将安装包拷贝到预置安装目录即可自动安装,但所有的预置目录对于用户不可见。

      OPhone平台扩展后,用户可将安装包拷入存储卡的app目录下,系统将监控该文件夹,检测到新的安装文件后自动安装。

      这种方式适合一次安装大量应用,但是也有坏处。一是无法知道哪些应用安装成功,哪些安装失败, 二是安装失败的应用将会作为垃圾存放在预置目录中,在系统启动时延长启动时间,三是过多的应用可能将data分区的空间占用过多,影响系统的正常使用。

安装步骤

·         解析安装包是否合法,如果合法即加载应用,如果非法即放弃安装

·         取出代码段,放入/data/dalvik-cache目录

·         建立/data/data/包名的文件夹,以存放用户数据

·         将安装包携带的lib放入/data/data/包名/lib中

·         以上步骤完成后将安装包拷到安装目录

·         加载该应用信息 

应用卸载

      Android系统同样支持多种卸载方式。

      使用预置卸载工具

      系统内置了卸载工具。这里给出了启动代码,执行后即可看到卸载步骤:

view plaincopy to clipboardprint?

1.    Uri packageURI = Uri.parse("package:"+packageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); startActivity(uninstallIntent);  

 

使用API卸载

      Android提供了卸载应用的标准API:PackageManager().deletePackage(String packageName, IPackageDeleteObserver observer, int flags);

1.     observer实现了回调函数packageDeleted(boolean succeeded)以检查卸载是否成功

2.     flags提供卸载标识。Android平台提供的标识有

      PackageManager.DONT_DELETE_DATA = 0x00000001;
      标识卸载时是否同时删除用户数据。 

      本API需要"android.permission.DELETE_PACKAGES"权限,该权限属于签名级别,因此只有系统级别的应用程序才能使用。

删除即卸载

      对应于拷贝即安装,系统同样支持删除即卸载功能。当用户删除/sdcard/app目录下安装包时,系统将自动检测到删除事件并卸载对应应用。
      本方法适合一次删除大量应用。

卸载步骤

·         删除代码段

·         如果需要删除用户数据,则删除

·         建立/data/data/包名的文件夹,以存放用户数据

·         删除应用信息

·         删除安装包

 

应用使用

      应用安装后即处于可用状态。对于系统中所有应用,从管理层面分为信息管理和应用调度两部分;从应用自身角度分为去激活与激活两种状态。

原文地址:点击打开链接

Android管理篇

阅读数 1556

没有更多推荐了,返回首页