android不将apk包编译到系统里的方法
来源:互联网 发布:mysql显示前n行记录 编辑:程序博客网 时间:2024/04/30 00:00
转自http://blog.csdn.net/ydt_lwj/article/details/7767110
Andriod默认情况下将java代码编译成apk包后都会安装到/system/app目录下,因为system目录最终会打包成system.img文件,即Android的文件系统。在Android里一个java都是以一个apk的形式存在,在系统编译时,Androd会根据每个应用的mk文件里的LOCAL_MODULE_TAGS这个变量的值来决定这个应用是否会编译到系统里,通常情况下
LOCAL_MODULE_TAGS变量的值有user optional debug eng tests samples这几个值,在2.2里如果LOCAL_MODULE_TAGS变量的值为user那么系统直接就会将这个应用的apk安装到systm/app目录下,但是在2.3里将这个变量的值赋值为user系统会做一个处理,会根据LOCAL_MODULE的值于GRANDFATHERED_USER_MODULES变量的值进行比较,
如果LOCAL_MODULE变量的值在GRANDFATHERED_USER_MODULES变量里没有那么系统就会报错,默认情况下userdebug eng 都会被编译到系统里optional会根据要编译的模块是否在PRODUCT_PACKAGES这个变量中,如果在就会编译到系统里,如果没有那么就不会被编译到系统里,tests会根据编译的版本的vatiant来决定是否编译到系统里,而samples只是一个例子一般都不会被编译到系统里的。在Android里只有几个samples是可以被编译到系统里的,但是默认情况是没有被编译的。
但是在android系统里java应用如果生成了apk包就会被安装到system/app目录下,然后打包成系统的镜像文件,如果我们想把java的应用编译生成apk包,而且不将启安装到system/app目录下,默认的android系统是没有这个编译功能的,默认情况下java应用的代码都会被系统编译的,但是如果LOCAL_MODULE_TAGS这个变量的值设置的不对,那么系统只会对代码进行编译而不会生成apk包,生成apk包就会被安装到system/app目录下准备打包成系统文件,要想将java应用编译生成apk包而且不被编译到系统里那么我们就等修改该Android系统的Makefile文件系统,详细思路不在这里介绍了,这里只介绍一下怎么修改Andriod系统的Makefile来实现将java编译成apk并不会被安装到系统目录下而是安装到制定的目录下。
方法一:
给LOCAL_MODULE_TAGS这个变量设置一个系统已有以为的其他的值,这里赋值为tmp
修改base_rules.mk文件,在这个文件里的找道
- ifeq($(LOCAL_MODULE_PATH),)
- LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS))
- ifeq($(strip $(LOCAL_MODULE_PATH)),)
- $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS
- “$(LOCAL_MODULE_CLASS)”)
- endif
- endif
在这里添加几行代码,添加的代码如下:
- ifeq($(LOCAL_MODULE_PATH),)
- ifeq($(filter tmp,$(LOCAL_MODULE_TAGS)),tmp)
- LOCAL_INSTALLED_TMP :=$(PRODUCT_OUT/tmp)
- endif
- ifeq($(filter tmp,$(LOCAL_MODULE_TAGS)),)
- LOCAL_INSTALLED_TMP :=
- endif
- ifdef LOCAL_INSTALLED_TMP
- LOCAL_MODULE_PATH := $(LOCAL_INSTALLED_TMP)
- else
- LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS))
- endif
- ifeq($(strip $(LOCAL_MODULE_PATH)),)
- $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS
- “$(LOCAL_MODULE_CLASS)”)
- endif
- endif
这样就可以将java编译生成的apk包安装到制定的目录下,这里的目录是
$(PRODUCT_OUT)/tmp目录,但是这种方法需要将java应用的mk文件里的
LOCAL_PACKAGE_NAME变量定义的包名添加到系统的PRODUCT_PACKAGES这个变量中,如果PRODUCT_PACKAGES这个变量里没有你要编译的java应用的包名,那么系统还是只会对代码进行编译而不会生成apk包。那么怎么样不用将要编译的应用的包名不添加到PRODUCT_PACKAGES这个变量中也能生成apk包并安装到制定的目录下呢,见方法二。
方法二:
先完成方法一,然后在修改main.mk文件找到
- user_MODULES:= $(sort $(call get-tagged-modules,user))
在这行的代码后面添加一行代码,代码如下:
- tmp_MODULES:= $(sort $(call get-tagged-modules,tmp))
然后将将刚刚定义的tmp_MODULES变量赋给user_MODULES变量,在原有的代码
- user_MODULES := $(user_MODULES)$(user_PACKAGES)
后边将即可.
- user_MODULES:= $(user_MODULES) $(user_PACKAGES) $(tmp_MODULES)
这种方法不用将应用的包名添加到PRODUCT_PACKAGES变量里。
还有一种方法也不用将要编译的包名添加给PRODUCT_PACKAGES变量,也能将其进行编译并生成apk包安装到指定的目录下
方法三:
还是先完成就方法一,然后修改main.mk文件,找到
- ifeq($(TARGET_BUILD_VARIANT),eng)
- tags_to_install:= user debug eng
- …..
- endif
将自己定义的LOCAL_MODULE_TAGS变量的值tmp赋值给变量tags_to_install即可,赋值后的代码:
- tags_to_install:= user debug eng tmp
找到
- user_MODULES:= $(sort $(call get-tagged-modules,user))
在这行的代码后面添加一行代码,代码如下:
- tmp_MODULES:= $(sort $(call get-tagged-modules,tmp))
总结:上面的三种方法都可以实现将应用编译成apk包并安装到制定的目录,可以根据自己的爱好自己决定用那种方法
- android不将apk包编译到系统里的方法
- android不将apk包编译到系统里的方法
- android不将apk包编译到系统里的方法
- android不将apk包编译到系统里的方法
- 将三方的apk包编译到系统里 Android.mk文件的写法
- android 不把jra包编译到apk中的方法
- Android 源码编译:资源树下,将drawable-*等文件编译到.apk里
- NDK编译出的apk文件安装到android系统中的方法
- Android 源码编译的系统apk如何安装到手机
- Android 4.0.3 源码编译中添加外部jar包和外部so到apk的方法
- android 通过Android.mk将三方的so库编译到apk里
- 将定制的java包引入到android系统中
- Android系统编译之将自己编的Launcher APK成为系统桌面应用
- 如何将apk文件编译到android镜像中
- apk文件编译到系统文件中的方法
- apk文件编译到系统文件中的方法
- apk文件编译到系统文件中的方法
- apk文件编译到系统文件中的方法
- windows 8/8.1 2012/2012 R2安装.NET Framework 3.5
- 黑马程序员----交通灯管理系统学习笔记
- poj 1186:方程的解数
- 3. String/集合类/IO流学习
- Linux终端实现根据应用包名过滤Logcat
- android不将apk包编译到系统里的方法
- Flask request,g,session的实现原理
- 【3阶动规+状态压缩】s到达G
- YII 邮件发送 phpmailer发送邮件!Yii自定义类引用
- B 树、B+ 树、B* 树
- 杂谈:adobe 要离开了?
- FOJ1007
- 12个鸡蛋的故事
- 常用黑盒测试设计用例方法一 等价类划分