首先明确路径 我们要移植的package工程,在package/apps/下边,你会发现系统所有的应用都在此处 我们会用到build下面的build/target/PRoduct/core.mk的配置文件,(此处是你的app能否被加载起来的关键) 再有,我们要有所需要的源码,一般github上的,都可用。当然也不乏一些拥有androidStudio的apk编译代码,它主要是通过gradle编译的,所以直接移入此类的是无法编译成功的,我们需要转译成通过.mk文件编译的,一边大致的目录结构; 一款应用,AndroidManifest.xml/Androd.mk/CleanSpeck.mk/res/src是不可缺少的,其他的jni,aidl看你的工程的需要。
接下俩一点点分析,先说res|src两个文件夹,大家都知道res放的布局文件,配置信息,valuse属性等,src中就是我们的代码主题,这没什么可说的,直接移植进来就好。
接下来是我们的AndroidManifest.xml,清单配置文件,大家应该也都不陌生;1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="jackpal.androidterm" 4 android:versionName="1.0.70" 5 android:versionCode="71" 6 android:installLocation="auto"> 7 <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> 8 <uses-permission android:name="android.permission.INTERNET" /> 9 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 10 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 11 <uses-permission android:name="android.permission.access_SUPERUSER" /> 12 <uses-permission android:name="android.permission.WAKE_LOCK" /> 13 <permission android:name="jackpal.androidterm.permission.RUN_SCRipT" 14 android:label="@string/perm_run_script" 15 android:description="@string/permdesc_run_script" 16 android:permissionGroup="android.permission-group.SYSTEM_TOOLS" 17 android:protectionLevel="dangerous" /> 18 <permission android:name="jackpal.androidterm.permission.APPEND_TO_PATH" 19 android:label="@string/perm_append_to_path" 20 android:description="@string/permdesc_append_to_path" 21 android:permissionGroup="android.permission-group.SYSTEM_TOOLS" 22 android:protectionLevel="dangerous" />随便粘了点,大家了解意思就行,基本配置不出错,package名别写错就不会有大问题。当然还可以通过配置清单文件的属性,来提高整个应用的级别,比如系统级应用等。
解析来是cleanspec.mk$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/OtoTerminal_intermediates)真正有用的就这一句话,这个的作用就是每次编译的时候,都先清除掉out/target/..下你的应用生成的文件,然后再次编译,生产新的。
解析来就重点,我们的应用可不可以编译顺利通过完成,关键在于Android.mk的配置信息是否正确11 LOCAL_STATIC_java_LIBRARIES += android-support-v13 12 13 LOCAL_SRC_FILES := $(call all-java-files-under, src) 14 15 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res $(appcompat_dir) 16 17 LOCAL_AAPT_FLAGS := --auto-add-overlay 18 LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat 19 20 LOCAL_PACKAGE_NAME := OtoTerminal 21 LOCAL_CERTIFICATE := platform 22 LOCAL_PRIVILEGED_MODULE := true 23 24 LOCAL_JNI_SHARED_LIBRARIES := libjackpal-termexec2 libjackpal-androidterm5 25 26 include $(BUILD_PACKAGE) 27 28 # libjackpal-termexec2 29 include $(CLEAR_VARS) 30 31 LOCAL_LDFLAGS := -Wl,--build-id 32 LOCAL_LDLIBS := / 33 -llog / 34 -lc / 35 -lm / 36 37 LOCAL_SHARED_LIBRARIES += liblog 38 39 LOCAL_MODULE := libjackpal-termexec2 40 LOCAL_SRC_FILES := / 41 jni/process.cpp / 42 43 LOCAL_C_INCLUDES += /jni 44 45 LOCAL_CFLAGS += -ffast-math -O3 -funroll-loops 46 47 LOCAL_ARM_MODE := x86_64 48 49 include $(BUILD_SHARED_LIBRARY) 50 51 # libjackpal-androidterm5 52 include $(CLEAR_VARS) 53 54 LOCAL_LDFLAGS := -Wl,--build-id 55 LOCAL_MODULE := libjackpal-androidterm5 56 LOCAL_LDLIBS := / 57 -llog / 58 -lc / 59 -lm / 60 61 LOCAL_SHARED_LIBRARIES += liblog39 LOCAL_MODULE := libjackpal-termexec2 40 LOCAL_SRC_FILES := / 41 jni/process.cpp / 42 43 LOCAL_C_INCLUDES += /jni 44 45 LOCAL_CFLAGS += -ffast-math -O3 -funroll-loops 46 47 LOCAL_ARM_MODE := x86_64 48 49 include $(BUILD_SHARED_LIBRARY) 50 51 # libjackpal-androidterm5 52 include $(CLEAR_VARS) 53 54 LOCAL_LDFLAGS := -Wl,--build-id 55 LOCAL_MODULE := libjackpal-androidterm5 56 LOCAL_LDLIBS := / 57 -llog / 58 -lc / 59 -lm / 60 61 LOCAL_SHARED_LIBRARIES += liblog 62 63 LOCAL_SRC_FILES := / 64 jni/fileCompat.cpp / 65 jni/termExec.cpp / 66 jni/common.cpp / 67 68 LOCAL_C_INCLUDES += /jni 69 70 LOCAL_CFLAGS += -ffast-math -O3 -funroll-loops 71 72 LOCAL_ARM_MODE := x86_64 73 74 include $(BUILD_SHARED_LIBRARY) 75 76 ifeq (,$(ONE_SHOT_MAKEFILE)) 77 include $(call all-makefiles-under,$(LOCAL_PATH)) 78 endif我的这个文件虽然能用,但很多细节写的不够规范,如果也有错误的地方也希望大家指正; 接下来一点点分析:首先头部这块,一般是对一些共通包或路径的一些配置,我们不需要动太多,除非你对supportV几有特殊需求:
LOCAL_PATH:= $(call my-dir) 2 3 include $(CLEAR_VARS) 4 5 LOCAL_MODULE_TAGS := optional 6 7 appcompat_dir := $(LOCAL_PATH)/../../../prebuilts/sdk/current/support/v7/appcompat/res 8 9 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 10 LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat 11 LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13 12 13 LOCAL_SRC_FILES := $(call all-java-files-under, src) 14 15 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res $(appcompat_dir) 16 17 LOCAL_AAPT_FLAGS := --auto-add-overlay 18 LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat接下来这块,算是重点,我们要指定正确的LOCAL_PACKAGE_NAME LOCAL_PACKAGE_NAME := OtoTerminal LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true
在往下,大家可以看到我定义了两个共享library: LOCAL_JNI_SHARED_LIBRARIES := libjackpal-termexec2 libjackpal-androidterm5
最开始我的编译失败,就是无法正确的在out/target的某层目录下无法正确的生成或找到相应的以上名字的.so的包 而这两个.so的文件怎么来的呢,是我们自己编译出来的,
大家可以看到,我们代码中拥有jni的代码,他的内部有一些.cpp的文件,这些文件的组合调用,就可以生产所需要的.so文件,至于这个文件生产所需.cpp是什么,就是你需要调研查找的了。至于里边的key的各项意义,看名字能理解个大概,更具体的细节需要更系统的学习。
工作到这一步,你的任务已经完成90%了,但差最后一步,就是build文件的配置,它的配置是你植入的app编译然后可见的关键: build/target/product/core.mkPRODUCT_PACKAGES += / 24 BasicDreams / 25 Browser / 26 Calculator / 27 Calendar / 28 CalendarProvider / 29 CaptivePortalLogin / 30 CertInstaller / 31 Contacts / 32 DeskClock / 33 DocumentsUI / 34 DownloadProviderUi / 35 Email / 36 Exchange2 / 37 ExternalStorageProvider / 38 FusedLocation / 39 InputDevices / 40 KeyChain / 41 Keyguard / 42 LatinIME / 43 LineRect / 44 ManagedProvisioning / 45 PicoTts / 46 PacProcessor / 47 libpac / 48 PowerSource / 49 StartupMenu / 50 PrintSpooler / 51 Printer / 52 ProxyHandler / 53 QuickSearchBox / 54 Settings / 55 SharedStorageBackup / 56 Telecom / 57 TeleService / 58 VpnDialogs / 59 MmsService / 60 OtoOta / 61 Launcher2 / 62 OtoTerminal /执行到这一步,你就可以执行了,我假定大家偶会编译;不会的也可以看下下面方法:
在你的程序根目录下:类似于lollipop下,执行:source build/envsetup.shlunch n (n代表你要编译出的类型,lunch操作后回车,你可以看到选项)接下来make -jN 镜像 (N代表进程数,你要同时开多少线程去编译,根据你的电脑配置量力而行,不然容易搞崩的)好的,至此我们的基本流程就结束了。新闻热点
疑难解答