├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── .gitignore ├── LICENSE ├── README.md ├── README2.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── aliyun │ │ └── ams │ │ └── httpdns │ │ └── demo │ │ ├── HttpDnsActivity.java │ │ ├── HttpDnsHolder.java │ │ ├── MyApp.java │ │ ├── NetworkRequest.java │ │ ├── SDNSActivity.java │ │ ├── WebViewActivity.java │ │ ├── base │ │ └── BaseActivity.java │ │ ├── http │ │ └── HttpUrlConnectionRequest.java │ │ ├── okhttp │ │ └── OkHttpRequest.java │ │ └── utils │ │ ├── SpUtil.java │ │ ├── ThreadUtil.java │ │ └── Util.java │ └── res │ ├── drawable │ └── aliyun_bg.9.png │ ├── layout │ ├── activity_base.xml │ ├── activity_webview.xml │ ├── item_autocomplete_button.xml │ ├── item_autocomplete_edittext_button.xml │ ├── item_edit_button.xml │ ├── item_edit_edit_button.xml │ ├── item_four_button.xml │ ├── item_one_button.xml │ ├── item_three_button.xml │ └── item_two_button.xml │ ├── mipmap-hdpi │ ├── back.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── network_security_config.xml ├── build.gradle ├── demo ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── alibaba │ │ └── ams │ │ └── emas │ │ └── demo │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── alibaba │ │ │ └── ams │ │ │ └── emas │ │ │ └── demo │ │ │ ├── BatchResolveCacheHolder.kt │ │ │ ├── HttpDnsApplication.kt │ │ │ ├── HttpDnsServiceHolder.kt │ │ │ ├── MainActivity.kt │ │ │ ├── PreResolveCacheHolder.kt │ │ │ ├── SingleLiveData.kt │ │ │ ├── TtlCacheHolder.kt │ │ │ ├── Util.kt │ │ │ ├── constant │ │ │ └── Constant.kt │ │ │ ├── net │ │ │ ├── HttpURLConnectionRequest.kt │ │ │ ├── IRequest.kt │ │ │ ├── OkHttpClientSingleton.kt │ │ │ ├── OkHttpRequest.kt │ │ │ └── TLSSNISocketFactory.kt │ │ │ ├── ui │ │ │ ├── basic │ │ │ │ ├── BasicSettingFragment.kt │ │ │ │ ├── BasicSettingViewModel.kt │ │ │ │ └── IBasicShowDialog.kt │ │ │ ├── info │ │ │ │ ├── InfoFragment.kt │ │ │ │ ├── InfoViewModel.kt │ │ │ │ ├── SdnsGlobalSettingActivity.kt │ │ │ │ └── list │ │ │ │ │ ├── ListActivity.kt │ │ │ │ │ ├── ListAdapter.kt │ │ │ │ │ ├── ListItem.kt │ │ │ │ │ ├── ListItemType.kt │ │ │ │ │ └── ListViewModel.kt │ │ │ ├── practice │ │ │ │ ├── BestPracticeFragment.kt │ │ │ │ ├── BestPracticeViewModel.kt │ │ │ │ ├── HttpDnsWebviewGetActivity.kt │ │ │ │ ├── IBestPracticeShowDialog.kt │ │ │ │ └── SNISocketFactory.kt │ │ │ └── resolve │ │ │ │ ├── IResolveShowDialog.kt │ │ │ │ ├── NetRequestType.kt │ │ │ │ ├── ResolveFragment.kt │ │ │ │ ├── ResolveViewModel.kt │ │ │ │ ├── Response.kt │ │ │ │ └── SchemaType.kt │ │ │ └── widget │ │ │ └── SwipeLayout.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_add.xml │ │ ├── ic_arrow_left.xml │ │ ├── ic_arrow_right.xml │ │ ├── ic_back.xml │ │ ├── ic_dns.xml │ │ ├── ic_home_black_24dp.xml │ │ ├── ic_httpdns.xml │ │ ├── ic_information.xml │ │ └── ic_practice.xml │ │ ├── layout │ │ ├── activity_http_dns_webview.xml │ │ ├── activity_list.xml │ │ ├── activity_main.xml │ │ ├── activity_sdns_global_setting.xml │ │ ├── dialog_input.xml │ │ ├── dialog_input_2.xml │ │ ├── dialog_input_3.xml │ │ ├── fragment_basic_setting.xml │ │ ├── fragment_best_practice.xml │ │ ├── fragment_info.xml │ │ ├── fragment_resolve.xml │ │ └── info_list_item.xml │ │ ├── menu │ │ └── bottom_nav_menu.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── navigation │ │ └── mobile_navigation.xml │ │ ├── values-land │ │ └── dimens.xml │ │ ├── values-night │ │ └── themes.xml │ │ ├── values-w1240dp │ │ └── dimens.xml │ │ ├── values-w600dp │ │ └── dimens.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── themes.xml │ │ └── xml │ │ └── network_security_config.xml │ └── test │ └── java │ └── com │ └── alibaba │ └── ams │ └── emas │ └── demo │ └── ExampleUnitTest.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── httpdns-sdk ├── build.gradle ├── proguard-rules-for-test.pro ├── proguard-rules.pro ├── src │ ├── end2end │ │ └── java │ │ │ └── com │ │ │ └── alibaba │ │ │ └── sdk │ │ │ └── android │ │ │ └── httpdns │ │ │ ├── ApiForTest.java │ │ │ ├── BeforeHttpDnsServiceInit.java │ │ │ ├── HttpDns.java │ │ │ ├── InitManager.java │ │ │ └── impl │ │ │ ├── HttpDnsServiceTestImpl.java │ │ │ └── InstanceCreator.java │ ├── intl │ │ └── java │ │ │ └── com │ │ │ └── alibaba │ │ │ └── sdk │ │ │ └── android │ │ │ └── httpdns │ │ │ ├── HttpDns.java │ │ │ └── impl │ │ │ ├── InstanceCreator.java │ │ │ └── IntlImpl.java │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── alibaba │ │ │ └── sdk │ │ │ └── android │ │ │ └── httpdns │ │ │ ├── CacheTtlChanger.java │ │ │ ├── DegradationFilter.java │ │ │ ├── HTTPDNSResult.java │ │ │ ├── HttpDnsCallback.java │ │ │ ├── HttpDnsService.java │ │ │ ├── HttpDnsSettings.java │ │ │ ├── ILogger.java │ │ │ ├── InitConfig.java │ │ │ ├── NetType.java │ │ │ ├── NotUseHttpDnsFilter.java │ │ │ ├── Region.java │ │ │ ├── RequestIpType.java │ │ │ ├── SyncService.java │ │ │ ├── cache │ │ │ ├── HostRecord.java │ │ │ └── RecordDBHelper.java │ │ │ ├── config │ │ │ ├── ConfigCacheHelper.java │ │ │ ├── RegionServer.java │ │ │ ├── ServerConfig.java │ │ │ ├── SpCacheItem.java │ │ │ └── region │ │ │ │ ├── AmericaRegionServer.java │ │ │ │ ├── DefaultRegionServer.java │ │ │ │ ├── GermanyRegionServer.java │ │ │ │ ├── HongKongRegionServer.java │ │ │ │ ├── RegionServerManager.java │ │ │ │ └── SingaporeRegionServer.java │ │ │ ├── exception │ │ │ └── HttpDnsUncaughtExceptionHandler.java │ │ │ ├── impl │ │ │ ├── ErrorImpl.java │ │ │ ├── HostResolveLocker.java │ │ │ ├── HostResolveRecorder.java │ │ │ ├── HttpDnsConfig.java │ │ │ ├── HttpDnsCreator.java │ │ │ ├── HttpDnsInstanceHolder.java │ │ │ ├── HttpDnsServiceImpl.java │ │ │ └── SignService.java │ │ │ ├── log │ │ │ └── HttpDnsLog.java │ │ │ ├── net │ │ │ ├── HttpDnsNetworkDetector.java │ │ │ └── NetworkStateManager.java │ │ │ ├── ranking │ │ │ ├── IPRankingBean.java │ │ │ ├── IPRankingCallback.java │ │ │ ├── IPRankingService.java │ │ │ └── IPRankingTask.java │ │ │ ├── report │ │ │ ├── ReportConfig.java │ │ │ ├── ReportDispatcher.java │ │ │ ├── ReportManager.java │ │ │ └── ReportUtils.java │ │ │ ├── request │ │ │ ├── AsyncRequestTask.java │ │ │ ├── HttpException.java │ │ │ ├── HttpRequest.java │ │ │ ├── HttpRequestConfig.java │ │ │ ├── HttpRequestFailWatcher.java │ │ │ ├── HttpRequestTask.java │ │ │ ├── HttpRequestWatcher.java │ │ │ ├── HttpRequestWrapper.java │ │ │ ├── RequestCallback.java │ │ │ ├── ResponseParser.java │ │ │ └── RetryHttpRequest.java │ │ │ ├── resolve │ │ │ ├── BatchResolveHostResponse.java │ │ │ ├── BatchResolveHostResponseParser.java │ │ │ ├── BatchResolveHostService.java │ │ │ ├── CategoryController.java │ │ │ ├── HostFilter.java │ │ │ ├── NormalResolveCategory.java │ │ │ ├── ResolveHostCache.java │ │ │ ├── ResolveHostCacheGroup.java │ │ │ ├── ResolveHostCategory.java │ │ │ ├── ResolveHostHelper.java │ │ │ ├── ResolveHostRequestHandler.java │ │ │ ├── ResolveHostResponse.java │ │ │ ├── ResolveHostResultRepo.java │ │ │ ├── ResolveHostService.java │ │ │ ├── ResolveInterpretHostResponseParser.java │ │ │ ├── ShiftServerWatcher.java │ │ │ ├── SniffException.java │ │ │ ├── SniffResolveCategory.java │ │ │ └── StatusControl.java │ │ │ ├── serverip │ │ │ ├── RegionServer.java │ │ │ ├── RegionServerIpData.java │ │ │ ├── RegionServerIpRepo.java │ │ │ ├── RegionServerScheduleService.java │ │ │ ├── ShiftRegionServerWatcher.java │ │ │ ├── UpdateRegionServerLocker.java │ │ │ ├── UpdateRegionServerResponse.java │ │ │ ├── UpdateRegionServerTask.java │ │ │ └── ranking │ │ │ │ ├── RegionServerRankingCallback.java │ │ │ │ ├── RegionServerRankingService.java │ │ │ │ └── RegionServerRankingTask.java │ │ │ ├── track │ │ │ └── SessionTrackMgr.java │ │ │ └── utils │ │ │ ├── CommonUtil.java │ │ │ ├── Constants.java │ │ │ └── ThreadUtil.java │ ├── normal │ │ └── java │ │ │ └── com │ │ │ └── alibaba │ │ │ └── sdk │ │ │ └── android │ │ │ └── httpdns │ │ │ ├── HttpDns.java │ │ │ └── impl │ │ │ ├── InstanceCreator.java │ │ │ └── NormalImpl.java │ └── testEnd2end │ │ └── java │ │ └── com │ │ └── alibaba │ │ └── sdk │ │ └── android │ │ └── httpdns │ │ ├── HttpDnsE2E.java │ │ ├── HttpDnsResultTest.java │ │ ├── InitConfigTest.java │ │ ├── cache │ │ └── RecordDBHelperTest.java │ │ ├── impl │ │ ├── HostResolveRecorderTest.java │ │ ├── HttpDnsConfigTest.java │ │ ├── HttpDnsInstanceHolderTest.java │ │ └── SignServiceTest.java │ │ ├── log │ │ └── HttpdnsLogTest.java │ │ ├── probe │ │ └── IPRankingTaskTest.java │ │ ├── request │ │ ├── HttpExceptionTest.java │ │ ├── HttpRequestTest.java │ │ ├── HttpRequestWatcherTest.java │ │ ├── HttpRequestWrapperTest.java │ │ └── RetryHttpRequestTest.java │ │ ├── resolve │ │ ├── BaseCategoryTest.java │ │ ├── CategoryControllerTest.java │ │ ├── HostFilterTest.java │ │ ├── NormalCategoryTest.java │ │ ├── ResolveHostResponseTest.java │ │ ├── ResolveHostResultRepoTest.java │ │ ├── ResolveHostResultRepoTest2.java │ │ ├── ShiftServerWatcherTest.java │ │ └── SniffCategoryTest.java │ │ ├── serverip │ │ ├── ServerIpRepoTest.java │ │ ├── UpdateServerLockerTest.java │ │ ├── UpdateServerResponseTest.java │ │ └── UpdateServerTaskTest.java │ │ ├── test │ │ ├── app │ │ │ └── BusinessApp.java │ │ ├── helper │ │ │ └── ServerStatusHelper.java │ │ ├── server │ │ │ ├── BatchResolveHostServer.java │ │ │ ├── DebugApiServer.java │ │ │ ├── HttpDnsServer.java │ │ │ ├── MockSpeedTestServer.java │ │ │ ├── ResolveHostServer.java │ │ │ ├── SecretService.java │ │ │ ├── ServerIpsServer.java │ │ │ └── base │ │ │ │ ├── BaseDataServer.java │ │ │ │ ├── RequestHandler.java │ │ │ │ ├── RequestListener.java │ │ │ │ ├── RequestRecord.java │ │ │ │ ├── SdkBusinessServer.java │ │ │ │ └── ServerApi.java │ │ └── utils │ │ │ ├── CountUpAndDownLatch.java │ │ │ ├── MultiThreadTestHelper.java │ │ │ ├── RandomValue.java │ │ │ ├── ShadowNetworkInfo.java │ │ │ ├── SyncExecutorService.java │ │ │ ├── TestExecutorService.java │ │ │ ├── TestLogger.java │ │ │ └── UnitTestUtil.java │ │ ├── utils │ │ └── CommonUtilTest.java │ │ └── version │ │ ├── V2_3_0.java │ │ ├── V2_3_0_NetType.java │ │ └── V2_3_0_config.java └── version.gradle └── settings.gradle /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Logs** 24 | If applicable, add logcat logs to help explain your problem. 25 | 26 | **Environment (please complete the following information):** 27 | - Device: [e.g. Pixel 3] 28 | - OS: [e.g. Android 10] 29 | - SDK Version [e.g. 2.0.2] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.swp 3 | 4 | 5 | # Gradle 6 | build 7 | .gradle/ 8 | target/ 9 | 10 | # Intellij project files 11 | *.iml 12 | *.ipr 13 | *.iws 14 | .idea/ 15 | 16 | # sonar 17 | .sonar/ 18 | 19 | # Android 20 | local.properties 21 | nohup.out 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Alibaba Cloud 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # httpdns 2 | 3 | 请参考官网文档,了解httpdns功能。[https://help.aliyun.com/product/30100.html?spm=a2c4g.750001.list.154.2d0d7b13T0aYuX](https://help.aliyun.com/product/30100.html?spm=a2c4g.750001.list.154.2d0d7b13T0aYuX) 4 | 5 | ## 注意 6 | 7 | productFlavors中normal是中国大陆版本,intl是国际版本,end2end用于单元测试 8 | 9 | ### 配置初始IP 10 | 请在gradle.properties中配置你所使用账号的初始服务IP,否则无法请求 11 | ```gradle 12 | # 大陆默认配置 13 | # 默认 region 14 | REGION="" 15 | # 默认 初始IP(v4)InputYourInitServerIp 替换为启动IP, 有几个就放几个 16 | INIT_SERVERS={"InputYourInitServerIp", "InputYourInitServerIp", "InputYourInitServerIp"} 17 | # 默认 初始IP(v6)InputYourInitServerIp 替换为启动IP, 有几个就放几个 18 | IPV6_INIT_SERVERS={"InputYourInitServerIp"} 19 | # 国际版默认配置 20 | # 默认 region 21 | INTL_REGION="sg" 22 | # 默认 初始IP(v4)InputYourInitServerIp 替换为启动IP, 有几个就放几个 23 | INTL_INIT_SERVERS={"InputYourInitServerIp", "InputYourInitServerIp", "InputYourInitServerIp"} 24 | # 默认 初始IP(v6)InputYourInitServerIp 替换为启动IP, 有几个就放几个 25 | INTL_IPV6_INIT_SERVERS={"InputYourInitServerIp"} 26 | # 缺省 调度IP v4,在初始IP不可用时,启用。InputYourDefaultUpdateServerIp 替换为兜底调度IP, 有几个就放几个 27 | INTL_UPDATE_SERVERS={"InputYourDefaultUpdateServerIp"} 28 | # 缺省 调度IP v6,在初始IP不可用时,启用。InputYourDefaultUpdateServerIp 替换为兜底调度IP, 有几个就放几个 29 | INTL_IPV6_UPDATE_SERVERS={"InputYourDefaultUpdateServerIp"} 30 | ``` 31 | 32 | ### 配置Demo测试账号 33 | 34 | SDK提供了两个Demo,分别是app module和demo module。 35 | 36 | app module是旧版demo,测试时需要在 MyApp.java 中需要配置测试账号 37 | 38 | ```java 39 | private HttpDnsHolder holderA = new HttpDnsHolder("请替换为测试用A实例的accountId", "请替换为测试用A实例的secret"); 40 | private HttpDnsHolder holderB = new HttpDnsHolder("请替换为测试用B实例的accountId", null); 41 | ``` 42 | > 这里两个实例是为了测试实例之间互不影响,体验只用配置一个 43 | 44 | demo module中是全新module,使用Kotlin + MVVM开发,功能更丰富,建议测试时使用新demo进行测试,测试时需要在demo/build.gradle中配置测试账号 45 | 46 | ```groovy 47 | buildConfigField "String", "ACCOUNT_ID", "\"请替换为测试用B实例的accountId\"" 48 | buildConfigField "String", "SECRET_KEY", "\"请替换为测试用A实例的secret\"" 49 | ``` 50 | 51 | ### 运行测试case 52 | 53 | ``` 54 | // unit test 55 | ./gradlew clean :httpdns-sdk:testEnd2endForTestUnitTest 56 | ``` 57 | 58 | ## 感谢 59 | 本项目中Inet64Util工具类 由[Shinelw](https://github.com/Shinelw)贡献支持,感谢。 60 | -------------------------------------------------------------------------------- /README2.md: -------------------------------------------------------------------------------- 1 | ## 背景说明 2 | 3 | httpdns android sdk 是开源项目, 4 | github 地址是 : https://github.com/aliyun/alibabacloud-httpdns-android-sdk 5 | 6 | 同时也在公司内源开源 7 | 地址是 : https://ach.alibaba-inc.com/detail/4098 8 | 仓库地址是 https://code.aone.alibaba-inc.com/alicloud-ams/alicloud-android-sdk-httpdns_for_github 9 | 10 | 由于合规问题,所以外部开源的代码和真正维护的代码是有些区分的,这些区分是通过分支区分的。 11 | 12 | 真正的开发仓库是 https://code.aone.alibaba-inc.com/alicloud-ams/alicloud-android-sdk-httpdns_for_open_source 13 | 14 | 而最初的开发仓库 https://code.aone.alibaba-inc.com/alicloud-ams/alicloud-android-sdk-httpdns 废弃不在使用 15 | 16 | 17 | ## 分支说明 18 | 19 | remote 说明 20 | ``` 21 | aliyun git@gitlab.alibaba-inc.com:alicloud-ams/alicloud-android-sdk-httpdns_for_github.git (fetch) 22 | aliyun git@gitlab.alibaba-inc.com:alicloud-ams/alicloud-android-sdk-httpdns_for_github.git (push) 23 | github git@github.com:aliyun/alibabacloud-httpdns-android-sdk.git (fetch) 24 | github git@github.com:aliyun/alibabacloud-httpdns-android-sdk.git (push) 25 | origin git@gitlab.alibaba-inc.com:alicloud-ams/alicloud-android-sdk-httpdns_for_open_source.git (fetch) 26 | origin git@gitlab.alibaba-inc.com:alicloud-ams/alicloud-android-sdk-httpdns_for_open_source.git (push) 27 | ``` 28 | aliyun 是 内源仓库 29 | github 是 开源仓库 30 | origin 是 开发仓库 31 | 32 | 分支关系是 33 | origin/master <-- origin/develop <-- origin/dev_xxx --> aliyun/master github/master 34 | 35 | 开发过程的分支变化是 36 | origin/dev_xxx 基于 开源代码拉取,push到开发仓库 37 | 开发完成 merge 到 origin/develop分支 提测 38 | 测试完成 origin/develop merge 到 origin/master; origin/dev_xxx merge 到 aliyun/master github/master 开源 39 | 40 | 分支的代码区分是 41 | origin/develop 分支 增加了 打包配置和内部使用的ip配置,而开源的代码没有。 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /libs/alicloud-android-httpdns-*.aar 3 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | compileSdkVersion 30 7 | buildToolsVersion "30.0.2" 8 | defaultConfig { 9 | applicationId "com.aliyun.ams.httpdns.demo2" 10 | minSdkVersion 14 11 | targetSdkVersion 30 12 | versionCode 1 13 | versionName "1.0" 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | } 16 | 17 | 18 | buildTypes { 19 | debug { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | release { 24 | minifyEnabled true 25 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 26 | } 27 | forTest { 28 | // 注意这里的配置,并不是需要编译forTest的app,而是避免httpdns-sdk在AndroidStudio改为end2end运行测试时 BuildVariants报错 29 | initWith release 30 | debuggable true 31 | } 32 | } 33 | 34 | variantFilter { variant -> 35 | def names = variant.flavors*.name 36 | def type = variant.buildType.name 37 | // To check for a certain build type, use variant.buildType.name == "" 38 | if ((names.contains("normal") && type.contains("forTest")) 39 | || (names.contains("intl") && type.contains("forTest")) 40 | || (names.contains("end2end") && type.contains("release")) 41 | || (names.contains("end2end") && type.contains("debug")) 42 | ) { 43 | // Gradle ignores any variants that satisfy the conditions above. 44 | setIgnore(true) 45 | } 46 | } 47 | 48 | testOptions { 49 | unitTests { 50 | all { 51 | jvmArgs '-noverify' 52 | systemProperty 'robolectric.logging.enable', true 53 | } 54 | } 55 | } 56 | 57 | flavorDimensions "version" 58 | 59 | productFlavors { 60 | normal { 61 | 62 | } 63 | 64 | intl { 65 | 66 | } 67 | 68 | end2end { 69 | // 注意这里的配置,并不是需要编译end2end的app,而是避免httpdns-sdk在AndroidStudio改为end2end运行测试时 BuildVariants报错 70 | } 71 | } 72 | } 73 | 74 | configurations.all { 75 | resolutionStrategy.cacheChangingModulesFor 0, 'seconds' 76 | } 77 | 78 | dependencies { 79 | 80 | implementation project(':httpdns-sdk') 81 | 82 | implementation("com.squareup.okhttp3:okhttp:3.9.0") 83 | } 84 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/liyazhou/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -dontwarn okhttp3.** 27 | -dontwarn okio.** 28 | -dontwarn com.alibaba.sdk.android.httpdns.test.** 29 | -dontwarn com.alibaba.sdk.android.httpdns.net.HttpDnsNetworkDetector 30 | -keep class com.aliyun.ams.ipdetector.Inet64Util{*;} 31 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/aliyun/ams/httpdns/demo/NetworkRequest.java: -------------------------------------------------------------------------------- 1 | package com.aliyun.ams.httpdns.demo; 2 | 3 | import com.alibaba.sdk.android.httpdns.RequestIpType; 4 | 5 | public interface NetworkRequest { 6 | 7 | /** 8 | * 设置httpdns的配置 9 | */ 10 | void updateHttpDnsConfig(boolean async, RequestIpType requestIpType); 11 | 12 | /** 13 | * get请求 14 | * 15 | * @param url 16 | * @return 17 | */ 18 | String httpGet(String url) throws Exception; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/aliyun/ams/httpdns/demo/utils/SpUtil.java: -------------------------------------------------------------------------------- 1 | package com.aliyun.ams.httpdns.demo.utils; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | public class SpUtil { 7 | 8 | public static void readSp(Context context, String name, OnGetSp onGetSp) { 9 | SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE); 10 | onGetSp.onGetSp(sp); 11 | } 12 | 13 | public static void writeSp(Context context, String name, OnGetSpEditor onGetSpEditor) { 14 | SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE); 15 | SharedPreferences.Editor editor = sp.edit(); 16 | onGetSpEditor.onGetSpEditor(editor); 17 | editor.commit(); 18 | } 19 | 20 | public interface OnGetSp { 21 | void onGetSp(SharedPreferences sp); 22 | } 23 | 24 | public interface OnGetSpEditor { 25 | void onGetSpEditor(SharedPreferences.Editor editor); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/aliyun/ams/httpdns/demo/utils/Util.java: -------------------------------------------------------------------------------- 1 | package com.aliyun.ams.httpdns.demo.utils; 2 | 3 | import com.alibaba.sdk.android.httpdns.HTTPDNSResult; 4 | 5 | import java.lang.reflect.Field; 6 | 7 | public class Util { 8 | /** 9 | * 获取ttl, 10 | * 此方法是用于测试自定义ttl是否生效 11 | */ 12 | public static int getTtl(HTTPDNSResult result) { 13 | try { 14 | Field ttlField = HTTPDNSResult.class.getDeclaredField("ttl"); 15 | ttlField.setAccessible(true); 16 | return ttlField.getInt(result); 17 | } catch (NoSuchFieldException e) { 18 | e.printStackTrace(); 19 | } catch (IllegalAccessException e) { 20 | e.printStackTrace(); 21 | } 22 | return -1; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/aliyun_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aliyun/alibabacloud-httpdns-android-sdk/ae6178378f44e3a60e2425b58711185b71b4707e/app/src/main/res/drawable/aliyun_bg.9.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_base.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | 15 | 16 | 20 | 21 | 28 | 29 | 30 | 31 | 32 | 37 | 38 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_webview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 21 | 22 | 29 | 30 | 40 | 41 | 42 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_autocomplete_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 |