序
- Android 如何开发自己的SDK
- 样品工具库:kirikaTowa/AndroidUtils: Common tool library (github.com)
- 参考工具库:Blankj/AndroidUtilCode: Android developers should collect the following utils(updating)
一、基本介绍
混淆与加固不在样品工具库中,实际项目中用了
- 混淆和加固不冲突;
- 混淆用于让apk被反编译后获取的代码难理解,并进行一定的代码优化;
- 加固用于让apk难于被反编;
2、反编译:APK反编译
- jd-gui需要java8的运行环境
- dex2jar 报错not support version,升级版本
- github最新地址:Release v2.4 · pxb1988/dex2jar (github.com)
- 加固后就只能看到一点点无用信息(ps:混淆后左边能看见一大溜跟麻花一样,然后一堆abcd)
- 补充文章:
- Android 逆向入门保姆级教程
- 签名配置:一篇图文详解搞定android项目配置签名文件的完整流程
- 选择打包位置:打包apk遇到The destination folder does not exist or is not writeable
- 常见包位置:/app/build/outputs/apk
二、混淆 缩减、混淆处理和优化应用 |Android Developers
一、 简单说明
1、 做了什么:ProGuard 在 Android 上的使用姿势
2、 语法:Android混淆——了解这些就够了
- 配置及使用@Keep:Android混淆快速配置之@Keep
2、 还原:Android使用mapping文件还原混淆代码
二、混淆实践
1、验证
打开打包aar的assemble
- 混淆前
2. 混淆后,此时引用类就会出问题,找不到
- 配置混淆规则后,保证不被混淆就正常了
三、常见配置: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 混淆实战
- 基本使用
- 代码优化精简内容
- app->build->outputs->mapping文件
- 混淆语法
- keep * :保持该包和该包下的类、和静态内部类的类名保持,对字段和方法不额外起作用,子包不起作用,字段或者方法没有被调用则直接忽略;
- keep ** :和keep * 功能类似,但是包括子包;
- keep ** {*;} :作用范围特别大,能够保持该包及其子包、子类和其字段方法都不被混淆,相对来讲我们需要慎用这样的语句,因为可能导致混淆不够精准。
- 其他对单个类名,具体方法字段的keep可见文章;
三、 组件化与统一配置管理依赖:
- 配置 config.gradle
- 关于consumer-rules.pro:**
consumerProguardFiles在各个组件模块中配置各自的混淆规则,因这种方式配置的混淆规则最终都会追加到app模块的混淆规则中,并最终统一混淆*,第三方,公共lib混淆可以放这里。
3、 不能混淆的内容Android代码混淆配置说明_android protobuf不混淆_mayundoyouknow的博客-CSDN博客
这里换成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
5、关于配置说明
- 不加这句对应的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样例
- 通过@Parcelize构造方法序列化【用Kotlin的Parcelize】
@Parcelize
data class Music(
@SerializedName("music_id") //可以对应Json的字段
var musicId: Int = 0,
@SerializedName("artist")
var title: String = ""
) : Parcelable
- 这种写法并不能生效,实现Parcelable只能对其构造方法生效
@Parcelize
class Music : Parcelable{
@SerializedName("music_id")
var musicId: Int = 0,
@SerializedName("artist")
var title: String = ""
}
- 样例:只用Serial注解只能对应上接口,并不能实现序列化,老的方法序列化,如果漏掉了几个,该对象那几个漏掉的无法传递都会为null,get方法也是,其他的可以正常传递;
- 普通类重写get方法
var itemType = 0
get() = if (field > 0) field else 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
1、 入门简版:Gradle打马甲包
- 配置productFlavors(配置风味)、sourceSets(配置对应风味的资源)
2、 进阶配置:sourceSets——安卓gradle
3、变体的问题,原因暂时还不明:Android Studio 每次修改xml后,都要rebuild project才生效_安卓 必须rebuild_岳锋的博客
px:也是单纯的创建一个文件夹名字就是带.的 FileUtils.createOrExistsDir(filesDir.absoluteFile.toString() + "/voiceAnnouncements/test.wav")
4、关于输出包名配置
六、多语言工具切换
1、 MoreLocale2工具
- 指令(PS:小米要开USB调试,安全测试,需sim卡 不然会报错)
adb shell pm grant jp.co.c_lis.ccl.morelocale android.permission.CHANGE_CONFIGURATION
2、参考文章一:
- 工具类可以主用Blankj的,其他的可以参考建立对应的value和String
- 安卓多语言适配心得——附工具类_android 多语言-CSDN博客
- 资源引入方式,工具类
- resConfigs:限制打包内容,有些语言暂时用不到可以使用这个限制
3、参考文章二:Android国际化多语言切换
- 清单文件配置语言偏好localeConfig:试了下,去掉问题也不大,最好加上吧,明确点有哪些语言;
- WebView适配;
七、小部件
- 使用参考:Android Widget的使用和需要注意的问题 - 简书
- 纯UI部件:Android 12桌面小组件
- 细节说明与更新:【APP Widget】Android小部件开发
- Service跟新:
其他补充
1、Retrofit+Gson+Rxjava改返回值是不太容易的,因为他们内部自动处理了;不过使用Gson直接把Json转成对象的话要方便的多(测转换error)
2、 AndroidStudio运行release包无日志输出的问题_android release 不显示log_fanwei4751的博客-CSDN博客
- release需要配置,系统Log才能输出
- 打开debuggable还能支持测断点:调试应用 | Android Studio | Android Developers (google.cn)
3、隐私政策生成地址:App Privacy Policy Generator (app-privacy-policy-generator.firebaseapp.com)
4、AndroidStudio生成aar包和如何使用aar包
5、使用All指定解决依赖重复问题
- Program type already present: com.google.gson.FieldNamingPolicy
- Android引包出现Duplicate class com.xxx.xxx found in modules错误
- Android-如何exclude aar包中的某个jar包_implementation exclude
- 查看与打印依赖树:Android三方依赖冲突及Gradle的exclude使用
- 支持传一个View
7、变体缺陷
- 打变体 appname一般不能加到打出的fileName中
- 报错比较难找,可能会报在build里,无变体报的还是比较正常的;