写点什么

Android 热更新

用户头像
Android架构
关注
发布于: 17 小时前

2.集成 SDK




gradle 这个配置


在 app module 的“build.gradle”文件中添加(示例配置):


android {


defaultConfig {


ndk {


//设置支持的 SO 库架构


abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64'


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


, 'arm64-v8a'


}


}


}


dependencies {


compile "com.android.support:multidex:1.0.1" // 多 dex 配置


//注释掉原有 bugly 的仓库


//compile 'com.tencent.bugly:crashreport:latest.release'//其中 latest.release 指代最新版本号,也可以指定明确的版本号,例如 1.3.4


compile 'com.tencent.bugly:crashreport_upgrade:1.3.5'


// 指定 tinker 依赖版本(注:应用升级 1.3.5 版本起,不再内置 tinker)


compile 'com.tencent.tinker:tinker-android-lib:1.9.6'


compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中 latest.release 指代最新版本号,也可以指定明确的版本号,例如 2.2.0


}


后续更新升级 SDK 时,只需变更配置脚本中的版本号即可。


在 app module 的“build.gradle”文件中添加:


// 依赖插件脚本


apply from: 'tinker-support.gradle'


修补匠-support.gradle 内容如下所示:


apply plugin: 'com.tencent.bugly.tinker-support'


def bakPath = file("${buildDir}/bakApk/")


/**


  • 此处填写每次构建生成的基准包目录


*/


def baseApkDir = "app-0208-15-10-00"


/**


  • 对于插件各参数的详细解析请参考


*/


tinkerSupport {


// 开启 tinker-support 插件,默认值 true


enable = true


// 指定归档目录,默认值当前 module 的子目录 tinker


autoBackupApkDir = "${bakPath}"


// 是否启用覆盖 tinkerPatch 配置功能,默认值 false


// 开启后 tinkerPatch 配置不生效,即无需添加 tinkerPatch


overrideTinkerPatchConfiguration = true


// 编译补丁包时,必需指定基线版本的 apk,默认值为空


// 如果为空,则表示不是进行补丁包的编译


// @{link tinkerPatch.oldApk }


baseApk = "{baseApkDir}/app-release.apk"


// 对应 tinker 插件 applyMapping


baseApkProguardMapping = "{baseApkDir}/app-release-mapping.txt"


// 对应 tinker 插件 applyResourceMapping


baseApkResourceMapping = "{baseApkDir}/app-release-R.txt"


// 构建基准包和补丁包都要指定不同的 tinkerId,并且必须保证唯一性


tinkerId = "base-1.0.1"


// 构建多渠道补丁时使用


// buildAllFlavorsDir = "{baseApkDir}"


// 是否启用加固模式,默认为 false.(tinker-spport 1.0.7 起支持)


// isProtectedApp = true


// 是否开启反射 Application 模式


enableProxyApplication = false


// 是否支持新增非 export 的 Activity(注意:设置为 true 才能修改 AndroidManifest 文件)


supportHotplugComponent = true


}


/**


  • 一般来说,我们无需对下面的参数做任何的修改

  • 对于各参数的详细介绍请参考:

  • https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97


*/


tinkerPatch {


//oldApk ="{appName}/app-release.apk"


ignoreWarning = false


useSign = true


dex {


dexMode = "jar"


pattern = ["classes*.dex"]


loader = []


}


lib {


pattern = ["lib//.so"]


}


res {


pattern = ["res/", "r/", "assets/*", "resources.arsc", "AndroidManifest.xml"]


ignoreChange = []


largeModSize = 100


}


packageConfig {


}


sevenZip {


zipArtifact = "com.tencent.mm:SevenZip:1.1.10"


// path = "/usr/local/bin/7za"


}


buildConfig {


keepDexApply = false


//tinkerId = "1.0.1-base"


//applyMapping = "{appName}/app-release-mapping.txt" // 可选,设置 mapping 文件,建议保持旧 apk 的 proguard 混淆方式


//applyResourceMapping = "{appName}/app-release-R.txt" // 可选,设置 R.txt 文件,通过旧 apk 文件保持 ResId 的分配


}


}


3.初始化 SDK




enableProxyApplication = false 的情况


集成 Bugly 升级 SDK 之后,我们需要按照以下方式自定义 ApplicationLike 来实现的应用的代码(以下是示例):


自定义应用程序


public class SampleApplication extends TinkerApplication {


public SampleApplication() {


super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",


"com.tencent.tinker.loader.TinkerLoader", false);


}


}


参数 1:tinkerFlags 表示 Tinker 支持的类型 dex only,仅库或所有 suuport,默认:TINKER_ENABLE_ALL


参数 2:delegateClassName Application 代理类这里填写你自定义的 ApplicationLike


参数 3:loaderClassName Tinker 的加载器,使用默认即可


参数 4:tinkerLoadVerifyFlag 加载 dex 或者 lib 是否验证 md5,默认为 false


需要一个应用配置为继承 TinkerApplication 的类:



自定义 ApplicationLike:


public class SampleApplicationLike extends DefaultApplicationLike {


public static final String TAG = "Tinker.SampleApplicationLike";


public SampleApplicationLike(Application application, int tinkerFlags,


boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime,


long applicationStartMillisTime, Intent tinkerResultIntent) {


super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);


}


@Override


public void onCreate() {


super.onCreate();


// 这里实现 SDK 初始化,appId 替换成你的在 Bugly 平台申请的 appId


// 调试时,将第三个参数改为 true


Bugly.init(getApplication(), "900029763", false);


}


@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)


@Override


public void onBaseContextAttached(Context base) {


super.onBaseContextAttached(base);


// you must install multiDex whatever tinker is installed!


MultiDex.install(base);


// 安装 tinker


// TinkerManager.installTinker(this); 替换成下面 Bugly 提供的方法


Beta.installTinker(this);


}


@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)


public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {


getApplication().registerActivityLifecycleCallbacks(callbacks);


}


}


enableProxyApplication = true 的情况:


public class MyApplication extends Application {


@Override


public void onCreate() {


super.onCreate();


// 这里实现 SDK 初始化,appId 替换成你的在 Bugly 平台申请的 appId


// 调试时,将第三个参数改为 true


Bugly.init(this, "900029763", false);


}


@Override


protected void attachBaseContext(Context base) {


super.attachBaseContext(base);


// you must install multiDex whatever tinker is installed!


MultiDex.install(base);


// 安装 tinker


Beta.installTinker();


}


}


4.Androidmanifest.xml 配置




在 AndroidMainfest.xml 中进行以下配置:


  1. 权限配置


<uses-permission android:name="android.permission.READ_PHONE_STATE" />


<uses-permission android:name="android.permission.INTERNET" />


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


<uses-permission android:name="android.permission.READ_LOGS" />


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


  1. 活动配置


<activity


android:name="com.tencent.bugly.beta.ui.BetaActivity"


android:configChanges="keyboardHidden|orientation|screenSize|locale"


android:theme="@android:style/Theme.Translucent" />


  1. 配置 FileProvider


<provider


android:name="android.support.v4.content.FileProvider"


android:authorities="${applicationId}.fileProvider"


android:exported="false"


android:grantUriPermissions="true">


<meta-data


android:name="android.support.FILE_PROVIDER_PATHS"


android:resource="@xml/provider_paths"/>


</provider>


如果你使用的第三方库也配置了同样的 FileProvider,可以通过继承 FileProvider 类来解决合并冲突的问题,示例如下:


<provider


android:name=".utils.BuglyFileProvider"


android:authorities="${applicationId}.fileProvider"


android:exported="false"


android:grantUriPermissions="true"


tools:replace="name,authorities,exported,grantUriPermissions">


<meta-data


android:name="android.support.FILE_PROVIDER_PATHS"


android:resource="@xml/provider_paths"


tools:replace="name,resource"/>


</provider>


这里要注意一下,FileProvider 类是在支持-V4 包中的,检查你的工程是否引入该类库。


在资源目录新建 XML 文件夹,创建 provider_paths.xml 文件如下:


<?xml version="1.0" encoding="utf-8"?>


<paths xmlns:android="http://schemas.android.com/apk/res/android">


<external-path name="beta_external_path" path="Download/"/>


<external-path name="beta_external_files_path" path="Android/data/"/>


</paths>


5.混淆配置




为了避免混淆 SDK,在 Proguard 的混淆文件中增加以下配置:


-dontwarn com.tencent.bugly.**


-keep public class com.tencent.bugly.**{*;}

tinker 混淆规则

-dontwarn com.tencent.tinker.**


-keep class com.tencent.tinker.** { *; }

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android热更新