Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1318531
  • 博文数量: 478
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4833
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-28 11:12
文章分类

全部博文(478)

文章存档

2019年(1)

2018年(27)

2017年(21)

2016年(171)

2015年(258)

我的朋友

分类: Android平台

2015-07-01 18:05:43

修改权限:
$(shell chmod -R a+w $(LOCAL_PATH))


include $(CLEAR_VARS)
# Module name should match apk name to be installed.
LOCAL_MODULE := LSF-Device-Phone-RoW
LOCAL_SRC_FILES := LSF-Device-Phone-RoW/$(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)




=================MTK集成参考===
[DESCRIPTION]


1, 如何将带源码的 APK 预置进系统?
2, 如何将无源码的APK预置进系统?
3, 如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复?
4, 如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?
[SOLUTION]


 


一、如何将带源码的APK预置进系统?


1)     在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例
2)     将 Test APK的Source code 拷贝到 Test 文件夹下,删除 /bin 和 /gen 目录
3)     在 Test 目录下创建一个名为 Android.mk的文件,内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)


LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Test
include $(BUILD_PACKAGE)
4)     打开文件 device\mediatek\common\device.mk
将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
5)     重新 build 整个工程


 


二、如何将无源码的 APK 预置进系统?
1)     在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
2)     将 Test.apk 放到 packages/apps/Test 下面
3)     在  packages/apps/Test 下面创建文件 Android.mk,文件内容如下:


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


# Module name should match apk name to be installed


LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS:= \
@lib/armeabi/libtest.so  \
@lib/armeabi/libtest2.so
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)


若无so,删除LOCAL_PREBUILT_JNI_LIBS
若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径,不要忘记使用@。@标识符会将apk中的so抽离出来build进system/lib或者system/lib64中
若apk支持不同cpu类型的so,针对so的部分的处理:


Ifeq ($(TARGET_ARCH),arm)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v7a/xxx.so\
@ lib/armeabi-v7a/xxxx.so
else ifeq ($(TARGET_ARCH),x86)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/x86/xxx.so
else ifeq ($(TARGET_ARCH),arm64)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v8a/xxx.so

即将和TARGET_ARCH对应的so抽离出来
4)     打开文件 device\mediatek\common\device.mk
 将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
5)     重新 build 整个工程
注:如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。
修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。


 
三、如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复?
1)     在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
2)     将 Test.apk 放到 packages/apps/Test 下面
3)     在  packages/apps/Test 下面创建文件 Android.mk,文件内容如下:


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


# Module name should match apk name to be installed


LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
# LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
include $(BUILD_PREBUILT)
4)     打开文件 device\mediatek\common\device.mk
 将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
5)     重新 build 整个工程
注意:这个比不能卸载的多了一句
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 


四、如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?


1在 vendor\mediatek\proprietary\binary\3rd-party\free下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
2 将Test.apk 放入vendor\mediatek\proprietary\binary\3rd-party\free\Test下面
3 在vendor\mediatek\proprietary\binary\3rd-party\free\Test 下面创建文件 Android.mk,文件内容如下


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


# Module name should match apk name to be installed


LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
include $(BUILD_PREBUILT)


2 打开文件device\mediatek\common\device.mk
将 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
3 然后重新build整个工程


 


请注意:


若需要apk作为32bit的apk运行,则需要在Android.mk中定义


LOCAL_MULTILIB :=32


======================================================================================================================================================================================================


在某个应用里加入这句话,可以指明不生成某个apk:
LOCAL_OVERRIDES_PACKAGES := Music






=====================================================


Android.mk的一些规范(红色是我觉得必须加的)


一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。




1.LOCAL_PATH := $(call my-dir) 


  $(call 目录,目录….) 目录引入操作符,如该目录下有个文件夹名称 src,则可以这样写 $(call src),那么就会得到 src 目录的完整路径


一个Android.mk file首先必须定义好LOCAL_PATH变量。这个变量不会被$(CLEAR_VARS)清除,它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。




2.include $( CLEAR_VARS)


CLEAR_VARS 由编译系统提供(CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk),在 build/core/config.mk 定义 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk, 通过include 包含自定义的.mk文件(即是自定义编译规则)或是引用系统其他的.mk文件(系统定义的编译规则),指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。




3.LOCAL_MODULE :=


LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包 含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'HcSyncml'的共享库模块,将会生成'libHcSyncml.so'文件。




4.LOCAL_C_INCLUDES := $(LOCAL_PATH)/extra_inc$(LOCAL_PATH)/main_inc


LOCAL_C_INCLUDES 中加入所需要包含的头文件路径


LOCAL_STATIC_LIBRARIES :=


LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名 称, 应该链接到这个模块的静态库列表(使用BUILD_STATIC_LIBRARY 生成),这仅仅对共享库模块才有意义。


LOCAL_SHARED_LIBRARIES :=


LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称, 这个模块在运行时要依赖的共享库模块列表,在链接时需要,在生成文件时嵌入的相应的信息。注意:这不会附加列出的模块到编译图,也就是仍然需要在 Application.mk 中把它们添加到程序要求的模块中。


LOCAL_JAVA_LIBRARIES     加入jar包


 


5.LOCAL_SRC_FILES :=


LOCAL_SRC_FILES中加入源文件路径(需要编译的文件),多个文件用 ‘\’ 隔开. 如果编译目录子目录,采用相对路径,如子目录/文件名。也可以通过$(call 目录),指明编译某目录下所有.c/.cpp/.java/.S/ .aidl文件.追加文件 LOCAL_SRC_FILES += 文件


LOCAL_CPP_EXTENSION: 这是一个可选变量,用来指定C++代码文件的扩展名,默认是'.cpp',但是你可以改变它


LOCAL_PACKAGE_NAME := Java 应用程序的名字用该变量定义


6、LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib –llog


表示允许打印Log


7. include $(BUILD_EXECUTABLE)


BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译


BUILD_STATIC_LIBRARY表示编译一个静态库,


BUILD_SHARED_LIBRARY表示编译一个共享库


BUILD_PREBUILT


BUILD_HOST_STATIC_LIBRARY


BUILD_HOST_SHARED_LIBRARY


BUILD_HOST_EXECUTABLE


BUILD_HOST_PREBUILT


BUILD_RAW_STATIC_LIBRARY


BUILD_RAW_EXECUTABLE


BUILD_MULTI_PREBUILT


BUILD_JAVA_LIBRARY


BUILD_PACKAGE


BUILD_DROIDDOC


BUILD_COPY_HEADERS


BUILD_KEY_CHAR_MAP


BUILD_STATIC_JAVA_LIBRARY 编译静态JAVA库


BUILD_HOST_JAVA_LIBRARY 编译本机用的JAVA库




8. TARGET_ARCH:=


目标 CPU平台的名字,  和 android 开放源码中指定的那样。如果是
arm,表示要生成 ARM 兼容的指令,与 CPU架构的修订版无关。


9. TARGET_PLATFORM:=


Android.mk 解析的时候,目标 Android 平台的名字.




10. TARGET_ARCH_ABI:=


暂时只支持两个 value,armeabi 和 armeabi-v7a。在
现在的版本中一般把这两个值简单的定义为 arm, 通过 android  平台内部对它重定义来获得更好的匹配。其他的 ABI 将在以后的 NDK 版本中介绍,它们会有不同的名字。注意所有基于ARM 的 ABI都会把 'TARGET_ARCH'定义成‘arm’, 但是会有不同的‘TARGET_ARCH_ABI’。




11. TARGET_ABI:=


目标平台和 ABI 的组合,它事实上被定义成
$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)  ,在想要在真实的设备中针对一个特别的目标系统进行测试时,会有用。在默认的情况下,它会是'android-3-arm'。




12. LOCAL_CFLAGS: =


可选的编译器选项,在编译 C 代码文件的时候使用。这可能是有用的,指定一个附加的包含路径(相对于 NDK的顶层目录),宏定义,或者编译选项。


LOCAL_CXXFLAGS:  与 LOCAL_CFLAGS 相同,针对 C++源文件。


LOCAL_CPPFLAGS:  与 LOCAL_CFLAGS 相同,但是对 C 和 C++ source files都适用。




13. LOCAL_LDLIBS: =


译模块时要使用的附加的链接器选项。这对于使用‘-l’前缀传递指定库的名字是有用的。




14. LOCAL_ALLOW_UNDEFINED_SYMBOLS:=


默认情况下, 在试图编译一个共享库时,任何未定义的引用将导致一个“未定义的符号”错误。这对于在源代码文件中捕捉错误会有很大的帮助。然而,如果因为某些原因,需要不启动这项检查,可把这个变量设为‘true’。注意相应的共享库可能在运行时加载失败。(这个一般尽量不要去设为 true)。




15. LOCAL_ARM_MODE:=


默认情况下, arm目标二进制会以 thumb 的形式生成(16 位),你可以通过设置这个变量为 arm如果你希望你的 module 是以 32 位指令的形式。


通过设定编译器操作,优化级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高




16. 另外, 在 Android.mk 文件中, 还可以指定最后的目标安装路径, 用 LOCAL_MODULE_PATH和 LOCAL_UNSTRIPPED_PATH 来指定。不同的文件系统路径用以下的宏进行选择:


TARGET_ROOT_OUT:表示根文件系统。
   TARGET_OUT:表示 system文件系统。
   TARGET_OUT_DATA:表示 data文件系统。




17. LOCAL_PRELINK_MODULE


 Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。程序运行时的动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接动作都是完全相同的,对于嵌入式系统来说尤其如此。因此,这一过程可以改在运行时之前就可以预先处理好,即花一些时间利用Prelink工具对动态共享库和可执行文件进行处理,修改这些二进制文件并加入相应的重定位等信息,节约了本来在程序启动时的比较耗时的查询函数地址等工作,这样可以减少程序启动的时间,同时也减少了内存的耗用。Prelink的这种做法当然也有代价:每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保证有效,因为新的共享库中的符号信息、地址等很可能与原来的已经不同了,这就是为什么 android framework代码一改动,这时候就会导致相关的应用程序重新被编译。


这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度,不过好在对用户来说几乎是可以忽略的。


默认是需要prlink的,同时需要在 build/core/prelink-linux-arm.map 中加入
        libhellod.so      0x96000000


这个map文件好像是制定动态库的地址的,在前面注释上面有一些地址范围的信息,注意库与库之间的间隔数,如果指定不好的话编译的时候会提示说地址空间冲突的问题。另外,注意排序,这里要把数大的放到前面去,按照大小降序排序。






模板:


(1)编译应用程序的模板:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := main.c LOCAL_MODULE := test_exe #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE)




(2)编译静态库的模板:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY)




(3)编译动态库的模板:


 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := helloworld.c LOCAL_MODULE := libtest_shared TARGET_PRELINK_MODULES := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY)




=========================================================
阅读(5197) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~