【工具类】封装自己的SDK & 混淆 & 模块化 & 反编译 & 多语言 & 序列化&小部件&变体&签名&debug

740 阅读6分钟

  1. Android 如何开发自己的SDK
  2. 样品工具库:kirikaTowa/AndroidUtils: Common tool library (github.com)
  3. 参考工具库:Blankj/AndroidUtilCode: Android developers should collect the following utils(updating)

一、基本介绍

混淆与加固不在样品工具库中,实际项目中用了

1、 浅谈Android 混淆和加固

  • 混淆和加固不冲突;
  • 混淆用于让apk被反编译后获取的代码难理解,并进行一定的代码优化;
  • 加固用于让apk难于被反编;

2、反编译:APK反编译

  • jd-gui需要java8的运行环境
  1. dex2jar 报错not support version,升级版本
  1. 加固后就只能看到一点点无用信息(ps:混淆后左边能看见一大溜跟麻花一样,然后一堆abcd)

image.png

  1. 补充文章:

二、混淆 缩减、混淆处理和优化应用  |Android Developers

一、 简单说明

1、 做了什么:ProGuard 在 Android 上的使用姿势

2、 语法:Android混淆——了解这些就够了

  1. 配置及使用@Keep:Android混淆快速配置之@Keep

2、 还原:Android使用mapping文件还原混淆代码

二、混淆实践

1、验证

打开打包aar的assemble image.png

  1. 混淆前

image.png 2. 混淆后,此时引用类就会出问题,找不到

image.png

  1. 配置混淆规则后,保证不被混淆就正常了

image.png

三、常见配置:proguard-rules

-keep public class com.ywjh.farawaymia.bean** { *; }

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

-dontwarn com.jeremyliao.liveeventbus.**
-keep class com.jeremyliao.liveeventbus.** { *; }
-keep class androidx.lifecycle.** { *; }
-keep class androidx.arch.core.** { *; }

四、补充文档

1、由浅入深 Android 混淆实战

  1. 基本使用
  2. 代码优化精简内容
  3. app->build->outputs->mapping文件
  4. 混淆语法
  • keep * :保持该包和该包下的类、和静态内部类的类名保持,对字段和方法不额外起作用,子包不起作用,字段或者方法没有被调用则直接忽略;
  • keep ** :和keep * 功能类似,但是包括子包;
  • keep ** {*;} :作用范围特别大,能够保持该包及其子包、子类和其字段方法都不被混淆,相对来讲我们需要慎用这样的语句,因为可能导致混淆不够精准。
  • 其他对单个类名,具体方法字段的keep可见文章;

三、 组件化与统一配置管理依赖:

  • 配置 config.gradle

1、 Android组件化开发,其实就这么简单

  1. Android 多Module统一配置Gradle,只需三步
  2. implementation、api、compileOnly区别详解

2、 Android代码混淆&组件化和SDK混淆方案

  1. 关于consumer-rules.pro:**consumerProguardFiles在各个组件模块中配置各自的混淆规则,因这种方式配置的混淆规则最终都会追加到app模块的混淆规则中,并最终统一混淆*,第三方,公共lib混淆可以放这里。

3、 不能混淆的内容Android代码混淆配置说明_android protobuf不混淆_mayundoyouknow的博客-CSDN博客

image.png

4、Android studio中导入jar包

  1. 终于理解~Android 模块化里的资源冲突与读取顺序

image.png

这里换成context会内存泄漏: Do not place Android context classes in static fields (static reference to UtilsBridge which has field app pointing to Context); this is a memory leak

image.png

5、关于配置说明

  1. 参考:Android-SigningConfigs打包配置
  • 不加这句对应的debug/release将无法使用signingConfig signingConfigs.release
buildTypes {
    release {
        signingConfig signingConfigs.release
        shrinkResources true // 移出无用的res文件
        minifyEnabled true // 是否需要使用下面的混淆文件进行代码混淆
        zipAlignEnabled true // Zipalign优化
        proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
    }
}

6、序列化bean样例

  1. 通过@Parcelize构造方法序列化【用Kotlin的Parcelize】
@Parcelize
data class Music(
    @SerializedName("music_id") //可以对应Json的字段
    var musicId: Int = 0,
    @SerializedName("artist")
    var title: String = ""
) : Parcelable
  1. 这种写法并不能生效,实现Parcelable只能对其构造方法生效
@Parcelize
 class Music : Parcelable{
    @SerializedName("music_id")
    var musicId: Int = 0,
    @SerializedName("artist")
    var title: String = ""
 }
  • 样例:只用Serial注解只能对应上接口,并不能实现序列化,老的方法序列化,如果漏掉了几个,该对象那几个漏掉的无法传递都会为null,get方法也是,其他的可以正常传递;

image.png

image.png

  1. 普通类重写get方法
	var itemType = 0
        get() = if (field > 0) field else 1
  1. 既想Parcelable序列化,又想重写构造方法
@Parcelize
data class Music(
    @SerializedName("id")
    var id: Int = 0,
    @SerializedName("album")
    var album: Int? = 0

): Parcelable{
    //如果有需要override 的属性不太好序列化就可以写在这里
    @IgnoredOnParcel
     val musicId
        get() = if (id < 0) 0 else id
}

7、 getParcelableExtra方法已过时,Api 33需要处理下;

8、Jenkins:2023自动部署神器——Jenkins全网最全攻略

五、多渠道打包,构建变体 build variants

官方文档:Configure build variants

1、 入门简版:Gradle打马甲包

  1. 配置productFlavors(配置风味)、sourceSets(配置对应风味的资源)

2、 进阶配置:sourceSets——安卓gradle

3、变体的问题,原因暂时还不明:Android Studio 每次修改xml后,都要rebuild project才生效_安卓 必须rebuild_岳锋的博客

px:也是单纯的创建一个文件夹名字就是带.的 FileUtils.createOrExistsDir(filesDir.absoluteFile.toString() + "/voiceAnnouncements/test.wav")

4、关于输出包名配置

六、多语言工具切换

1、 MoreLocale2工具

  1. 指令(PS:小米要开USB调试,安全测试,需sim卡 不然会报错)
adb shell pm grant jp.co.c_lis.ccl.morelocale android.permission.CHANGE_CONFIGURATION

2、参考文章一:

  1. 资源引入方式,工具类
  • resConfigs:限制打包内容,有些语言暂时用不到可以使用这个限制
  1. Android resConfigs配置以及多语言缩写对照表

3、参考文章二:Android国际化多语言切换

  • 清单文件配置语言偏好localeConfig:试了下,去掉问题也不大,最好加上吧,明确点有哪些语言;
  • WebView适配;

七、小部件

其他补充

1、Retrofit+Gson+Rxjava改返回值是不太容易的,因为他们内部自动处理了;不过使用Gson直接把Json转成对象的话要方便的多(测转换error)

2、 AndroidStudio运行release包无日志输出的问题_android release 不显示log_fanwei4751的博客-CSDN博客

  1. release需要配置,系统Log才能输出

3、隐私政策生成地址:App Privacy Policy Generator (app-privacy-policy-generator.firebaseapp.com)

4、AndroidStudio生成aar包和如何使用aar包

5、使用All指定解决依赖重复问题

  1. Program type already present: com.google.gson.FieldNamingPolicy
  2. Android引包出现Duplicate class com.xxx.xxx found in modules错误
  3. Android-如何exclude aar包中的某个jar包_implementation exclude
  4. 查看与打印依赖树:Android三方依赖冲突及Gradle的exclude使用

6、ToastUtils-我愿称之为最强

  1. 支持传一个View

7、变体缺陷

  • 打变体 appname一般不能加到打出的fileName中
  • 报错比较难找,可能会报在build里,无变体报的还是比较正常的;