android源码中打包so到apk的方法

如下两句命令即可

./aapt a ../../../out/target/product/scx35_sp7731gea_hdr/system/app/xxx/xxx.apk libs/armeabi/libxxx.so libs/armeabi/libyyy.so libs/armeabi/libzzz.so

上面是把so打包至apk中,这时的apk还无法安装,需要做一下签名:

java -jar ../../../out/host/linux-x86/framework/signapk.jar ../../../build/target/product/security/platform.x509.pem ../../../build/target/product/security/platform.pk8 ../../../out/target/product/scx35_sp7731gea_hdr/system/app/xxx/xxx.apk xxx.apk
 

java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 out/target/product/scx35_sp7731gea_hdr/system/app/xxx/xxx.apk xxx.apk

AAPT 工具介绍

下面是取自"http://www.androidcn.net/wiki/index.php/Reference/aapt"的介绍

aapt stands for Android Asset Packaging Tool and is included in the tools/ directory of the SDK. This tool allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into binary assets.aapt即Android Asset Packaging Tool , 在SDK的tools/目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件.Though you probably won't often use aapt directly, build scripts and IDE plugins can utilize this tool to package the apk file that constitutes an Android application.尽管你可能没有直接使用过aapt工具, 但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序.For more usage details, open a terminal, go to the tools/ directory, and run the command:获取更多的实用信息, 请打开终端控制台, 到tools/目录下, 执行命令:Linux or Mac OS X:  ./aaptWindows:aapt.exe

AAPT 的帮助信息

执行上述命令,会在控制台打出相应aapt的信息:

Android Asset Packaging Tool

Usage:
 aapt l[ist] [-v] [-a] file.{zip,jar,apk}
   List contents of Zip-compatible archive.

 aapt d[ump] WHAT file.{apk} [asset [asset ...]]
   badging          Print the label and icon for the app declared in APK.
   permissions      Print the permissions from the APK.
   resources        Print the resource table from the APK.
   configurations   Print the configurations in the APK.
   xmltree          Print the compiled xmls in the given assets.
   xmlstrings       Print the strings of the given compiled xml assets.

 aapt p[ackage] [-f][-u][-m][-v][-x][-M AndroidManifest.xml] /
        [-0 extension [-0 extension ...]] /
        [-I base-package [-I base-package ...]] /
        [-A asset-source-dir] [-P public-definitions-file] /
        [-S resource-sources] [-F apk-file] [-J R-file-dir] /
        [raw-files-dir [raw-files-dir] ...]

   Package the android resources.  It will read assets and resources that are
   supplied with the -M -A -S or raw-files-dir arguments.  The -J -P -F and -R
   options control which files are output.

 aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]
   Delete specified files from Zip-compatible archive.

 aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]
   Add specified files to Zip-compatible archive.

 aapt v[ersion]
   Print program version.

 Modifiers:
   -a  print Android-specific data (resources, manifest) when listing
   -c  specify which configurations to include.  The default is all
       configurations.  The value of the parameter should be a comma
       separated list of configuration values.  Locales should be specified
       as either a language or language-region pair.  Some examples:
            en
            port,en
            port,land,en_US
       If you put the special locale, zz_ZZ on the list, it will perform
       pseudolocalization on the default locale, modifying all of the
       strings so you can look for strings that missed the
       internationalization process.  For example:
            port,land,zz_ZZ
   -d  one or more device assets to include, separated by commas
   -f  force overwrite of existing files
   -j  specify a jar or zip file containing classes to include
   -m  make package directories under location specified by -J
   -u  update existing packages (add new, replace older, remove deleted files)
   -v  verbose output
   -x  create extending (non-application) resource IDs
   -z  require localization of resource attributes marked with
       localization="suggested"
   -A  additional directory in which to find raw asset files
   -F  specify the apk file to output
   -I  add an existing package to base include set
   -J  specify where to output R.java resource constant definitions
   -M  specify full path to AndroidManifest.xml to include in zip
   -P  specify where to output public resource definitions
   -S  directory in which to find resources
   -0  specifies an additional extension for which such files will not
       be stored compressed in the .apk.  An empty string means to not
       compress any files at all.

根据以上帮助信息,用aapt可以使用以下操作:

查看AAPT的版本

 ./aapt v

得到当前工具的版本:

Android Asset Packaging Tool, v0.2

使用AAPT列出资源包(.apk)文件列表

 aapt l[ist] [-v] [-a] file.{zip,jar,apk}
   List contents of Zip-compatible archive.

可以用命令查看系统资源包的内容:

./aapt l framework-res.apk
META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
AndroidManifest.xml
assets/images/android_320x480.png
assets/images/boot_robot.png
assets/images/boot_robot_glow.png

...

assets/webkit/youtube.html
assets/webkit/youtube.png
res/anim/accelerate_decelerate_interpolator.xml
res/anim/accelerate_interpolator.xml
res/anim/app_starting_exit.xml

...

res/raw-de/loaderror.html
res/raw-de/nodomain.html
res/raw/fallbackring.ogg
res/raw/loaderror.html
res/raw/nodomain.html
res/xml-en/autotext.xml
res/xml/apns.xml
res/xml/autotext.xml
res/xml/preferred_time_zones.xml
res/xml/time_zones_by_country.xml
resources.arsc

如果采用-v选项,会将所有文件的详细信息打印出来:

Archive:  framework-res.apk
 Length   Method    Size  Ratio   Date   Time   CRC-32    Name
--------  ------  ------- -----   ----   ----   ------    ----
   76217  Deflate   25576  66%  04-16-08 07:40  3b7140fa  META-INF/MANIFEST.MF
   76259  Deflate   25706  66%  04-16-08 07:40  a21d76be  META-INF/CERT.SF
    1714  Deflate    1156  33%  04-16-08 07:40  ca66d55e  META-INF/CERT.RSA
   31768  Deflate    5556  83%  01-16-09 12:04  8c137ee8  AndroidManifest.xml
    3098  Stored     3098   0%  01-15-09 23:16  ed1132c9  assets/images/android_320x480.png
    1001  Stored     1001   0%  01-15-09 23:16  c53ad035  assets/images/boot_robot.png
    2083  Stored     2083   0%  01-15-09 23:16  12acc29d  assets/images/boot_robot_glow.png

... ...

     340  Deflate     155  54%  01-16-09 12:04  cc2ad7f2  res/anim/accelerate_decelerate_interpolator.xml
     368  Deflate     179  51%  01-16-09 12:04  c94b9323  res/anim/accelerate_interpolator.xml
     568  Deflate     260  54%  01-16-09 12:04  e0972304  res/anim/app_starting_exit.xml

... ...

     605  Deflate     296  51%  01-15-09 23:16  88710568  res/raw-de/loaderror.html
     996  Deflate     471  53%  01-15-09 23:16  c42ea004  res/raw-de/nodomain.html
   10975  Stored    10975   0%  01-15-09 23:16  21dc2fce  res/raw/fallbackring.ogg
     579  Deflate     282  51%  01-15-09 23:16  11c56b88  res/raw/loaderror.html
     890  Deflate     418  53%  01-15-09 23:16  393cf037  res/raw/nodomain.html
   25588  Deflate    5051  80%  01-16-09 12:04  cf7826df  res/xml-en/autotext.xml
     164  Deflate      97  41%  01-16-09 12:04  ee886635  res/xml/apns.xml
     116  Deflate      59  49%  01-16-09 12:04  885f246d  res/xml/autotext.xml
     864  Deflate     312  64%  01-16-09 12:04  65ad9d7e  res/xml/preferred_time_zones.xml
   61044  Deflate   11755  81%  01-16-09 12:04  0bc79a58  res/xml/time_zones_by_country.xml
  747776  Stored   747776   0%  01-16-09 12:04  98f996b3  resources.arsc
--------          -------  ---                            -------
 2246729          1774656  21%                            851 files

如果采用-a选项,会在上述文件列表之后,打印出android使用的符号表:

Resource table:
mError=0x0 (Success)
Package Groups (1)
Package Group 0 id=1 packageCount=1 name=android
  Package 0 id=1 name=android typeCount=13
    type 0 configCount=1 entryCount=599
      spec resource 0x01010000 android:attr/theme: flags=0x40000000
      spec resource 0x01010001 android:attr/label: flags=0x40000000
      spec resource 0x01010002 android:attr/icon: flags=0x40000000
      spec resource 0x01010003 android:attr/name: flags=0x40000000
      spec resource 0x01010004 android:attr/manageSpaceActivity: flags=0x40000000
      spec resource 0x01010005 android:attr/allowClearUserData: flags=0x40000000
      spec resource 0x01010006 android:attr/permission: flags=0x40000000
      spec resource 0x01010007 android:attr/readPermission: flags=0x40000000
      spec resource 0x01010008 android:attr/writePermission: flags=0x40000000
      spec resource 0x01010009 android:attr/protectionLevel: flags=0x40000000
      spec resource 0x0101000a android:attr/permissionGroup: flags=0x40000000
... ...

这些符号表的格式还需要进一步研究才能搞明白 -_-!

使用AAPT打包资源文件

使用以下命令查看android的build系统是如何打包framework-res模块的:

cd ~/android/src
make -n --debug framework-res

以下是从输出提取的关键步骤:

1. 第一步,生成资源apk包,由以下命令完成:

out/host/linux-x86/bin/aapt package -z -u -x  -M frameworks/base/core/res/AndroidManifest.xml -S frameworks/base/core/res/res
 -A frameworks/base/core/res/assets  -F out/target/product/generic/obj/APPS/framework-res_intermediates/package.apk

2. 第二步,为生成的资源包做签名:

java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/secur
ity/platform.pk8 out/target/product/generic/obj/APPS/framework-res_intermediates/package.apk.unsigned out/target/product/gene
ric/obj/APPS/framework-res_intermediates/package.apk.signed

3. 第三步,为生成的包做对齐处理:

out/host/linux-x86/bin/zipalign -f 4 out/target/product/generic/obj/APPS/framework-res_intermediates/package.apk.unaligned ou
t/target/product/generic/obj/APPS/framework-res_intermediates/package.apk.aligned

如此生成的framework-res.apk包可以被用来替换system.img中的资源包。(在CupCake前的稳定版本中测试可行)

具体步骤:

  1. 首先用生成的framework-res.apk替换在~/android/src/out/target/product/generic/system/framework中的同名文件。
  2. 用make snod生成新的system.img,替换sdk目录下的images/system.img
  3. 用-wipe-date参数启动emulator

使用AAPT解压资源包(.apk)

./aapt d xmltree framework-res.apk res/anim/fade_in.xml
N: android=http://schemas.android.com/apk/res/android
  E: alpha (line=21)
    A: android:interpolator(0x01010141)=@0x10a0006
    A: android:duration(0x01010198)=(type 0x10)0x12c
    A: android:fromAlpha(0x010101ca)=(type 0x4)0x0
    A: android:toAlpha(0x010101cb)=(type 0x4)0x3f800000
./aapt d xmlstrings framework-res.apk res/anim/fade_in.xml
String #0: interpolator
String #1: fromAlpha
String #2: toAlpha
String #3: duration
String #4: android
String #5: http://schemas.android.com/apk/res/android
String #6:
String #7: alpha

而没有经过编译的文件为:

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@anim/decelerate_interpolator"
       android:fromAlpha="0.0"
       android:toAlpha="1.0"
       android:duration="300" />

相应的R.java文件为:

package com.android.internal;

public final class R {
    public static final class anim {
        public static final int accelerate_decelerate_interpolator=0x010a0004;
        public static final int accelerate_interpolator=0x010a0005;
        public static final int app_starting_exit=0x010a0007;
        public static final int decelerate_interpolator=0x010a0006;
        public static final int dialog_enter=0x010a0008;
        public static final int dialog_exit=0x010a0009;
... ...

也可以从符号表中得到这些索引值:

resource 0x010a0006 android:anim/decelerate_interpolator: t=0x03 d=0x00001132 (s=0x0008 r=0x00) (PUBLIC)

配合系统预定的framework/base/core/res/res目录的模版,就可以重建/res文件.


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android 10,FFmpeg可以使用Android NDK进行集成。以下是一些步骤: 1. 下载最新版本的Android NDK,并将其解压缩到您的计算机上。 2. 下载最新版本的FFmpeg,并将其解压缩到您的计算机上。 3. 在您的Android Studio项目创建一个名为“jni”的文件夹。 4. 将FFmpeg的“libavcodec”,“libavformat”和“libavutil”文件夹复制到您的“jni”文件夹。 5. 在您的“jni”文件夹创建一个名为“Android.mk”的文件,并将以下内容添加到该文件: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libavcodec LOCAL_SRC_FILES := libavcodec/libavcodec.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libavcodec include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavformat LOCAL_SRC_FILES := libavformat/libavformat.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libavformat include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavutil LOCAL_SRC_FILES := libavutil/libavutil.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libavutil include $(PREBUILT_SHARED_LIBRARY) ``` 6. 在您的“jni”文件夹创建名为“Application.mk”的文件,并将以下内容添加到该文件: ``` APP_ABI := all ``` 7. 打开终端并导航到您的“jni”文件夹。 8. 在终端,运行以下命令: ``` <path to ndk>/ndk-build ``` 9. 将生成的库文件复制到您的Android Studio项目的“libs”文件夹。 10. 在您的Android Studio项目,添加以下代码: ``` static { System.loadLibrary("avcodec"); System.loadLibrary("avformat"); System.loadLibrary("avutil"); } ``` 11. 现在,您可以在您的应用程序使用FFmpeg库了。 ### 回答2: 在Android 10集成ffmpeg是一项相对复杂的任务。ffmpeg是一个开源的多媒体框架,用于处理音频和视频的编码、解码、转换等操作。以下是将ffmpeg集成到Android 10的步骤: 1.下载和配置NDK:首先,需要下载最新版本的Android NDK,并设置NDK环境变量。 2.创建Android项目:在Android Studio创建一个新的Android项目,并选择合适的minSdkVersion和targetSdkVersion,以确保与Android 10兼容。 3.下载ffmpeg源码:从ffmpeg官方网站下载最新的源码,并解压到合适的位置。 4.配置build.gradle文件:在项目的build.gradle文件添加适当的配置,包括NDK版本和支持的ABI(Application Binary Interface)。 5.编写JNI代码:创建一个JNI(Java Native Interface)文件,并编写C/C++代码来调用ffmpeg库函数。在JNI代码,可以定义各种音视频处理操作,如编码、解码、剪辑等。 6.编译和构建:使用ndk-build或CMake来编译JNI代码,并生成包含ffmpeg库的.so文件。 7.集成到Android项目:将生成的.so文件复制到项目的jniLibs目录下,并在AndroidManifest.xml文件声明使用的权限和使用的ffmpeg库文件。 8.在Java代码调用JNI接口:通过Java代码调用JNI接口,实现对ffmpeg函数的调用。可以使用ffmpeg提供的命令行选项,或者在JNI代码使用ffmpeg库的特定函数。 9.测试和调试:在Android模拟器或真机上运行项目,测试集成的ffmpeg功能。根据需要,在调试过程修复代码错误和逻辑问题。 10.构建APK并发布:完成测试后,使用Android Studio或其他打包工具构建APK文件,并发布到Google Play商店或其他渠道。 总之,将ffmpeg集成到Android 10需要在NDK环境配置项目、编写JNI接口代码、构建,并在项目使用JNI接口实现相应的功能。这是一个需要一定开发经验和技术知识的任务,但一旦成功集成,就可以在Android设备上进行各种音视频处理操作。 ### 回答3: 在Android 10集成FFmpeg的过程需要经过以下几个步骤: 1. 下载FFmpeg源代码:在FFmpeg官方网站上下载最新版本的FFmpeg源代码,解压到本地计算机上。 2. 配置NDK环境:安装Android NDK并配置环境变量,以便在命令行运行NDK命令。 3. 创建Android Studio项目:在Android Studio创建一个新的Android项目,并将FFmpeg源代码的目录复制到项目的jni目录下。 4. 创建编译脚本:在jni目录下创建一个名为"Android.mk"的文件,编写FFmpeg的编译脚本,指定需要编译的文件和库的路径。 5. 编译FFmpeg库:打开命令行,进入项目的jni目录,并运行"ndk-build"命令,编译FFmpeg库。这一步可能需要较长时间,具体时间取决于计算机性能和FFmpeg源代码的大小。 6. 导入FFmpeg库:编译完成后,在Android Studio的项目的"build.gradle"文件添加对FFmpeg库的引用,以便在代码使用。 7. 在代码使用FFmpeg:通过调用FFmpeg库的API,可以在Android应用程序执行各种音视频处理操作,如解码、编码、剪切、拼接等。 通过以上步骤,就可以将FFmpeg集成到Android 10。请注意,集成FFmpeg可能涉及到一些特定的编译配置和依赖项,具体操作可能因项目需求而异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值