如何将自己的项目编译到Android系统中,成为应用程序
1、下载Android系统的源码包(不同手机用的不一样,根据自己的情况合理下载,这不做介绍)
2、解压下载下来的源码包(若是.tar.gz文件,解压方式如下)
tar -xzvf 文件名
3、在解压包的alps/packages/apps下面新建一个文件夹 ***(项目名),将自己的项目的里面的main文件下的数据复制出来放在新建的文件夹下,并将java文件名改为src,最重要的一点是新建一个Android.mk文件,这个文件必须要有,可参照apps/下面的项目里面的.mk编写,最简单的编写是如下:
LOCAL_PATH:= $(call my-dir) //Android.mk文件和项目文件在同一个文件里可以这样写
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := 项目名
include $(BUILD_PACKAGE)
4、编译整个工程
./oneCmdMake 系统项目名 userdebug //这里可以是userdebug、eng、user
5、单一模块编译
./moduleMake userdebug mmm packages/apps/项目名 //注意,这里的编译选项必须一致,不然后面很麻烦
如果编译成功就可以开始刷机了,编译不成功就看error是怎么提示的,如果刷机后,手机上面没有你的项目,就执行 ./moduleMake userdebug snod
再次刷机,一般这样就可以了
整个工程编译成功后以后就不需要在整体编译了,整体编译是一个特别耗时的操作,一般是一个小时左右,但是单一模块编译是很快的,如果以后还需要将自己的项目预置到这个系统中(已经整体编译成功的),只需直接单一模块编译,并用snod进行打包就可以了,这是我认为比较节省时间的方法,另一种方法是将自己的项目名配置到系统配置文件device.mk里面,仿照***PACKAGES+=项目名,再整体编译一次,就不需要打包了。
模块编译(快速将修改过后的项目push到手机上)
source build/envsetup.sh # source是用来运行shell脚本的,envsetup.sh里面有mm mmm mmmb等一系列可用的命令,但只有运行了该脚本,里面的命令才能使用
lunch +平台名 #加载平台,这可名字可以在out/target/下面看,例如:正确的情况下是没有generic文件夹的
mmm -B 项目名 #编译修改过后的项目,-B 可有可无,这里的项目名要对应所在的路径,编译模块的所有文件,需要-B选项,不加-B 则只编译发生改变的文件
adb root #获得手机的root权限
adb remount #挂载手机
adb push 该项目生成的 .apk 和 .odex文件的位置 对应手机里面的位置 #把修改并编译后生成的push 到手机中
adb shell reboot #重启手机
对于不能remount的手机,就不能push,可以mmm单一编译后打包make -j16 snod(直接使用),再刷机,选中system下载到手机,可以省很多的时间
阿里最近更新代码后, root 后无法remount需要使用的要做以下处理:
adb root 之后,进到adb shell 里。执行命令 echo "enable 0;" > /proc/alog 然后就可以了。
注:当不确定自己是否push成功的情况下,可以到手机的目录下面去看对应文件的修改时间,如
ls -l Utk.apk 结果会显示文件的修改时间和权限,权限是666时,才正确,时间为你push的时间
m:编译所有的模块
mm:编译当前目录下的模块,当前目录下要有Android.mk文件
mmm:编译指定路径下的模块,指定路径下要有Android.mk文件
eng:工程版本
user:最终用户版本
userdebug:调试测试版本
tests:测试版本
一般而言,tests和userdebug两个版本是不能交付给最终用户的。
犯过的错误及最后的修改:
1、整体编译的时候用的是userdebug,单一模块用的是eng,编译的时候没有注意到,后面改成一样的了能生成oat文件了。
2、自己的游戏项目里面继承是AppCompatActivity,不能被识别,可能是因为包或版本的原因,最后统一改成了Activity.
3、用./moduleMake userdebug mmmb 改成了./moduleMake userdebug snod编译单一模块并打包就成功了
4、注释尽量不出现中文,布局里面的text内容最好写在string.xml中,再去调用
5、./birdCopy 6118SOP_V17_AY_HD_MV1616 userdebug
./mk_aliphone.sh bird_6737m_35g_m0 userdebug adb new YUNOS_CARRIER_CUSTOM=CMCC_DEEP_COOP
这是对于阿里平台的编译,new是每次整体编译都会清掉原来编译过的数据,如果为了编译时间短,可以不要new改成remake
提高代码的编译速度可参照http://blog.****.net/cscrazybing/article/details/50789482