ubuntu 下 使用android 源码编译生成apk实现静默安装

来源:互联网 发布:淘宝网店运营策划案 编辑:程序博客网 时间:2024/05/20 22:26

转:http://blog.csdn.net/sdvch/article/details/16832629

http://blog.csdn.net/dzy_mails/article/details/51909112

http://blog.csdn.net/mwq384807683/article/details/71512505

http://blog.csdn.net/xiaowan0404/article/details/52166969


编译生成apk大体步骤

1.源码目录新建文件夹,放你的项目

2.在源码目录配置编译环境
source build/envsetup.sh

3.lunch
选择自己用的开发板

4.进入你要编译项目的目录:mm

5.编译成功后会提示apk存放的路径


静默安装代码

1、首先必须实现一个观察者的类,来监听apk安装成功或者失败,所以我们先写一个类去继承IPackageInstallObserver.Stub,
              由于IPackageInstallObserver.Stub不是开放api,所以我们自己必须在改类前面加import Android.content.pm.IPackageInstallObserver;
             具体代码如下: 

class PackageInstallObserver extends IPackageInstallObserver.Stub {          public void packageInstalled(String packageName, int returnCode) {              // 该方法里面可以根据returnCode的值判断apk安装成功或者失败              // 1表示成功 0表示失败              if (returnCode == 1) {                  Log.e(TAG, packageName + " install Success");              } else {                  Log.e(TAG, packageName + "install fail ");              }          }      }  

 2、现在就来看看静默安装的方法了
              其中方法中的参数packageName是你需要安装的应用apk的包名 , path表示apk在本地所在的路径

...import android.content.pm.IPackageInstallObserver;import android.content.pm.IPackageManager;....public void SilentInstall(String packageName, String path) {          Uri uri = Uri.fromFile(new File(path));          int installFlags = 0;          PackageManager pm = getPackageManager();          try {              PackageInfo packageInfo = pm.getPackageInfo(packageName,                      PackageManager.GET_UNINSTALLED_PACKAGES);              if (packageInfo != null) {                  installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;              }          } catch (NameNotFoundException e) {              Log.e(TAG, "NameNotFoundException = " + e.getMessage());          }          PackageInstallObserver observer = new PackageInstallObserver(); // PackageInstallObserver                                                                          // 就是1中实现的观察者类          pm.installPackage(uri, observer, installFlags, packageName);  }

以上源码在android studio 上运行不了,要掉进源码目录下编译生成apk


 好了,上面2个步骤做好了后在AndroidMainfest.xml加上安装包的权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />  
编写Android.mk

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := InstallActivityLOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE)



Android.mk引用第三方jar,aar文件

http://blog.csdn.net/xiaowan0404/article/details/52166969
http://blog.csdn.net/dzy_mails/article/details/51909112


android studio编写的app,Android.mk放在app/src/main目录下,在该目录下新建libs目录,用于存放第三方jar包和aar文件,


查看app/src/main目录下的build.gradle文件,在这个文件中会写明在开发中引用了哪些包,如果不是android源码中带有的(如android-support-v4,android-support-v7-xxx等),那么要去android studio的安装目录下找到这些jar包,放到app/src/main/libs/目录下(没有就自己创建一个)


android studio 查看第三方jar 目录



编写Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)  (经典开头两句)LOCAL_PACKAGE_NAME := xxx(apk的名字,如果这个值写的是Test,那么编译出来的就是Test.apk)LOCAL_CERTIFICATE := platform (系统签名)LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/ressrc_dirs := java/LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))##声明使用的java文件和资源文件地址,如果使用到aidl,需要特别声明,常见写法如下#LOCAL_SRC_FILES += \# src/xx/xx/xx/aidl/XxxOne.aidl \# src/xx/xx/xx//aidl/XxxTwo.aidlLOCAL_MULTILIB := 32(添加这句是为了防止在编译后使用apk时,提示so是32位而不是64位导致应用fc)LOCAL_PREBUILT_JNI_LIBS_x86 := jniLibs/x86/libxxx.soLOCAL_PROGUARD_ENABLED := disabled (添加这句是为了防止在编译后使用apk时,提示找不到so库中对应的方法导致fc)#如果使用了jni就要这么写LOCAL_STATIC_JAVA_LIBRARIES +=  design \                                android-support-v4 \                                android-support-v7-appcompat \                                android-support-v7-recyclerview \                                recyclerview-v7 \                                itextpdf(第三方包名)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \            itextpdf:libs/itextpdf-5.5.9.jar#第三方包需要通过LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES声明LOCAL_PROGUARD_FLAG_FILES := proguard.flags ##在编译时如果提示包中有warning时,需要按照要求在文件中写dontwarn,proguard.flags需要自行创建,android studio不会创建这个文件


Android.mk 

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_PACKAGE_NAME := edlgame1LOCAL_CERTIFICATE := platform#如果使用的系统的包,需要引入他们使用的资源文件,否则会提示编译资源找不到的错误LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/resLOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/resLOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/resLOCAL_RESOURCE_DIR += frameworks/support/design/resLOCAL_RESOURCE_DIR += $(LOCAL_PATH)/ressrc_dirs := java/LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))#程序包之间最好不要有空格,有空格执行mm可能有错LOCAL_STATIC_JAVA_LIBRARIES += \android-support-design \android-support-v4 \android-support-v7-appcompat \android-support-v7-recyclerview \#第三方jar包名字,名字随便取greendao \greendao-api \glide \okhttp \okio \okhttputils \gson \recyclerviewheader#第三方aar(viewpager)文件别名,名字随便取#LOCAL_STATIC_JAVA_AAR_LIBRARIES:= viewpagerLOCAL_AAPT_FLAGS := --auto-add-overlayLOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompatLOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayoutLOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepickerLOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerviewLOCAL_AAPT_FLAGS += --extra-packages android.support.design#LOCAL_AAPT_FLAGS += --extra-packages com.xyzlf.autoplay.viewpagerLOCAL_PROGUARD_ENABLED := disabledinclude $(BUILD_PACKAGE)include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \greendao:libs/greendao-3.2.0.jar \greendao-api:libs/greendao-api-3.2.0.jar \glide:libs/glide-3.5.2.jar \okhttp:libs/okhttp-3.4.1.jar \okio:libs/okio-1.9.0.jar \okhttputils:libs/okhttputils-2.6.2.jar \gson:libs/gson-2.3.1.jar \recyclerviewheader:libs/recyclerviewheader-1.2.0.jar #viewpager:libs/viewpager-0.0.3.aar#第三方包需要通过LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES声明include $(BUILD_MULTI_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))

这里主要是LOCAL_STATIC_JAVA_AAR_LIBRARIES,剩下的和jar包大同小异,注意在manifest文件里minSdkVersion要满足aar文件的要求

使用greenDao  先在android studio 上Build->make Project,再把代码复制到源码目录下编译


error: Error: This attribute must be localized. (at 'text' with value '更新任务').
http://blog.csdn.net/qinyun188/article/details/7466973

编译目录结构(即 android studio 的app/src/main目录 )



libs目录



AndroidManifest.xml 配置版本号版本名,并声明为系统应用

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.xx.xx"    android:sharedUserId="android.uid.system"    android:versionCode="13"    android:versionName="13.0"    >。。。。。。</manifest>