IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Android实训(五):第三方应用无源码APK、有源码APP预置、jar库so库的引入和android.mk浅析 -> 正文阅读

[Java知识库]Android实训(五):第三方应用无源码APK、有源码APP预置、jar库so库的引入和android.mk浅析

第三方应用的预置

也就是手机上预置第三方应用,一般需要预置无代码的APK和有源码的APP

1. Android.mk基础知识

? Android N(7)之后多了一种Android.bp格式,不过现在大多数仍然是以mk来书写配置文件,它相当于提供了编译参数

1.1 mk实例

LOCAL_PATH := $(ca1l my-dir) 
include $(CLEAR_VARS)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)

LOCAL开头的变量意思就是mk文件需要这个变量

include表示mk需要执行的脚本

  1. LOCAL_ PATH := $(ca1l my-dir)

    每一个Android.mk文件必须要定义LOCAL_PATH开始,用于tree中查找位置,意思就是编译的时候将该目录加进去。my -dir是系统提供,表示返回当前路径

  2. include $(CLEAR_VARS)

    CLEAR_VARS变量是由Build System提供,并指向一个指定的GNU Makefile,负责清理很多的LOCAL_XXX配置,但是不会清理LOCAL_PATH,也就是说,在编译新的模块之前把之前编译模块的信息给清除

  3. LOCAL_MODULE := helloworld

    模块名,默认是$(LOCAL_PACKAGE_NAME),如果没有会编译失败。apk是以LOCAL_PACKAGE_NAME指定模块名,其余都是以这个

  4. LOCAL_CERTIFICATE

    在什么情况下签名

    1. testkey:普通APK,默认使用
    2. platform:该APK完成一些系统核心功能,编译出来的APK的UID为system,参见Settings的mk或者bp文件
    3. shared:该APK需要和home/contacts进程共享数据,参见Launcher
    4. media:该APK是media/download系统中的一环,参见Gellery、
    5. PRESIGNED:已经签名
  5. LOCAL_SRC_FILES := helloworld.c

  6. LOCAL_MODULE_CLASS := APPS

    指定模块的类型,可以不用定义

    1. APPS编译APK文件
    2. JAVA_LIBRAYIES编译jar包
    3. SHARED_LIBRAYIES定义动态库文件
    4. EXECUTABLES编译可执行文件
  7. include $(BUILD_SHARED_LIBRARY)

    $里的值表示编译库,意思就是用什么编译库去编译,有以下七个库

    1. BUILD_PACKAGE既可以编译APK,也可以编译包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true
    2. BUILD_JAVA_LIBRAYRY为java共享库
    3. BUILD_STATIC_JAVA_LIBRARY为java静态库
    4. BUILD_EXECUTABLE为执行文件
    5. BUILD_SHARED_LIBRARY为native共享库
    6. BUILD_STATIC_LIBRARY为native静态库
    7. BUILD_PREBUILD把文件当成编译项目
  8. LOCAL_MODULE_TAGES := USER ENG TESTS OPTIONAL

    可选定义,表示什么版本情况下编译该版本,默认为optional

    1. user/eng/tests:指该模块只在user/eng/tests版本下编译
    2. optional:指该模块在所有版本下都编译
  9. LOCAL_PRIVILEGED_MODULE

    如果不设置或设置成false,安装位置在system/app,如果设置成true,安装位置在system/priv-app

  10. LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/operator/app

    目标的安装路径,意思是把编译的目标安装在这个目录下

2.预置无代码APK

  • 拿到APK

  • 在aosp/vendor/xxxcompany/3rdAPP/下新建apk同名目录

  • 将APK放入该目录并新建Android.mk文件

  • #告诉系统这个目录需要编译
    LOCAL_PATH := $(call my-dir)
    #清理变量
    include $(CLEAR_VARS)
    #在所有版本下编译
    LOCAL_MODULE_TAGES := optional
    #模块名,和package总有一个要设置
    LOCAL_MODULE := MyTest
    #签名
    LOCAL_CERTIFICATE := PRESIGNED
    #编译源文件
    LOCAL_SRC_FILE := $(LOCAL_MODULE).apk
    #编译
    include $(BUTLD_PREBUTLT)
    
  • 做好以上几步,如果单编test,是可以编译的,但是如果编译模块就不行了

  • 需要更改device.mk,这次针对的产品是:aosp_x86-eng,进入到aosp/build/target/board/generic_x86/device.mk文件

  • 增加PRODUCT_PACKAGES += \MyTest

  • 不同公司产品的device.mk目录不一样

3.预置有源码的APP

预置第三方APP要麻烦很多,需要涉及jar包和so库,下面以AndroidStudio新建工程CodeApp目录

确认预置的目标目标为:vendor/xxxcompany/3rdAPP/CodeApp,创建三个文件夹分别是libs,res,src和安卓清单文件

这几个文件夹和清单文件都在CodeApp中

libs:把jar和so库都放入

res:就是app/src/main/res/

src:就是app/src/main/java/

添加Android.mk文件,规则和apk基本相同,但是针对jar包和so库要单独进行处理

3.1 引入jar包

例如要引用activitymainbinding.jar文件,位于libs目录下

第一步、需要声明jar包的位置

LOCAL_PREBUILT_STATC_JAVA_LIBRARIES := \
	static-library:libs/activitymainbinding.jar

完整的就应该这样写

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATC_JAVA_LIBRARIES := \
	static-library:libs/activitymainbinding.jar
include $(BUILD_MULTI_PREBUILT)

第二步,需要引入声明的变量

LOCAL_STATIC-JAVA_LIBRIES := \
	STATIC-LIBRARY

3.2 引入so库

假设libs/armeabi下面有一个libcodeapp.so,需要引用他,有两种方式

1、可以在Android.mk引用so库

? 声明so库

LOCAL_PREBUTIL_JNI_LIBS := libs/armeabi/libcodeapp.so

? 如果有多个so库

LOCAL_PREBUTIL_JNI_LIBS := \
	libs/armeabi/libcodeapp.so	\
	libs/armeabi/libcodeapp1.so

? 或者用这个方式

? 第一步还是先声明

include $(CLEAR_VARS)
LOCAL_PREBUTIL_JNI_LIBS := libcodeapp:libs/armeabi/libcodeapp.so
include $(BUILD_MULTI_PREBUILT)

? 第二部引用声明的so库

LOCAL_JNI_shared_LIBraries := \
	libcodeapp

2、在libs下建一个Adnroid.mk配置好so库,直接include

? libs/Android.mk如下

include $(CLEAR_ _VARS)
LOCAL MODULE_ TAGS := optional
LOCAL_ MODULE_ SUFFIX := . so 
LOCAL_ MODULE := libcodeapp
| LOCAL_ MODULE_ CLASS := SHARED_ LIBRARIES
#此语句可以先不添加进行编译
LOCAL_ CHECK_ ELF_ FILES := false
LOCAL_ SRC_ FILES :=libs/ armeabi/$( LOCAL_ MODULE). so
LOCAL_ MULTILIB := 64
include $(BUILD_ PREBUILT)
#==================================================== 
include $(CLEAR _VARS)
LOCAL_ MODULE_ TAGS := optional
LOCAL_ MODULE_ SUFFIX := .SO
LOCAL_ MODULE := libnewtest
LOCAL_ MODULE_ CLASS:= SHARED LIBRARIES
#此语句可以先不添加进行编译
LOCAL_ CHECK_ ELF FILES::= false
LOCAL_ SRC_ FILES := libs/armeabi/$(LOCAL_ MODULE).so
LOCAL_ MULTILIB := 64
include $(BUILD_ PREBUILT)

? 根目录mk需要引入

include $(LOCAL_ PATH)/libs/ Android .mk

? 同时需要引入so库

LOCAL_ JNI_ SHARED_ LIBRARIES :=	\
    libcodeapp\
    libnewtest

3.3 导入系统依赖

? build.gradle一般会有依赖项如下

dependencies {
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

? 出去junit和test相关的依赖项,mk需要添加以下内容

LOCAL_STATIC_ANDROID_LIBRARIES := \
	androidx.appcompat_appcmpat \
	com.google.android.material_material

? 依赖中的:用_替代

? 配置好项目相关配置之后在对应device.mk添加模块

? 接下来进行调试编译

mmm vendor/xxxcompany/3rdAPP/MyTest
mmm vendor/xxxcompany/3rdAPP/CodeApp

? 如果模块编译成功后,在进行全编

4.完整APP预置Android.mk示例

LOCAL_ PATH:= $(call my-dir)
include $(CLEAR_ VARS)
LOCAL_ MODULE_ TAGS := optional
LOCAL_ PACKAGE_ NAME := CodeApp
#签名使用平台签名
LOCAL_ CERTIFICATE:=platform 

#引入系统资源文件
#LOCAL_USE_AAPT2 := true
# Java 文件(源代码文件)
LOCAL_SRC_FILES := $(ca1l all-java-files-under,src)
#资源文件,可选定义,推荐不定义
#LOCAL_RESOURCE_DIR = \
#		$(LOCAL_ PATH)/res 

#可以使用系统hide api
LOCAL_PRIVATE_PLATFORM_APIS := true
#释放开后,可能导致引入的三方库编译异常
#LOCAL_SDK_VERSION := current

#导入系统依赖
LOCAL_ TATICANDROID_LIBRARIES := \
androidx.appcompat_appcmpat \
com.google.android.material_material \
androidx_constraintlayout_constraintlayout

#引入jar包
LOCAL_ STATIC JAVA_ LIBRARIES := \
static-library

#打印日志
$(warning $(LOCAL_STATIC_JAVA_ LIBRARIES))
#引用三方so库的第一种方式
LOCAL_PREBUILT_JNI_LIBS := libs/armeabi/libcodeapp.so
#制定编译的工程,不要使用代码混淆的工具进行代码混淆
include $(BUILD_PACKAGE)

LOCAL_ PROGUARD_ ENABLED := disabled
#指定不需要混淆的native方法与变量的proguard. flags文件
LOCAL_ PROGUARD_ _FLAG_ FILES := proguard. flags
#截止到此处引入编译指令开始编译
include $(BUILD_ PACKAGE)

#########引用第三方jar包#########
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := 
static-library:libs/activitymainbinding.jar
include $(BUILD_MULTI_PREBUILT)

#打印日志
$(warning“build multi prebuilt over")
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:17:11  更:2022-05-11 16:21:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:36:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码