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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 利用python为你集成三方apk里的lib时自动生成Android.bp -> 正文阅读

[移动开发]利用python为你集成三方apk里的lib时自动生成Android.bp

github:?GitHub - fredhurui/GenerateAndroidMakefile: Generate Android.bp for the shared library in the apk, which is used to integrated apk to Android ROM

在某些时候需要将三方apk集成为android ROM内置应用,如果三方应用内部有大量的shared library文件,则需求大量时间为其编写Android.bp或者Android.mk。

为了提高工作效率,我特意用python实现了一个简易版本其功能如下:

1.将APK文件解压,比如APK文件名为Test.APK

2.在Test/lib目录下创建Android.bp文件

3.读取Test/lib目录的子目录列表

4.针对armeabi-v7a和arm64-v8a目录,分别读取其shared library列表并逐个生成对应的prebuild脚本,然后写入Android.bp(当前版本只处理了armeabi-v7a)


#file is the apk name with suffix, it should like my.apk
def unzipfileAndGenerateMakefile(file):
? ? uzfile = zipfile.ZipFile(path + file)
? ? apk_name = file.split('.')[0]
? ? print(apk_name)
? ? print "unzip apk file to " + apk_name
? ? unzipedFilePath = path + apk_name + "/"
? ? #apkFolder = Path(unzipedFilePath)
? ? if os.path.exists(unzipedFilePath):
? ? ? ? print unzipedFilePath + " folder is exist"
? ? else:
? ? ? ? print "do unzip"
? ? ? ? uzfile.extractall(unzipedFilePath)
? ? generateSharedLibraryPrebuildMakefile(unzipedFilePath + "lib/")
? ??
def generateSharedLibraryPrebuildMakefile(file):
? ? #create xxx/lib/Android.bp
? ? #makefilePath = Path(file + 'Android.bp')
? ? if os.path.exists(file + 'Android.bp'):
? ? ? ? print file + 'Android.bp' + " is exist, remove it first"
? ? ? ? os.remove(file + 'Android.bp')
? ? ? ??
? ? out = open(file + 'Android.bp', 'a')
? ? lib_dirs = os.listdir(file)
? ? #lib_dirs = glob.glob(file)
? ? #Only handle arm64-v8a and armeabi-v7a
? ? for dirname in lib_dirs:
? ? ? ? print "lib sub dir : " + dirname
? ? ? ? if cmp("armeabi-v7a", dirname) == 0:
? ? ? ? ? ? print "Handle armeabi-v7a libs"
? ? ? ? ? ? print "list " + file + dirname + "/*.so"
? ? ? ? ? ? #libs = os.listdir(file + dirname + "/*.so")
? ? ? ? ? ? libs = fnmatch.filter(os.listdir(file + dirname), "*.so")
? ? ? ? ? ? for shareLibName in libs:
? ? ? ? ? ? ? ? print shareLibName
? ? ? ? ? ? ? ? content = generatearmeabiv7aMakefile(shareLibName)
? ? ? ? ? ? ? ? out.write(content)
? ? ? ? ? ? ? ? out.write("\n")
? ? ? ? if cmp("arm64-v8a", dirname) == 0 and needHanldeArm64:
? ? ? ? ? ? print "Handle arm64-v8a libs"
? ? ? ? ? ? #libs = glob.glob(file + dirname + "/*.so")
? ? ? ? ? ? libs = fnmatch.filter(os.listdir(file + dirname), "*.so")
? ? ? ? ? ? for shareLibName in libs:
? ? ? ? ? ? ? ? print shareLibName
? ? ? ? ? ? ? ? ins = open(file + 'Android.bp', 'r')
? ? ? ? ? ? ? ? file_content = ins.read()
? ? ? ? ? ? ? ? print "old content:" + file_content
? ? ? ? ? ? ? ? findResult = re.findall(shareLibName, content)
? ? ? ? ? ? ? ? count = len(findResult)
? ? ? ? ? ? ? ? print findResult
? ? ? ? ? ? ? ? print "found count:%d" %count
? ? ? ? ? ? ? ? if count == 1:
? ? ? ? ? ? ? ? ? ? #should merge conent
? ? ? ? ? ? ? ? ? ? print "find it and do merge"
? ? ? ? ? ? ? ? ? ? print "old content:" + file_content
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? content = generatearm64v8aMakefile(shareLibName)
? ? ? ? ? ? ? ? ? ? out.write(content)
? ? ? ? ? ? ? ? ? ? out.write("\n")
? ? #out.write()
? ? out.close()

def generatearmeabiv7aMakefile(shareLibName):
? ? #lib_name = shareLibName.split('.')[0]
? ? #lib_name = os.path.basename(shareLibName)
? ? #suffixIndex = shareLibName.find(".so")
? ? #print ?suffixIndex
? ? lib_name = shareLibName[0 : -3]
? ? print ?lib_name
? ? AndroidBpContent = """
cc_prebuilt_library_shared {{
? ? name: \"{}\",
? ? target: {{
? ? ? ? android_arm: {{
? ? ? ? ? ? srcs: [\"armeabi-v7a/{}.so\"],
? ? ? ? }},
? ? }},
? ? strip: {{
? ? ? ? none: true,
? ? }},
}}"""
? ? result = AndroidBpContent.format(lib_name, lib_name)
? ? #print("AndroidBpContent:\n" + result)
? ? return result

def generatearm64v8aMakefile(shareLibName):
? ? #lib_name = shareLibName.split('.')[0]
? ? #lib_name = os.path.basename(shareLibName)
? ? #suffixIndex = shareLibName.find(".so")
? ? #print ?suffixIndex
? ? lib_name = shareLibName[0 : -3]
? ? print ?lib_name
? ? #first check if already generated makefile for armeabi-v7a for current lib
? ??
? ? AndroidBpContent = """
cc_prebuilt_library_shared {{
? ? name: \"{}\",
? ? target: {{
? ? ? ? android_arm64: {{
? ? ? ? ? ? srcs: [\"arm64-v8a/{}.so\"],
? ? ? ? }},
? ? }},
? ? strip: {{
? ? ? ? none: true,
? ? }},
}}"""
? ? result = AndroidBpContent.format(lib_name, lib_name)
? ? #print("AndroidBpContent:\n" + result)
? ? return result

if __name__ == '__main__':
? ? #print ("argv len: %d" %len(sys.argv))
? ? if len(sys.argv) == 2:
? ? ? ? unzipfileAndGenerateMakefile(sys.argv[1])
? ? else:
? ? ? ? print "Bad input parameters"
? ? ? ? print 'Usage: python %s xxx.apk' %sys.argv[0]

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:17:25  更:2022-08-19 19:20:00 
 
开发: 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/25 4:58:15-

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