当我们拿到Androd源码后,进行编译和烧写,发现里面有许许多多的内置apk和测试apk,这时就需要对系统里的apk进行精简了。
精简APP时候注意了,要先rm -rf out/target/produtc/xxx/system,然后在编译。这是因为Android在编译后,并不会删除之前到应用,导致我们屏蔽了该应用,但system镜像中还包含该应用的情况。
由于build目录中mk文件包含了要编译哪个应用包,可通过屏蔽相应到应用名达到精简的目的。但有时有多个mk文件都包含了该应用包,所以要去除干净(最好都删),否则屏蔽某一个文件中的包名,另一个文件中起作用了,最终还是会编译出来该应用的。
package目录中包含了常见到应用,如电话,电子邮件,图库等,该目录就是这些常见应用到源码目录,所有要精简某个应用,只需到相应目录下找到对应的Android.mk文件,使用#屏蔽include $(BUILD_PACKAGE)即可,由于该目录下通常还有一个tests目录,只需用相同的方法将tests目录中Android.mk屏蔽即可。
当然,对应高通的源码来说,还有很多测试App是在vendor这个目录下的。也是用同样到方法屏蔽Androd.mk即可。
对应常见的apk还是挺容易精简的,但有时会遇到某个apk找不到包名的困扰。这时只需adb logcat一下,然后打开应用,这时adb logcat会打印相应的包名,然后在终端上 adb shell cat /data/system/packages.xml|egrep “包名关键字”,就可以找到该apk的名字了,然后使用grep -rin "xxx" *到上述的三个路径中去找。例如
1 adb logcat
I/ActivityManager( 924): Displayed com.estrongs.android.pop/.view.FileExplorerActivity: +384ms
I/Timeline( 924): Timeline: Activity_windows_visible id: ActivityRecord{17d7da72 u0 com.estrongs.android.pop/.view.FileExplorerActivity t22} time:532190
2 adb root
3 adb shell cat /data/system/packages.xml|egrep com.estrongs.android.pop
<package name="com.estrongs.android.pop" codePath="/data/app/com.estrongs.android.pop-1" nativeLibraryPath="/data/app/com.estrongs.android.pop-1/lib" primaryCpuAbi="armeabi" flags="4767300" ft="376b8" it="37bb1" ut="37bb1" version="226" userId="10075" installer="/xxx/xxx/ESwenjianliulanqi_325.apk">
/xxx/xxx/就是该app安装的路径了。
当然,还可借用Exclipse这个软件,打开应用,然后kill某个应用,如果起作用了,就是这个包名了。
当然,在进行精简之前,最好将out/target/produtc/xxx/system/app和out/target/produtc/xxx/system/pri_app这两个目录保留一下,以后的开发中用的着。比如看看某个原生应用是怎样的,还原误删的应用等。